微信官方给出的开发文档中Start Up部分:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5
具体实现可以参考:https://github.com/ThssSE/WeChatTicket/blob/master/wechat
下面也将用上述工程中的部分代码说明。
接口测试公众号
申请地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
在上面设置URL、token、域名等信息后,即可开始进行测试。
其中token是自己随便写的,与服务器那边保持一致就行。
与微信交互的信息格式
后端与微信公众号交互时,使用的消息格式为XML格式,如下所示:
1 2 3 4 5 6 7 8
| <xml> <ToUserName><![CDATA[公众号/粉丝openid]]></ToUserName> <FromUserName><![CDATA[粉丝openid/公众号]]></FromUserName> <CreateTime>1460537339</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[具体内容]]></Content> <MsgId>6272960105994287618</MsgId> </xml>
|
如果使用图片等内容,需要使用其MediaId。此时MsgType为<![CDATA[image]]>
,并且用Image
标签包含<MediaId><![CDATA[gyci5oxxxxxxv3cOL]]></MediaId>
的内容。
其中,MediaId对应的图片可以通过网址https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
下载。
自定义菜单
通过服务器向网站https://api.weixin.qq.com/cgi-bin/menu/create?access_token=XXXX
进行POST操作来创建菜单,参数为类似如下格式的字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| postJson = """ { "button": [ { "type": "click", "name": "开发指引", "key": "mpGuide" }, { "name": "公众平台", "sub_button": [ { "type": "view", "name": "更新公告", "url": "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1418702138&token=&lang=zh_CN" }, { "type": "view", "name": "接口权限说明", "url": "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1418702138&token=&lang=zh_CN" }, { "type": "view", "name": "返回码说明", "url": "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433747234&token=&lang=zh_CN" } ] }, { "type": "media_id", "name": "旅行", "media_id": "z2zOokJvlzCXXNhSjF46gdx6rSghwX2xOD5GUV9nbX4" } ] } """
|
之后可以在后台接收POST数据,并且进行对应的处理。
代码实现
如无特殊说明,以下所指代码均在ThssSE/WeChatTicket/wechat下。
access token相关:
使用wrapper.py
文件中的WeChatLib
的类函数get_wechat_access_token
,检查是否超时并且在必要时从https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx获取access token,通过类函数和类变量来进行access token的管理。
认证:
通过wrapper.py
中WeChatLib
类的check_signature
函数实现,排序后哈希处理即可。
见get_wechat_menu与set_wechat_menu这两个函数
signature认证
见WeChatView
类中_check_signature
函数
用户事件响应
见do_dispatch
及parse_msg_xml
函数,通过对微信发过来的POST事件进行解析、认证后,直接发送给对应的handler列表进行检查,让他们对这些数据进行对应的相应。
如handlers.py
文件中所写内容,check函数首先通过发送消息的类型与标识进行判断(对于文本内容直接检查文本数据是否符合要求,点击事件直接通过与自己在设置菜单时设置的event_key
进行比对来确认),之后直接返回对应的数据并经过wrapper.py
文件中do_dispatch
函数,用HttpResponse
进行XML格式封装,返回微信服务器。