找回密码
 立即注册

QQ登录

只需一步,快速开始

微信公众号开发资源

关注:732

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

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

[公众号开发博客] PHP微信开发之微信消息自动回复下所遇到的坑

[复制链接]
查看: 1734|回复: 9
最佳答案
0 

3

主题

5

帖子

45

积分

新人求带

积分
45
 楼主| 发表于 2016-8-23 14:45:18 | 显示全部楼层 |阅读模式
微信回复原理:
当普通微信用户向公众账号发送消息时,微信服务器首先收到用户发送的消息;
然后将用户信息和消息打包成XML格式的数据包,再将这个XML数据包通过POST方法提交到开发者设置的URL上。

疑问一:为何使用$GLOBALS["HTTP_RAW_POST_DATA"]保存POST过来的数据,而非$_POST数组?

回答:
POST只能保存标准的数据类型,对于XML、SOAP或Application/Octet-steam之类的内容则无法解析。

而$GLOBALS["HTTP_RAW_POST_DATA"]和$_POST是一样的,如果POST过来的数据PHP能够识别,则可以用$GLOBALS["HTTP_RAW_POST_DATA"]来接收。

疑问二:simplexml_load_file()各参数和返回值是什么?

回答:

参数含义
string:需要处理的XML字符串。
class:用来指定新对象,通常设置为"SimpleXMLElement",生成一个简单XML元素的类。
options:指定附加的Libxml参数,通常设置为常量LIBXML_NOCDATA,表示把CDATA设置为文本节点。
ns:一般省略
is_prefix:一般省略
函数执行完成后返回SimpleXMLElement类的一个对象。

功能:公众号只接受文字消息,且做出相应的文字回复。
  1. <?php
  2. define("TOKEN","weixin");
  3. $weixinObj = new Wechat();
  4. $weixinObj->valid();
  5. class Wechat{
  6. public function valid(){
  7. $echoStr = $_GET['echostr'];
  8. //如果是第一次接入
  9. if($this->checkSignature() && $echoStr ){
  10. echo $echoStr;
  11. exit;
  12. }else{
  13. $this->responseMsg();
  14. }
  15. }
  16. //校验方法
  17. private function checkSignature(){
  18. $signature = $_GET['signature'];
  19. $timestamp = $_GET['timestamp'];
  20. $nonce = $_GET['nonce'];
  21. $token = TOKEN;
  22. $tmpArr = array($token, $timestamp, $nonce);
  23. sort($tmpArr);
  24. $tmpStr = implode($tmpArr);
  25. $tmpStr = sha1($tmpStr);
  26. if($tmpStr == $signature){
  27. return true;
  28. }else{
  29. return false;
  30. }
  31. }
  32. /* 普通文本消息
  33. <xml>
  34. <ToUserName><![CDATA[toUser]]></ToUserName>
  35. <FromUserName><![CDATA[fromUser]]></FromUserName>
  36. <CreateTime>1348831860</CreateTime>
  37. <MsgType><![CDATA[text]]></MsgType>
  38. <Content><![CDATA[this is a test]]></Content>
  39. </xml>
  40. */
  41. public function responseMsg(){
  42. //获取微信服务器POST请求中的数据
  43. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  44. if( !empty($postStr) ){
  45. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  46. $fromUser = $postObj->FromUserName;
  47. $toUser = $postObj->ToUserName;
  48. $keyword = trim($postObj->Content);
  49. $time = time();
  50. $template = "<xml>
  51. <ToUserName><![CDATA[%s]]></ToUserName>
  52. <FromUserName><![CDATA[%s]]></FromUserName>
  53. <CreateTime>%s</CreateTime>
  54. <MsgType><![CDATA[%s]]></MsgType>
  55. <Content><![CDATA[%s]]></Content>
  56. </xml>";
  57. if( strtolower($postObj->MsgType)!='text' ){
  58. $msgType = "text";
  59. $content = "我只接受文本消息";
  60. }else{
  61. $msgType = "text";
  62. if( !empty($keyword) ){
  63. $content = "您发送的消息是:".$postObj->Content;
  64. }else{
  65. $content = "请输入关键字";//消息为空
  66. }
  67. }
  68. $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content);
  69. echo $info;
  70. }else{
  71. echo "";
  72. exit;
  73. }
  74. }
  75. }
复制代码

