微信点餐平台开发(二)

微信点餐平台开发(二)

上一篇我们完成了微信公众平台与SAE的联通,接下来我们实现关注提示及自定义菜单。

关注公众号自动发送信息给客户端

用户与公众号之间的信息交互类型分为文本、图片、语音、视频、小视频、地理位置、链接等,关注后自动推送欢迎信息,用到了文本信息。
文本信息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>

具体参数详解参照微信公众号开发手册
代码实现:

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"""
欢迎关注微信餐厅微信点餐
"""

#来自微信服务器的消息推送
@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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,594评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,643评论 4 59
  • 9.3反省 事件一:想买个包,于是在淘宝上逛啊逛,逛了很久无果 情绪:纠结 念头:我要买个质量好一点的不要像上次在...
    心芳疗阅读 207评论 0 0
  • 适者生存,是达尔文进化论的基本规律。不适者生存其实是对“适者生存”的补充,而不是与其相反。 我们生存在这个高速发展...
    水平生阅读 551评论 0 0
  • 我把所有的生命之源都灌溉给你向下开的花骨朵儿带着冲上云霄的欢愉和混杂过的力竭后的嘶哑梦想啊安眠啊统统冲散了卷入了惊...
    阿呸姑娘阅读 1,540评论 1 13