开发模式成为开发者时的消息校验原理
在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。
此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。
参数 | 描述 |
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
启用接口是由代码中的checkSignature()函数来实现校验的。如果对这一原理难以理解,可以暂时不用深究,继续看下面。
成为开发者后消息收发时的原理
上一章节中图,当用户发送一个“?”时,系统回复了一个时间
这一原理的消息流程图如下所示。
从上图可以看出,用户在发送一个?后,微信服务器将组装一个消息发送给我们自己的服务器,自己的服务器然后回复一个时间,并且将该时间也按一定的规 则组装,回复给公众账号,公众账号再回复给用户,在这个收发过程中,发送方和接收方进行了调换(ToUserName和FromUserName值互 换),收发都是以xml格式在后台进行传输的,
所以掌握各种消息类型的接收回复就是进行微信公众平台开发的基础!
下面对前面所述的各种消息类型讲解其XML数据包的格式。
各种收发消息的XML数据包分析
接收消息
1. 文本(包括表情)
接收文本及表情
文字后台格式:
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
3. <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
4. <CreateTime>1359028446</CreateTime>
5. <MsgType><![CDATA[text]]></MsgType>
6. <Content><![CDATA[测试文字]]></Content>
7. <MsgId>5836982729904121631</MsgId>
8. </xml>
表情后台格式
[php] view plain copy
XML格式讲解
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;文本消息为text
Content 消息内容
MsgId 消息ID号
可以看出,文本和表情的消息类型均为文本
2. 图片
接收图片
后台格式:
[php] view plain copy
1. <xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
2. <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
3. <CreateTime>1359028479</CreateTime>
4. <MsgType><![CDATA[image]]></MsgType>
5. <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0DxqYFI4uAQH1FWs3hUicpibjF0pOqLEQyDMlg/0]]></PicUrl>
6. <MsgId>5836982871638042400</MsgId>
7. <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId>
8. </xml>
XML格式讲解
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;图片消息为image
PicUrl 图片链接地址,可以用HTTP GET获取
MsgId 消息ID号
3. 语音
接收语音
后台格式:
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[gh_d035bb259cf5]]></ToUserName>
3. <FromUserName><![CDATA[owEUGj4BW8yeWRvyEERiVGKwAF1Q]]></FromUserName>
4. <CreateTime>1364883809</CreateTime>
5. <MsgType><![CDATA[voice]]></MsgType>
6. <MediaId><![CDATA[JfmCezZ3Cwp0FwUvMADwwhvp-XScuvpictubpw0c6ALyA8tj3HLU4PoXzMpIY72P]]></MediaId>
7. <Format><![CDATA[amr]]></Format>
8. <MsgId>5862131322594912688</MsgId>
9. </xml>
XML格式讲解
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;语音消息为voice
MediaId 媒体ID
Format 语音格式,这里为amr
MsgId 消息ID号
附:AMR接口简介
全称Adaptive Multi-Rate,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。
4. 视频
接收视频
后台格式:
[php] view plain copy
1. <xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
2. <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
3. <CreateTime>1359028186</CreateTime>
4. <MsgType><![CDATA[video]]></MsgType>
5. <MediaId><![CDATA[DBVFRIj29LB2hxuYpc0R6VLyxwgyCHZPbRj_IIs6YaGhutyXUKtFSDcSCPeoqUYr]]></MediaId>
6. <ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzIclCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediaId>
7. <MsgId>5836981613212624665</MsgId>
8. </xml>
XML格式讲解
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;视频消息为video
MediaId 媒体ID
ThumbMediaId 媒体缩略ID?
MsgId 消息ID号
5. 位置
接收位置
后台格式:
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
3. <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
4. <CreateTime>1359036619</CreateTime>
5. <MsgType><![CDATA[location]]></MsgType>
6. <Location_X>22.539968</Location_X>
7. <Location_Y>113.954980</Location_Y>
8. <Scale>16</Scale>
9. <Label><![CDATA[中国广东省深圳市南山区华侨城深南大道9789号 邮政编码: 518057]]></Label>
10. <MsgId>5837017832671832047</MsgId>
11. </xml>
XML格式讲解
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型,地理位置为location
Location_X 地理位置纬度
Location_Y 地理位置经度
Scale 地图缩放大小
Label 地理位置信息
MsgId 消息ID号
6. 链接
接收链接
后台格式:
[php] view plain copy
XML格式讲解
1. <xml>
2. <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
3. <FromUserName><![CDATA[oIDrpjl2LYdfTAM-oxDgB4XZcnc8]]></FromUserName>
4. <CreateTime>1359709372</CreateTime>
5. <MsgType><![CDATA[link]]></MsgType>
6. <Title><![CDATA[微信公众平台开发者的江湖]]></Title>
7. <Description><![CDATA[陈坤的微信公众号这段时间大火,大家..]]></Description>
8. <Url><![CDATA[http://israel.duapp.com/web/photo.php]]></Url>
9. <MsgId>5839907284805129867</MsgId>
10. </xml>
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型,链接为link
Title 图文消息标题
Description 图文消息描述
Url 点击图文消息跳转链接
MsgId 消息ID号
回复消息
只介绍三种格式的消息:文本、图文、音乐。其中图文消息包括单条图文消息和多条图文消息,展示方式有一点点不同。
1. 文本消息格式
回复文本
后台格式:
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
3. <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
4. <CreateTime>1359036631</CreateTime>
5. <MsgType><![CDATA[text]]></MsgType>
6. <Content><![CDATA[【深圳】天气实况 温度:27℃ 湿度:59% 风速:东北风3级
7. 11月03日 周日 27℃~23℃ 小雨 东北风4-5级
8. 11月04日 周一 26℃~21℃ 阵雨 微风
9. 11月05日 周二 27℃~22℃ 阴 微风]]></Content>
10. <FuncFlag>0</FuncFlag>
11. </xml>
XML格式讲解
FromUserName 消息发送方
ToUserName 消息接收方
CreateTime 消息创建时间
MsgType 消息类型,文本消息必须填写text
Content 消息内容,大小限制在2048字节,字段为空为不合法请求
FuncFlag 星标字段
2. 图文消息格式
2.1 单条图文消息
回复单条图文
后台格式:
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
3. <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
4. <CreateTime>1359011899</CreateTime>
5. <MsgType><![CDATA[news]]></MsgType>
6. <Content><![CDATA[]]></Content>
7. <ArticleCount>1</ArticleCount>
8. <Articles>
9. <item>
10. <Title><![CDATA[[苹果产品信息查询]]></Title>
11. <Description><![CDATA[序列号:USE IMEI NUMBER
12. IMEI号:358031058974471
13. 设备名称:iPhone 5C
14. 设备颜色:
15. 设备容量:
16. 激活状态:已激活
17. 电话支持:未过期[2014-01-13]
18. 硬件保修:未过期[2014-10-14]
19. 生产工厂:中国]]>
20. </Description>
21. //www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
22. <Url><![CDATA[]]></Url>
23. </item>
24. </Articles>
25. <FuncFlag>0</FuncFlag>
26. </xml>
2.2 多图文消息
回复多图文
后台数据格式
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
3. <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
4. <CreateTime>1359011829</CreateTime>
5. <MsgType><![CDATA[news]]></MsgType>
6. <Content><![CDATA[]]></Content>
7. <ArticleCount>5</ArticleCount>
8. <Articles>
9. <item>
10. <Title><![CDATA[【深圳】天气实况 温度:3℃ 湿度:43﹪ 风速:西南风2级]]></Title>
11. <Description><![CDATA[]]></Description>
12. <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
13. <Url><![CDATA[]]></Url>
14. </item>
15. <item>
16. <Title><![CDATA[06月24日 周四 2℃~-7℃ 晴 北风3-4级转东南风小于3级]]></Title>
17. <Description><![CDATA[]]></Description>
18. //www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
19. <Url><![CDATA[]]></Url>
20. </item>
21. <item>
22. <Title><![CDATA[06月25日 周五 -1℃~-8℃ 晴 东南风小于3级转东北风3-4级]]></Title>
23. <Description><![CDATA[]]></Description>
24. //www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
25. <Url><![CDATA[]]></Url>
26. </item>
27. <item>
28. <Title><![CDATA[06月26日 周六 -1℃~-7℃ 多云 东北风3-4级转东南风小于3级]]></Title>
29. <Description><![CDATA[]]></Description>
30. <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
31. <Url><![CDATA[]]></Url>
32. </item>
33. <item>
34. <Title><![CDATA[06月27日 周日 0℃~-6℃ 多云 东南风小于3级转东北风3-4级]]></Title>
35. <Description><![CDATA[]]></Description>
36. <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
37. <Url><![CDATA[]]></Url>
38. </item>
39. </Articles>
40. <FuncFlag>0</FuncFlag>
41. </xml>
XML格式讲解
FromUserName 消息发送方
ToUserName 消息接收方
CreateTime 消息创建时间
MsgType 消息类型,图文消息必须填写news
Content 消息内容,图文消息可填空
ArticleCount 图文消息个数,限制为10条以内
Articles 多条图文消息信息,默认第一个item为大图
Title 图文消息标题
Description 图文消息描述
PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80
Url 点击图文消息跳转链接
FuncFlag 星标字段
3. 音乐消息
回复音乐消息
后台格式:
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></ToUserName>
3. <FromUserName><![CDATA[gh_b629c48b653e]]></FromUserName>
4. <CreateTime>1372310544</CreateTime>
5. <MsgType><![CDATA[music]]></MsgType>
6. <Music>
7. <Title><![CDATA[最炫民族风]]></Title>
8. <Description><![CDATA[凤凰传奇]]></Description>
9. //zj189.cn/zj/download/music/zxmzf.mp3]]></MusicUrl>
10. //zj189.cn/zj/download/music/zxmzf.mp3]]></HQMusicUrl>
11. </Music>
12. <FuncFlag>0</FuncFlag>
13. </xml>
XML格式讲解
ToUserName 接收方帐号(收到的OpenID)
FromUserName 开发者微信号
CreateTime 消息创建时间
MsgType 消息类型,此处为music
Title 音乐标题
Description 音乐描述
MusicUrl 音乐链接
HQMusicUrl 高质量音乐链接,WIFI环境优先使用该链接播放音乐
FuncFlag 位0x0001被标志时,星标刚收到的消息。
事件消息类型
目前用户在关注和取消关注,以及点击菜单的时候会自动向公众平台发送事件推送消息:
1. 关注事件
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
3. <FromUserName><![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]></FromUserName>
4. <CreateTime>1372307736</CreateTime>
5. <MsgType><![CDATA[event]]></MsgType>
6. <Event><![CDATA[subscribe]]></Event>
7. <EventKey><![CDATA[]]></EventKey>
8. </xml>
2. 取消关注事件
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
3. <FromUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></FromUserName>
4. <CreateTime>1372309890</CreateTime>
5. <MsgType><![CDATA[event]]></MsgType>
6. <Event><![CDATA[unsubscribe]]></Event>
7. <EventKey><![CDATA[]]></EventKey>
8. </xml>
3. 菜单点击事件
[php] view plain copy
1. <xml>
2. <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
3. <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
4. <CreateTime>1377886191</CreateTime>
5. <MsgType><![CDATA[event]]></MsgType>
6. <Event><![CDATA[CLICK]]></Event>
7. <EventKey><![CDATA[天气深圳]]></EventKey>
8. </xml>