功能:公众号只接受图片消息,且做出相应的文字回复。
  1. <?php
  2. define("TOKEN","weixin");
  3. $weixinObj = new Wechat();
  4. $weixinObj->valid();
  5. class Wechat{
  6. public function valid(){
  7. $echoStr = $_GET['echostr'];
  8. //如果是第一次接入
  9. if($this->checkSignature() && $echoStr ){
  10. echo $echoStr;
  11. exit;
  12. }else{
  13. $this->responseMsg();
  14. }
  15. }
  16. //校验方法
  17. private function checkSignature(){
  18. $signature = $_GET['signature'];
  19. $timestamp = $_GET['timestamp'];
  20. $nonce = $_GET['nonce'];
  21. $token = TOKEN;
  22. $tmpArr = array($token, $timestamp, $nonce);
  23. sort($tmpArr);
  24. $tmpStr = implode($tmpArr);
  25. $tmpStr = sha1($tmpStr);
  26. if($tmpStr == $signature){
  27. return true;
  28. }else{
  29. return false;
  30. }
  31. }
  32. /* 接收图片消息格式
  33. <xml>
  34. <ToUserName><![CDATA[toUser]]></ToUserName>
  35. <FromUserName><![CDATA[fromUser]]></FromUserName>
  36. <CreateTime>1348831860</CreateTime>
  37. <MsgType><![CDATA[image]]></MsgType>
  38. <PicUrl><![CDATA[this is a url]]></PicUrl>
  39. <MediaId><![CDATA[media_id]]></MediaId>
  40. <MsgId>1234567890123456</MsgId>
  41. </xml>
  42. */
  43. public function responseMsg(){
  44. //获取微信服务器POST请求中的数据
  45. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  46. if( !empty($postStr) ){
  47. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  48. $fromUser = $postObj->FromUserName;
  49. $toUser = $postObj->ToUserName;
  50. $time = time();
  51. $msgType= $postObj->MsgType;
  52. $picUrl = $postObj->PicUrl;
  53. $mediaId = $postObj->MediaId;
  54. $template = "<xml>
  55. <ToUserName><![CDATA[%s]]></ToUserName>
  56. <FromUserName><![CDATA[%s]]></FromUserName>
  57. <CreateTime>%s</CreateTime>
  58. <MsgType><![CDATA[%s]]></MsgType>
  59. <Content><![CDATA[%s]]></Content>
  60. </xml>";
  61. if( strtolower($msgType)!='image' ){
  62. $msgType = "text";
  63. $content = "我只接受图片消息";
  64. }else{
  65. $msgType = "text";
  66. if( !empty( $picUrl ) ){
  67. $content = "图片链接为:".$picUrl."\n";
  68. $content .= "媒体id:".$mediaId;
  69. }else{
  70. $content = "请发送图片";//消息为空
  71. }
  72. }
  73. $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content);
  74. echo $info;
  75. }else{
  76. echo "";
  77. exit;
  78. }
  79. }
  80. }
复制代码

分享出来,希望对做微信开发的朋友有帮助
回复

使用道具 举报

最佳答案
0 

0

主题

7

帖子

35

积分

新人求带

积分
35
QQ
发表于 2016-8-23 14:51:10 | 显示全部楼层
终于知道不是我一个人在坑里了了
回复 支持 反对

使用道具 举报

TA的社区排名

积分:暂未上榜

发帖:NO. 1171 名

在线:暂未上榜

最佳答案
0 

0

主题

27

帖子

197

积分

略知一二

积分
197
发表于 2016-8-23 15:36:58 | 显示全部楼层
这个是回复关键词弹出的是链接吗
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

3

帖子

45

积分

新人求带

积分
45
发表于 2016-8-23 19:48:20 | 显示全部楼层
秒懂,感谢分享
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

9

帖子

30

积分

新人求带

积分
30
发表于 2016-8-26 10:35:01 | 显示全部楼层
感谢楼主的分享
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

6

帖子

55

积分

新人求带

积分
55
发表于 2016-8-28 00:02:49 | 显示全部楼层
看一下!!!!!!!!!!
回复

使用道具 举报

最佳答案
0 

0

主题

6

帖子

55

积分

新人求带

积分
55
发表于 2016-8-28 00:03:24 | 显示全部楼层
看一下!!!!!!!!!!
回复

使用道具 举报

TA的社区排名

积分:NO. 511 名

发帖:NO. 1331 名

在线:NO. 624 名

最佳答案
0 

2

主题

25

帖子

550

积分

专家路上

积分
550
发表于 2016-9-1 10:16:28 | 显示全部楼层
看一下!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

TA的社区排名

积分:NO. 378 名

发帖:NO. 255 名

在线:NO. 218 名

最佳答案
0 

0

主题

65

帖子

655

积分

专家路上

积分
655
发表于 2016-9-9 16:48:44 | 显示全部楼层

感谢楼主的分享
回复 支持 反对

使用道具 举报

TA的社区排名

积分:暂未上榜

发帖:NO. 366 名

在线:NO. 218 名

最佳答案
0 

0

主题

55

帖子

150

积分

略知一二

积分
150
发表于 2016-9-23 12:08:28 | 显示全部楼层
不错不错,支持了
http://www.apijingling.com
回复 支持 反对

使用道具 举报

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

本版积分规则

henkuai.com是专业的第三方微信开发者平台,为生态而生。


本站为第三方微信开发者平台,非腾讯官方网站。

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

欢迎来这里一起喝喝茶,
聊聊你的产品。

微信公众号gongzhongkaifa

工作日12小时内回复。

网站业务
zhongcong@henkuai.com

工作日12小时内回复。

市场合作
songchang@henkuai.com