微信公众号开发(二)基础接口

未经认证的订阅号只有基础接口的权限,基础接口主要包括三个部分:接收用户消息、发送被动响应消息和接收事件推送消息,开发者需要对用户消息在5秒内立即做出回应,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

微信公众号能够接收用户发送的6种格式的消息:文本(包括表情)、图片、语音、视频、地理位置、链接。具体格式参见普通消息格式

微信公众号能够回复用户发送的6种类型消息:文本、图片、语音、视频、音乐、图文(单图文和多图文)。具体格式参见被动回复消息格式

基础接口中事件消息只有:关注和取消关注事件。

文件结构如下:

images文件夹用来存放图文消息用到的图片,music文件夹用来存放音乐文件;关于output_log.php、output_query.php和Utils.php这三个文件,请参看微信公众号开发(一)服务器及接口的配置,其主要功能是日志的打印;test.php是点击图文跳转到的链接;index.php用来处理消息。

test.php,这里只输出一个字符串。

<?php
echo "haha";

下面我们直接上index.php的代码,之后将会给出实际效果的截图以及发送数据的结构。

<?php
//设置时区
date_default_timezone_set("Asia/Shanghai");
//定义TOKEN常量,这里的"weixin"就是在公众号里配置的TOKEN
define("TOKEN", "weixin");require_once("Utils.php");
//打印请求的URL查询字符串到query.xml
Utils::traceHttp();$wechatObj = new wechatCallBackapiTest();
/*** 如果有"echostr"字段,说明是一个URL验证请求,* 否则是微信用户发过来的信息*/
if (isset($_GET["echostr"])){$wechatObj->valid();
}else {$wechatObj->responseMsg();
}class wechatCallBackapiTest
{/*** 用于微信公众号里填写的URL的验证,* 如果合格则直接将"echostr"字段原样返回*/public function valid(){$echoStr = $_GET["echostr"];if ($this->checkSignature()){echo $echoStr;exit;}}/*** 用于验证是否是微信服务器发来的消息* @return bool*/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(){//获取post过来的数据,它一个XML格式的数据$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//将数据打印到log.xmlUtils::logger($postStr);if (!empty($postStr)){//将XML数据解析为一个对象$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);//消息类型分离switch($RX_TYPE){case "event": //事件$result = $this->receiveEvent($postObj);break;case "text": //文本$result = $this->receiveText($postObj);break;case "image": //图片$result = $this->receiveImage($postObj);break;case "voice": //语音$result = $this->receiveVoice($postObj);break;case "video": //视频$result = $this->receiveVideo($postObj);break;case "location": //地理位置$result = $this->receiveLocation($postObj);break;case "link": //链接$result = $this->receiveLink($postObj);break;default:$result = "unknow msg type:".$RX_TYPE;break;}//打印输出的数据到log.xmlUtils::logger($result, '公众号');echo $result;}else{echo "";exit;}}/*** 接收文本消息,通过发送指定文本,* 让服务器回复相应类型的信息*/private function receiveText($object){$keyword = trim($object->Content);if (strstr($keyword, "文本")){$content = "这是个文本消息";//回复文本$result = $this->transmitText($object, $content);}else if (strstr($keyword, "单图文")){$content = array();$content[] = array("Title"=>"单图文标题", "Description"=>"单图文内容","PicUrl"=>"http://weiweiyi.duapp.com/images/img1.jpg", "Url"=>"http://weiweiyi.duapp.com/test.php");//回复单图文$result = $this->transmitNews($object, $content);}else if (strstr($keyword, "多图文")){$content = array();$content[] = array("Title"=>"多图文1标题", "Description"=>"多图文1描述","PicUrl"=>"http://weiweiyi.duapp.com/images/img1.jpg", "Url"=>"http://weiweiyi.duapp.com/test.php");$content[] = array("Title"=>"多图文2标题", "Description"=>"多图文2描述","PicUrl"=>"http://weiweiyi.duapp.com/images/img2.jpg", "Url"=>"http://weiweiyi.duapp.com/test.php");$content[] = array("Title"=>"多图文3标题", "Description"=>"多图文3描述","PicUrl"=>"http://weiweiyi.duapp.com/images/img3.jpg", "Url"=>"http://weiweiyi.duapp.com/test.php");//回复多图文$result = $this->transmitNews($object, $content);}else if (strstr($keyword, "音乐")){$content = array("Title"=>"好想你", "Description"=>"歌手:朱主爱","MusicUrl"=>"http://weiweiyi.duapp.com/music/missyou.mp3","HQMusicUrl"=>"http://weiweiyi.duapp.com/music/missyou.mp3");//回复音乐$result = $this->transmitMusic($object, $content);}else {$content = date("Y-m-d", time())."\n".$object->FromUserName."\n-lzc";//回复文本$result = $this->transmitText($object, $content);}return $result;}/*** 接收图片消息,通过MediaId回复相同的图片给用户*/private function receiveImage($object){$content = array("MediaId"=>$object->MediaId);$result = $this->transmitImage($object, $content);return $result;}/** 接收语音消息,通过MediaId回复相同的语音给用户*/private function receiveVoice($object){$content = array("MediaId"=>$object->MediaId);$result = $this->transmitVoice($object, $content);return $result;}/*** 接收视频消息,通过MediaId回复相同的视频给用户,* 这个会失败,好像是腾讯的视频需要经过审核才能发送,* 避免那种***的视频传播*/private function    receiveVideo($object){$content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId,"Title"=>"自拍视频", "Description"=>"一个自拍视频");$result = $this->transmitVideo($object, $content);return $result;}/*** 接收位置消息*/private function receiveLocation($object){$content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;$result = $this->transmitText($object, $content);return $result;}/*** 接收链接消息*/private function receiveLink($object){$content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;$result = $this->transmitText($object, $content);return $result;}/*** 接收事件消息*/private function receiveEvent($object){switch ($object->Event){case "subscribe":  //关注公众号事件$content = "欢迎关注微微一笑很倾城";break;case "unsubscribe":  //取消关注事件,取消后用户就收不到消息了,$content = "";   //所以发送 ""break;default:$content = "";break;}$result = $this->transmitText($object, $content);return $result;}/*** 回复文本消息*/private function transmitText($object, $content){$xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime><![CDATA[%s]]></CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content>
</xml>";$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);return $result;}/*** 回复图文消息*/private function transmitNews($object, $newsArray){if (!is_array($newsArray)){return;}$itemTpl = "<item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url>
</item>";$item_str = "";foreach ($newsArray as $item){$item_str .= sprintf($itemTpl, $item["Title"], $item["Description"],$item["PicUrl"], $item["Url"]);}$xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime><![CDATA[%s]]></CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>%s</ArticleCount><Articles>$item_str</Articles>
</xml>";$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(),count($newsArray));return $result;}/*** 回复音乐消息*/private function transmitMusic($object, $musicArray){$itemTpl = "<Music><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><MusicUrl><![CDATA[%s]]></MusicUrl><HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";$item_str = sprintf($itemTpl, $musicArray["Title"], $musicArray["Description"],$musicArray["MusicUrl"], $musicArray["HQMusicUrl"]);$xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[music]]></MsgType>$item_str;
</xml>";$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());return $result;}/*** 回复图片消息*/private function transmitImage($object, $imageArray){$itemTpl = "<Image><MediaId><![CDATA[%s]]></MediaId>
</Image>";$item_str = sprintf($itemTpl, $imageArray['MediaId']);$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>";$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName,time());return $result;}/*** 回复语音消息*/private function transmitVoice($object, $voiceArray){$itemTpl = "<Voice><MediaId><![CDATA[%s]]></MediaId>
</Voice>";$item_str = sprintf($itemTpl, $voiceArray['MediaId']);$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>";$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());return $result;}/*** 回复视频消息*/private function transmitVideo($object, $videoArray){$itemTpl = "<Video><MediaId><![CDATA[%s]]></MediaId><ThumbMediaId><![CDATA[%s]]></ThumbMediaId><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description>
</Video>";$item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'],$videoArray['Title'], $videoArray['Description']);$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
$item_str
</xml>";$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());return $result;}
}

