订阅号除了可以向关注用户群发消息之外,还可以接收用户发送的消息。
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 等参数,而在转发消息时没有这个参数
如果想知道如何从消息中获取数据,以及如何向用户回复消息,请看下一篇