找回密码
 立即注册

QQ登录

只需一步,快速开始

微信公众号开发资源

关注:848

所属分类: 微信开发 微信公众号开发资源

本版块为微信公众号开发教程与公众号开发相关技术分享板块,技术提问请到其他对应的问答板块发帖:)

[公众号开发博客] 微信公众号开发从0到1之被动回复消息

[复制链接]
查看: 4158|回复: 8
最佳答案
2 

66

主题

277

帖子

7891

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7891
 楼主| 发表于 2016-6-28 12:05:08 | 显示全部楼层 |阅读模式
当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。

如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给公众号的消息以及公众号被动回复用户消息都会继续加密(但),详见被动回复消息加解密说明。

假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。详见下面说明:

1、(推荐方式)直接回复success
2、直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)

一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:

1、开发者在5秒内未回复任何内容
2、开发者回复了异常数据,比如JSON数据等

另外,请注意,回复图片等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,可以使用素材管理中的临时素材,也可以使用永久素材。

被动回复消息包括:
1 回复文本消息
2 回复图片消息
3 回复语音消息
4 回复视频消息
5 回复音乐消息
6 回复图文消息


回复文本消息
  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[text]]></MsgType>
  6. <Content><![CDATA[你好]]></Content>
  7. </xml>
复制代码

1111.png

回复图片消息
  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[image]]></MsgType>
  6. <Image>
  7. <MediaId><![CDATA[media_id]]></MediaId>
  8. </Image>
  9. </xml>
复制代码

222.png

回复语音消息
  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[voice]]></MsgType>
  6. <Voice>
  7. <MediaId><![CDATA[media_id]]></MediaId>
  8. </Voice>
  9. </xml>
复制代码

333.png

回复视频消息
  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[video]]></MsgType>
  6. <Video>
  7. <MediaId><![CDATA[media_id]]></MediaId>
  8. <Title><![CDATA[title]]></Title>
  9. <Description><![CDATA[description]]></Description>
  10. </Video>
  11. </xml>
复制代码

444.png

回复音乐消息
  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[music]]></MsgType>
  6. <Music>
  7. <Title><![CDATA[TITLE]]></Title>
  8. <Description><![CDATA[DESCRIPTION]]></Description>
  9. <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
  10. <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
  11. <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
  12. </Music>
  13. </xml>
复制代码

5555.png

回复图文消息
  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[news]]></MsgType>
  6. <ArticleCount>2</ArticleCount>
  7. <Articles>
  8. <item>
  9. <Title><![CDATA[title1]]></Title>
  10. <Description><![CDATA[description1]]></Description>
  11. <PicUrl><![CDATA[picurl]]></PicUrl>
  12. <Url><![CDATA[url]]></Url>
  13. </item>
  14. <item>
  15. <Title><![CDATA[title]]></Title>
  16. <Description><![CDATA[description]]></Description>
  17. <PicUrl><![CDATA[picurl]]></PicUrl>
  18. <Url><![CDATA[url]]></Url>
  19. </item>
  20. </Articles>
  21. </xml>
复制代码

666.png

