开发模式成为开发者时的消息校验原理

在开发者首次提交验证申请时,微信服务器将发送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_02


文字后台格式:


[php]   view plain  copy


 print

?


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


 print

?



XML格式讲解

ToUserName 消息接收方微信号,一般为公众平台账号微信号

FromUserName 消息发送方微信号

CreateTime 消息创建时间

MsgType 消息类型;文本消息为text

Content 消息内容

MsgId 消息ID号

可以看出,文本和表情的消息类型均为文本

2. 图片
接收图片


微信开发者工具如何调试苹果环境 苹果微信开发者模式_微信开发者工具如何调试苹果环境_03


后台格式:


[php]   view plain  copy


 print

?


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_04



后台格式:


[php]   view plain  copy


 print

?


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. 视频

接收视频


微信开发者工具如何调试苹果环境 苹果微信开发者模式_微信开发者工具如何调试苹果环境_05


后台格式:


[php]   view plain  copy


 print

?


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. 位置

接收位置


微信开发者工具如何调试苹果环境 苹果微信开发者模式_开发者_06


后台格式:


[php]   view plain  copy


 print

?


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_07


后台格式:


[php]   view plain  copy


 print

?


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. 文本消息格式
回复文本


微信开发者工具如何调试苹果环境 苹果微信开发者模式_微信开发者工具如何调试苹果环境_08


后台格式:


[php]   view plain  copy


 print

?


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 单条图文消息
回复单条图文


微信开发者工具如何调试苹果环境 苹果微信开发者模式_xml_09


微信开发者工具如何调试苹果环境 苹果微信开发者模式_php_10

后台格式:


[php]   view plain  copy


 print

?


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 多图文消息

回复多图文


微信开发者工具如何调试苹果环境 苹果微信开发者模式_xml_11


后台数据格式


[php]   view plain  copy


 print

?


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. 音乐消息

回复音乐消息


微信开发者工具如何调试苹果环境 苹果微信开发者模式_开发者_12


后台格式:


[php]   view plain  copy


 print

?


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


 print

?


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


 print

?



    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


     print

    ?


    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>