由于接下来要进行微信开发,所以今天做了一个小功能。
前提:拥有个人订阅号,并成功绑定域名接口
功能概述:用户订阅公众号的时候,像用户推送提示信息,然后用户输入关键词,提供相应功能,这里展示的是从数据库获取到的新闻列表。
关键点是:对于以前在网页上打印出错误信息的模式,现在要改变成在服务器本地建立一个文件,用于调试
完整代码如下
<?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,欢迎订阅周起的公众号.\r\n\r\n *功能菜单如下\r\n\r\n 1.输入 新闻 获取新闻列表"; //将参数按照顺序填充到$textTpl占位符上 $result = sprintf($textTpl,$FromUserName,$ToUserName,$CreateTime,$contentStr); //调试使用日志的形式,将调试信息放到本地文件上 file_put_contents(‘wx.log‘,date("Y-m-d H:i:s")."订阅事件文本发送成功!\r\n",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."\r\n",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")." 事件触发失败!\r\n",8); break; } //打印出结果等待微信服务器获取 echo $result; }else { echo ""; exit; } }}?>
时间: 2024-08-02 06:51:16