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

栏目: 编程语言 · XML · 发布时间: 5年前

内容简介:订阅号除了可以向关注用户群发消息之外,还可以接收用户发送的消息。消息来源主要有两种这两种消息都会被微信服务器转发给我们的开发服务器

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

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 等参数,而在转发消息时没有这个参数

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Natural Language Processing with Python

Natural Language Processing with Python

Steven Bird、Ewan Klein、Edward Loper / O'Reilly Media / 2009-7-10 / USD 44.99

This book offers a highly accessible introduction to Natural Language Processing, the field that underpins a variety of language technologies, ranging from predictive text and email filtering to autom......一起来看看 《Natural Language Processing with Python》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具