发送“文本”,服务器回复文本消息

发送图片,服务器这根据MediaId回复相同的图片

发送语音,服务器这根据MediaId回复相同的语音,其中Recognition字段是语音识别结果,需要开通语音识别功能才会有该字段,可在测试号中开通。

发送视频,根据MediaId返回相同视频,可以看到,虽然数据正确返回了,但视频并没有显示出来,推测是视频需要审核才能够发布。

发送地理位置,回复经纬度和地区给用户

发送链接。链接的发送方式是收藏别的公众号的图文消息,然后在该公众号中从收藏中发送链接。

接收音乐消息

接收单图文消息

接收多图文

好了,这就是微信公众号的基础接口的全部消息了,很简单,只要熟悉了相应数据的XML格式就可以 了。

下一章我们将学习微信公众号的高级接口。

相关博客

微信公众号开发(一)服务器及接口的配置

微信公众号开发(二)基础接口

微信公众号开发(三)获取access_token

微信公众号开发(四)自定义菜单

微信公众号开发(五)个性化菜单

微信公众号开发(六)素材管理

微信公众号开发(七)发送客服消息

微信公众号开发(八)用户管理

微信公众号开发(九)群发消息接口

微信公众号开发(十)模板消息

微信公众号开发(十一)生成带参数二维码

