由于接下来要进行微信开发,所以今天做了一个小功能。
前提:拥有个人订阅号,并成功绑定域名接口
功能概述:用户订阅公众号的时候,像用户推送提示信息,然后用户输入关键词,提供相应功能,这里展示的是从数据库获取到的新闻列表。
关键点是:对于以前在网页上打印出错误信息的模式,现在要改变成在服务器本地建立一个文件,用于调试
完整代码如下
<?php
//
// 关注/取消关注事件消息
// 微信公众账号关注与取消关注事件消息
//
date_default_timezone_set('PRC');
define("TOKEN", "zhouqi");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
//将微信返回的post数据包变成xml对象
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
//获取公共号标识号
$ToUserName = $postObj->ToUserName;
//获取openid
$FromUserName = $postObj->FromUserName;
//获取用户输入的内容
$Keyword = $postObj->Content;
$CreateTime = time();
switch ($RX_TYPE)
{
case "event":
//订阅类型触发时间
if ($postObj->Event == 'subscribe'){
//文本消息模板
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$contentStr = "welcome,欢迎订阅周起的公众号. *功能菜单如下 1.输入 新闻 获取新闻列表";
//将参数按照顺序填充到$textTpl占位符上
$result = sprintf($textTpl,$FromUserName,$ToUserName,$CreateTime,$contentStr);
//调试使用日志的形式,将调试信息放到本地文件上
file_put_contents('wx.log',date("Y-m-d H:i:s")."订阅事件文本发送成功! ",8);
}
break;
case "text":
if ($Keyword == '新闻'){
//列表图文消息模板
$textHead = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>";
$textBody = "<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>";
$textFooter = "</Articles></xml> ";
//连接数据库
$connect = mysqli_connect('127.0.0.1','root','root','wx');
if(!($connect)){
//打印报错信息
$connect = "数据库连接失败Error:".mysqli_connect_errno().":".mysqli_connect_error();
file_put_contents('wx.log',date("Y-m-d H:i:s").$connect." ",8);
}
//微信规定最多返回10个列表信息
$sql = "SELECT * FROM news ORDER BY id DESC LIMIT 0,10";
$res = mysqli_query($connect,$sql);
$count = mysqli_num_rows($res);
//填充图片列表头部信息
$result = sprintf($textHead,$FromUserName,$ToUserName,$CreateTime,$count);
//填充图片列表主要信息
while ($row = mysqli_fetch_assoc($res)){
$result .= sprintf($textBody,$row['title'],$row['descript'],$row['pic'],$row['url']);
}
//填充图片列表尾部信息
$result .= $textFooter;
}
break;
default:
file_put_contents('wx.log',date("Y-m-d H:i:s")." 事件触发失败! ",8);
break;
}
//打印出结果等待微信服务器获取
echo $result;
}else {
echo "";
exit;
}
}
}
?>