代码:
  1. <?php
  2. /**
  3.   * wechat php test
  4.   */

  5. // >>>>>>>>>>>>>>>>>>>>>>>>>记录请求log<<<<<<<<<<<<<<<<<<<<<<<
  6. date_default_timezone_set('PRC'); //中国的时区
  7. $date = date('Y-m-d H:i:s');
  8. $file = '10.log';

  9. $get = serialize($_GET);
  10. $get = $date . '<<<<<<<<<<<<<<<<<GET' . "\r\n" . $get . "\r\n";
  11. file_put_contents($file, $get, FILE_APPEND);

  12. $post= serialize($_POST);
  13. $post= '<<<<<<<<<<<<<<<<<POST' . "\r\n" . $post. "\r\n";
  14. file_put_contents($file, $post, FILE_APPEND);

  15. $xml= serialize($GLOBALS['HTTP_RAW_POST_DATA']);
  16. $xml= '<<<<<<<<<<<<<<<<<XML' . "\r\n" . $xml. "\r\n";
  17. file_put_contents($file, $xml, FILE_APPEND);
  18. // >>>>>>>>>>>>>>>>>>>>>>>>>记录请求log<<<<<<<<<<<<<<<<<<<<<<<


  19. //define your token
  20. define("TOKEN", "weixin");
  21. $wechatObj = new wechatCallbackapiTest();

  22. // 校验
  23. if (!empty($_GET["echostr"])) {
  24.         $wechatObj->valid();
  25. } else { // 被动回复消息
  26.         $wechatObj->responseMsg();
  27. }


  28. class wechatCallbackapiTest
  29. {
  30.         public function valid()
  31.     {
  32.         $echoStr = $_GET["echostr"];

  33.         //valid signature , option
  34.         if($this->checkSignature()){
  35.                 echo $echoStr;
  36.                 exit;
  37.         }
  38.     }
  39.                
  40.         private function checkSignature()
  41.         {
  42.         // you must define TOKEN by yourself
  43.         if (!defined("TOKEN")) {
  44.             throw new Exception('TOKEN is not defined!');
  45.         }
  46.         
  47.         $signature = $_GET["signature"];
  48.         $timestamp = $_GET["timestamp"];
  49.         $nonce = $_GET["nonce"];
  50.                         
  51.                 $token = TOKEN;
  52.                 $tmpArr = array($token, $timestamp, $nonce);
  53.         // use SORT_STRING rule
  54.                 sort($tmpArr, SORT_STRING);
  55.                 $tmpStr = implode( $tmpArr );
  56.                 $tmpStr = sha1( $tmpStr );
  57.                
  58.                 if( $tmpStr == $signature ){
  59.                         return true;
  60.                 }else{
  61.                         return false;
  62.                 }
  63.         }
  64.         
  65.         public function responseMsg()
  66.     {
  67.                 //get post data, May be due to the different environments
  68.                 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

  69.               //extract post data
  70.                 if (!empty($postStr)){
  71.                 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
  72.                    the best way is to check the validity of xml by yourself */
  73.                 libxml_disable_entity_loader(true);
  74.                       $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  75.                 $fromUsername = $postObj->FromUserName;
  76.                 $toUsername = $postObj->ToUserName;
  77.                 $keyword = trim($postObj->Content);
  78.                 $time = time();
  79.                                 if (!empty( $keyword )) {
  80.                                         if ($keyword == '文本') {
  81.                                                 $this->textMsg($fromUsername, $toUsername, $time);
  82.                                         } else if ($keyword == '图片') {
  83.                                                 $this->imageMsg($fromUsername, $toUsername, $time);
  84.                                         } else if ($keyword == '语音') {
  85.                                                 $this->voiceMsg($fromUsername, $toUsername, $time);
  86.                                         } else if ($keyword == '视频') {
  87.                                                 $this->videoMsg($fromUsername, $toUsername, $time);
  88.                                         } else if ($keyword == '音乐') {
  89.                                                 $this->musicMsg($fromUsername, $toUsername, $time);
  90.                                         }
  91.                               // 默认回复
  92.                                         $this->newsMsg($fromUsername, $toUsername, $time);
  93.                 } else {
  94.                         echo "Input something...";
  95.                 }

  96.         } else {
  97.                 exit;
  98.         }
  99.     }
  100.          
  101.         /**
  102.          * 回复文本消息
  103.          */
  104.         protected function textMsg($fromUsername, $toUsername, $time) {
  105.                 $textTpl = "<xml>
  106.                                         <ToUserName><![CDATA[%s]]></ToUserName>
  107.                                         <FromUserName><![CDATA[%s]]></FromUserName>
  108.                                         <CreateTime>%s</CreateTime>
  109.                                         <MsgType><![CDATA[%s]]></MsgType>
  110.                                         <Content><![CDATA[%s]]></Content>
  111.                                         </xml>";
  112.                 $msgType = "text";
  113.                 $contentStr = "www.henkuai.com";
  114.                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  115.                 echo $resultStr;
  116.         }
  117.         
  118.         /**
  119.          * 回复图片消息
  120.          */
  121.         protected function imageMsg($fromUsername, $toUsername, $time) {
  122.                 $textTpl = "<xml>
  123.                                         <ToUserName><![CDATA[%s]]></ToUserName>
  124.                                         <FromUserName><![CDATA[%s]]></FromUserName>
  125.                                         <CreateTime>%s</CreateTime>
  126.                                         <MsgType><![CDATA[%s]]></MsgType>
  127.                                         <Image>
  128.                                         <MediaId><![CDATA[%s]]></MediaId>
  129.                                         </Image>
  130.                                         </xml>";
  131.                 $msgType = "image";
  132.                 $contentStr = "0e1pnTcM5dc5_f3SUEPmfnTmK5hwJSpTmmh9H5__CiNVWkq_AvnumwCpE5SCQAO8";
  133.                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  134.                 echo $resultStr;
  135.         }
  136.         
  137.         /**
  138.          * 回复语音消息
  139.          */
  140.         protected function voiceMsg($fromUsername, $toUsername, $time) {
  141.                 $textTpl = "<xml>
  142.                                         <ToUserName><![CDATA[%s]]></ToUserName>
  143.                                         <FromUserName><![CDATA[%s]]></FromUserName>
  144.                                         <CreateTime>%s</CreateTime>
  145.                                         <MsgType><![CDATA[%s]]></MsgType>
  146.                                         <Voice>
  147.                                         <MediaId><![CDATA[%s]]></MediaId>
  148.                                         </Voice>
  149.                                         </xml>";
  150.                 $msgType = "voice";
  151.                 $contentStr = "jPOcG8gOvKddmBUiabsW2L-sO4caQO40SiLZk7GtlJlmUqP51A2ntbrX0k7uJC6l";
  152.                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  153.                 echo $resultStr;
  154.         }

  155.         /**
  156.          * 回复视频消息
  157.          */
  158.         protected function videoMsg($fromUsername, $toUsername, $time) {
  159.                 $textTpl = "<xml>
  160.                                         <ToUserName><![CDATA[%s]]></ToUserName>
  161.                                         <FromUserName><![CDATA[%s]]></FromUserName>
  162.                                         <CreateTime>%s</CreateTime>
  163.                                         <MsgType><![CDATA[%s]]></MsgType>
  164.                                         <Video>
  165.                                         <MediaId><![CDATA[%s]]></MediaId>
  166.                                         <Title><![CDATA[视频标题]]></Title>
  167.                                         <Description><![CDATA[视频描述]]></Description>
  168.                                         </Video>
  169.                                         </xml>";
  170.                 $msgType = "video";
  171.                 $contentStr = "hO7D3n2glDI1I9eRLzc7_hXP5oNWupXaoJYvB5hUKV0";
  172.                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  173.                 echo $resultStr;
  174.         }
  175.         
  176.         /**
  177.          * 回复音乐消息
  178.          */
  179.         protected function musicMsg($fromUsername, $toUsername, $time) {
  180.                 $textTpl = "<xml>
  181.                                         <ToUserName><![CDATA[%s]]></ToUserName>
  182.                                         <FromUserName><![CDATA[%s]]></FromUserName>
  183.                                         <CreateTime>%s</CreateTime>
  184.                                         <MsgType><![CDATA[%s]]></MsgType>
  185.                                         <Music>
  186.                                         <Title><![CDATA[羽·泉]]></Title>
  187.                                         <Description><![CDATA[羽·泉 - 绝地逃亡]]></Description>
  188.                                         <MusicUrl><![CDATA[%s]]></MusicUrl>
  189.                                         <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
  190.                                         </Music>
  191.                                         </xml>";
  192.                 $msgType = "music";
  193.                 $contentStr = "http://weixin.xpisme.com/a.mp3";
  194.                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr, $contentStr);
  195.                 echo $resultStr;
  196.         }
  197.         
  198.         /**
  199.          * 回复图文消息
  200.          */
  201.         protected function newsMsg($fromUsername, $toUsername, $time) {
  202.                 $textTpl = "<xml>
  203.                                         <ToUserName><![CDATA[%s]]></ToUserName>
  204.                                         <FromUserName><![CDATA[%s]]></FromUserName>
  205.                                         <CreateTime>%s</CreateTime>
  206.                                         <MsgType><![CDATA[%s]]></MsgType>
  207.                                         <ArticleCount>3</ArticleCount>
  208.                                         <Articles>
  209.                                         <item>
  210.                                         <Title><![CDATA[百度]]></Title>
  211.                                         <Description><![CDATA[百度一下 你会死吗]]></Description>
  212.                                         <PicUrl><![CDATA[http://weixin.xpisme.com/image00.png]]></PicUrl>
  213.                                         <Url><![CDATA[http://baidu.com]]></Url>
  214.                                         </item>
  215.                                         <item>
  216.                                         <Title><![CDATA[很快2]]></Title>
  217.                                         <Description><![CDATA[很快微信开发者]]></Description>
  218.                                         <PicUrl><![CDATA[http://weixin.xpisme.com/image00.png]]></PicUrl>
  219.                                         <Url><![CDATA[http://henkuai.com]]></Url>
  220.                                         </item>
  221.                                         <item>
  222.                                         <Title><![CDATA[一二三]]></Title>
  223.                                         <Description><![CDATA[很快微信开发者]]></Description>
  224.                                         <PicUrl><![CDATA[http://weixin.xpisme.com/image00.png]]></PicUrl>
  225.                                         <Url><![CDATA[http://henkuai.com]]></Url>
  226.                                         </item>
  227.                                         </Articles>
  228.                                         </xml>";
  229.                 $msgType = "news";
  230.                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType);
  231.                 echo $resultStr;
  232.         }
  233.         
  234.         
  235.         
  236.         
  237. }
复制代码

视频播放地址:http://www.henkuai.com/threed_vi ... id=12193&cid=43
回复

使用道具 举报

最佳答案
0 

1

主题

22

帖子

368

积分

新人求带

积分
368
发表于 2016-6-28 14:11:04 | 显示全部楼层
谢谢老师j分享~
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 22:12:09 | 显示全部楼层
看起来不错,~!
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 22:13:54 | 显示全部楼层
不错哦,真的可以哦
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 22:15:42 | 显示全部楼层
看看先不错哦
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 23:32:47 | 显示全部楼层
非常感谢您的分享~
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 23:35:36 | 显示全部楼层
看下哦,好像挺好的。。。。。
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4

帖子

150

积分

新人求带

积分
150
发表于 2019-1-20 01:33:46 | 显示全部楼层
现在测试账号不能被动回复视频消息么
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

211

帖子

2995

积分

专家路上

积分
2995

HKC

发表于 2019-1-22 20:47:32 | 显示全部楼层
打卡刷分!@
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



www.henkuai.com—微信开发者的分享交流平台,专注微信开发生态。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

微信公众号

广告推广
QQ:805874290

市场合作
zhongcong@henkuai.com