公众号开发第三篇--接收用户消息

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mynewdays/article/details/90228636

订阅号除了可以向关注用户群发消息之外,还可以接收用户发送的消息。

1.消息格式

消息来源主要有两种

  • 事件推送:如用户关注公众号、取关公众号、点击公众号中的自定义菜单等
  • 图文、音频、视频、地理位置等消息:如通过聊天窗口发送文本、视频、图片等内容

这两种消息都会被微信服务器转发给我们的开发服务器

消息格式为xml格式,消息的类型不同,xml的结构会有些差别,如文本消息的结构为

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>

图片消息的格式为

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
  <PicUrl><![CDATA[this is a url]]></PicUrl>
  <MediaId><![CDATA[media_id]]></MediaId>
  <MsgId>1234567890123456</MsgId>
</xml>

详细的消息格式,参见开发文档

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

参数的具体含义,也参见上面的文档

关注事件的结构为

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[FromUser]]></FromUserName>
  <CreateTime>123456789</CreateTime>
  <MsgType><![CDATA[event]]></MsgType>
  <Event><![CDATA[subscribe]]></Event>
</xml>

事件的结构参见如下文档

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454

2.消息如何发送

上面介绍的这些消息,微信服务器会以post 方式发送到开发服务器,也就是下面配置的地址

3. 如何接收消息

在第二章中,我们在index(模块)/index(控制器)/index(方法)中编写了如下代码,用于验证开发服务器是否可用

//接收微信服务器发送过来的数据
            $signature = $_GET['signature'];
            $timestamp = $_GET['timestamp'];
            $nonce = $_GET['nonce'];
            //这里token的值应该与配置中的token值一致
            $token = "weixin";
            //1)将token、timestamp、nonce三个参数进行字典序排序
            $arr = array($token, $timestamp, $nonce);
            sort($arr);
            //2)将三个参数字符串拼接成一个字符串进行sha1加密
            $tempstr = implode('', $arr);
            $tempstr = sha1($tempstr);
            //3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
            if ($tempstr == $signature) {
                //一定要加上这行代码,否则可能导致token总是验证失败
                ob_clean();
                //4) 返回微信服务器发送过来的 echostr 的值
                echo $_GET['echostr'];
            }
            exit();

上面代码只需要在验证服务器时执行一次即可,当微信服务器将消息转发过来时,我们不希望执行上面的代码。怎么办呢?

可以通过如下的判断实现

if (isset($_GET['echostr'])) {
     //验证服务器是否可用
  } else {
      //处理微信转发过来的消息
  }

因为只有在验证开发服务器时,微信服务器才会以get形式发送 echostr 等参数,而在转发消息时没有这个参数

如果想知道如何从消息中获取数据,以及如何向用户回复消息,请看下一篇

猜你喜欢

转载自blog.csdn.net/mynewdays/article/details/90228636