微信公众号第三方配置及接口

微信官方给出的开发文档中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.pyWeChatLib类的check_signature函数实现,排序后哈希处理即可。

见get_wechat_menu与set_wechat_menu这两个函数

signature认证

WeChatView类中_check_signature函数

用户事件响应

do_dispatchparse_msg_xml函数,通过对微信发过来的POST事件进行解析、认证后,直接发送给对应的handler列表进行检查,让他们对这些数据进行对应的相应。

handlers.py文件中所写内容,check函数首先通过发送消息的类型与标识进行判断(对于文本内容直接检查文本数据是否符合要求,点击事件直接通过与自己在设置菜单时设置的event_key进行比对来确认),之后直接返回对应的数据并经过wrapper.py文件中do_dispatch函数,用HttpResponse进行XML格式封装,返回微信服务器。