微信公众号开发(十二)OAuth2.0网页授权

微信公众号开发(二)基础接口相关推荐

  1. 微信公众号开发之分享接口实现

    微信公众号开发之分享接口实现 第一步:先登录微信公众平台进行设置JS接口安全域名("域名不能包含http://"). 如图: 第二步:配置config接口权限验证 首先需要通过获取 ...

  2. PHP 一一 微信公众号开发(二次开发)

    两个星期前,学校请了传智播客的老师给我们做实训,讲了一个微信公众号开发,感觉挺有意思,在这里做一下记录,以便以后复习. 一.了解微信公众平台 1. 什么是微信公众平台? 微信公众平台是腾讯为了让用户申 ...

  3. 微信公众号开发(二)---验证服务与回复消息

    经过第一个阶段的工作,公众号服务器方面的配置已经完成,接下来就是开发环境的搭建了. 准备工作请看上一篇文章: 0. 消息的传递路径 1. 启动XShell,开启端口转发 按照上一篇文章对XShell进 ...

  4. 【微信公众号开发解决URL接口配置问题 】

    解决URL接口配置问题 1.打开ngrok.exe 2.输入ngrok http 3000(自己设置的端口) 3.复制图中网址(注意每个人的网址不同) 4.到浏览其中粘贴加上\html(我这是http ...

  5. 微信公众号开发——获取AccessToken接口调用凭据

  6. .net微信公众号开发——基础接口

    作者:王先荣     本文讲述微信公众号开发中基础接口的使用,包括以下内容:     (1)获取许可令牌(AccessToken):     (2)获取微信服务器地址:     (3)上传.下载多媒体 ...

  7. CSDN学霸课表——微信公众号开发全部流程

    < 微信公众号开发全部流程> 我是一名php开发菜鸡,目前觉得自己技术不太行了,所以想提高一下自己的技术水平,然而没找到更好的方法,所以我打算将所有的微信接口全部写一遍,一边学习,一边开发 ...

  8. 微信公众号开发(一)服务器及接口的配置

    微信公众号开发(一)服务器及接口的配置 关于微信公众号中的订阅号和服务的区别这里不多加讨论,网上有很多资源可以搜到,这里直接进入正题,如果是个人开发者,这里建议使用测试号进行开发学习,测试号的权限要比 ...

  9. 微信公众号的二次开发(三、接收事件推送获取用户信息)

    在上篇<微信公众号的二次开发(二 自定义菜单的创建)>中我们介绍了自定义菜单的创建.本篇文章将介绍如何通过接收事件推送来获取用户信息.首先我们阅读官方文档: 根据官方文档的介绍 微信公众号 ...

最新文章

  1. 实现数据“一键脱敏”,Sharding Sphere帮你搞定
  2. 图形上下文的栈操作(保存和恢复)
  3. java 新浪天气预报接口_根据新浪天气API获取各地天气状况(Java实现)
  4. Linux json格式化输出
  5. 你是如何保护用户的密码的?
  6. Android初级教程:Android中解析方式之pull解析
  7. Docker是传统的应用发布管理的终结者么?
  8. 「ECharts」主题这样配置才能更绚丽
  9. python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
  10. es中主分片和副本分片
  11. 音乐的聆听 古典音乐的入门
  12. 浅谈深度学习中的激活函数
  13. Android手势监听类GestureDetector的使用
  14. MyBatis-Plus updateById方法更新不了空字符串/null解决方法
  15. 1000入门测试题目
  16. Java高并发编程实战6,通过AQS源码分析lock()锁机制
  17. 新浪微博批量删除微博的方法
  18. Java快速对接微信登录
  19. 幼儿园介绍信(15篇)
  20. 【数据字典】第三篇 利用PowDesigner自动生成数据字典

热门文章

  1. 河源做java_河源:一座水做的城市
  2. python爬虫程序员工资-Python爬虫实战-数据可视化
  3. uni-app项目的收获及心得体会
  4. VLAN端口属性详解
  5. Systemverilog 静态变量 (static) 与 动态变量(automatic) 区别
  6. Note that the development build is not optimized. To create a production build, run npm run bui
  7. Redis配置与优化
  8. 游戏开发unity杂项知识系列:untiy2019.4版本Sprite Mode选项Paking Tag不见了
  9. OWASP A9 Security Logging and Monitoring Failures(安全日志和监控故障)
  10. Word文档空白页删除方法总结