上一篇我们完成了微信公众平台与SAE的联通,接下来我们实现关注提示及自定义菜单。
用户与公众号之间的信息交互类型分为文本、图片、语音、视频、小视频、地理位置、链接等,关注后自动推送欢迎信息,用到了文本信息。
文本信息XML格式如下
%s
0
具体参数详解参照微信公众号开发手册
代码实现:
import xml.etree.ElementTree as ET
from flask import Flask, request
TEXT_MSG_TPL = \\
u\"\"\"
%s
0
\"\"\"
WELCOME_INFO = \\
u\"\"\"
欢迎关注微信餐厅微信点餐
\"\"\"
#来自微信服务器的消息推送
@app.route(\'/weixin\', methods=[\'POST\'])
def weixin_msg():
if verification(request):
data = request.data
msg = parse_msg(data)
# 用户关注微信公众号时自动发送欢迎信息到用户端
if user_subscribe_event(msg):
return welcome_info(msg)
# 用户发送?到公众号时自动回复欢迎信息
elif is_text_msg(msg):
content = msg[\'Content\']
if content == u\'?\' or content == u\'?\':
return welcome_info(msg)
# 将消息解析为dict
def parse_msg(rawmsgstr):
root = ET.fromstring(rawmsgstr)
msg = {}
for child in root:
msg[child.tag] = child.text
return msg
# 判断用户信息类型是否为文本信息
def is_text_msg(msg):
return msg[\'MsgType\'] == \'text\'
# 判断是否为关注事件
def user_subscribe_event(msg):
return msg[\'MsgType\'] == \'event\' and msg[\'Event\'] == \'subscribe\'
# 返回欢迎信息值
def welcome_info(msg):
return response_text_msg(msg, WELCOME_INFO)
# 给定一个信息模板,返回对应对应值
def response_text_msg(msg, content):
s = TEXT_MSG_TPL % (msg[\'FromUserName\'], msg[\'ToUserName\'], str(int(time.time())), content)
return s
这里我们分三个一级菜单,二个二级菜单。
首先获得AppId和AppSecert,在微信公众平台开发者中心可以找到。
代码实现如下:
appid=\'xxxxxxx\'
secret=\'xxxxxx\'
# 获得Access Token
gettoken=\'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=\'+appid+\'&secret=\'+secret
f=urllib2.urlopen(gettoken)
stringjson=f.read()
access_token=json.loads(stringjson)[\'access_token\']
posturl=\'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=\'+access_token
# 接口调用请求
menu=\'\'\'{
\"button\":[
{
\"type\":\"click\",
\"name\":\"预定\",
\"key\":\"CLICK_RESERVE\"
},
{
\"type\":\"view\",
\"name\":\"点菜\",
\"url\":\"http://xxxx.sinaapp.com/menu\"
},
{
\"name\":\"服务\",
\"sub_button\":[
{
\"type\":\"click\",
\"name\":\"线路导航\",
\"key\":\"CLICK_ROUTE\"
},
{
\"type\":\"view\",
\"name\":\"微信餐厅\",
\"url\":\"http://xxx.sinaapp.com/about\"
}
]
}
]
}
\'\'\'
# 提交菜单内容给服务器
request=urllib2.urlopen(posturl,menu.encode(\'utf-8\'))
# 查看是否成功
# 正确时的返回JSON数据包:{\"errcode\":0,\"errmsg\":\"ok\"}
# 错误时的返回JSON数据包:{\"errcode\":xxxx,\"errmsg\":\"xxxx\"}
print request.read()
参数 | 是否必须 | 说明 |
---|---|---|
button | 是 | 一级菜单数组,个数应为1-3个 |
sub_button | 否 | 二级菜单数组,个数1-5个 |
type | 是 | 菜单的响应动作类型,目前有click,view两种类型 |
name | 是 | 菜单标题,不超过16个字节,子菜单不超过40个字节 |
key | click类型必须 | 菜单KEY值,用于信息接口推送,不超过128字节 |
url | view类型必须 | 网页链接,用户点击菜单可打开链接,不超过256字节 |
在信息接口中处理event事件,其中的click代表菜单点击,通过响应菜单结构中的key值回应信息,view事件无须响应,将直接跳转过去。
# 判断并处理click事件推送
elif user_click_event(msg):
if msg[\'EventKey\']==\'CLICK_RESERVE\':
return goreserve(msg)
if msg[\'EventKey\']==\'CLICK_ROUTE\':
fromusername=msg[\'FromUserName\']
userLoc=model.get_user_location(fromusername)
if userLoc:
return goroute(msg)
else:
return route_info(msg)
接下来一篇我们将详细实现点击事件功能。
各位如需要SAE云,可以使用我的邀请链接申请。各得100云豆,谢谢!
注册地址:http://t.cn/R4jxHGe
上一篇:豆瓣top250海报原图爬取
下一篇:Django 环境搭建