微信點餐平臺開發(fā)(二)
上一篇我們完成了微信公眾平臺與SAE的聯(lián)通罕模,接下來我們實現(xiàn)關(guān)注提示及自定義菜單脑溢。
關(guān)注公眾號自動發(fā)送信息給客戶端
用戶與公眾號之間的信息交互類型分為文本、圖片、語音、視頻、小視頻裸影、地理位置、鏈接等军熏,關(guān)注后自動推送歡迎信息轩猩,用到了文本信息。
文本信息XML格式如下
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>
具體參數(shù)詳解參照微信公眾號開發(fā)手冊
代碼實現(xiàn):
import xml.etree.ElementTree as ET
from flask import Flask, request
TEXT_MSG_TPL = \
u"""
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>
"""
WELCOME_INFO = \
u"""
歡迎關(guān)注微信餐廳微信點餐
"""
#來自微信服務(wù)器的消息推送
@app.route('/weixin', methods=['POST'])
def weixin_msg():
if verification(request):
data = request.data
msg = parse_msg(data)
# 用戶關(guān)注微信公眾號時自動發(fā)送歡迎信息到用戶端
if user_subscribe_event(msg):
return welcome_info(msg)
# 用戶發(fā)送?到公眾號時自動回復(fù)歡迎信息
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'
# 判斷是否為關(guān)注事件
def user_subscribe_event(msg):
return msg['MsgType'] == 'event' and msg['Event'] == 'subscribe'
# 返回歡迎信息值
def welcome_info(msg):
return response_text_msg(msg, WELCOME_INFO)
# 給定一個信息模板均践,返回對應(yīng)對應(yīng)值
def response_text_msg(msg, content):
s = TEXT_MSG_TPL % (msg['FromUserName'], msg['ToUserName'], str(int(time.time())), content)
return s
自定義菜單
這里我們分三個一級菜單,二個二級菜單摩幔。
首先獲得AppId和AppSecert,在微信公眾平臺開發(fā)者中心可以找到彤委。
代碼實現(xiàn)如下:
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
# 接口調(diào)用請求
menu='''{
"button":[
{
"type":"click",
"name":"預(yù)定",
"key":"CLICK_RESERVE"
},
{
"type":"view",
"name":"點菜",
"url":"http://xxxx.sinaapp.com/menu"
},
{
"name":"服務(wù)",
"sub_button":[
{
"type":"click",
"name":"線路導(dǎo)航",
"key":"CLICK_ROUTE"
},
{
"type":"view",
"name":"微信餐廳",
"url":"http://xxx.sinaapp.com/about"
}
]
}
]
}
'''
# 提交菜單內(nèi)容給服務(wù)器
request=urllib2.urlopen(posturl,menu.encode('utf-8'))
# 查看是否成功
# 正確時的返回JSON數(shù)據(jù)包:{"errcode":0,"errmsg":"ok"}
# 錯誤時的返回JSON數(shù)據(jù)包:{"errcode":xxxx,"errmsg":"xxxx"}
print request.read()
參數(shù)說明
參數(shù) | 是否必須 | 說明 |
---|---|---|
button | 是 | 一級菜單數(shù)組,個數(shù)應(yīng)為1-3個 |
sub_button | 否 | 二級菜單數(shù)組或衡,個數(shù)1-5個 |
type | 是 | 菜單的響應(yīng)動作類型焦影,目前有click,view兩種類型 |
name | 是 | 菜單標題,不超過16個字節(jié)封断,子菜單不超過40個字節(jié) |
key | click類型必須 | 菜單KEY值斯辰,用于信息接口推送,不超過128字節(jié) |
url | view類型必須 | 網(wǎng)頁鏈接澄港,用戶點擊菜單可打開鏈接椒涯,不超過256字節(jié) |
響應(yīng)菜單點擊事件(一)
在信息接口中處理event事件柄沮,其中的click代表菜單點擊回梧,通過響應(yīng)菜單結(jié)構(gòu)中的key值回應(yīng)信息,view事件無須響應(yīng)祖搓,將直接跳轉(zhuǎn)過去狱意。
# 判斷并處理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)
接下來一篇我們將詳細實現(xiàn)點擊事件功能。
各位如需要SAE云拯欧,可以使用我的邀請鏈接申請详囤。各得100云豆,謝謝!
注冊地址:http://t.cn/R4jxHGe