微信点餐平台开发(二)

作者: 迷途老鹰 | 来源:发表于2016-07-31 22:23 被阅读504次

    微信点餐平台开发(二)

    上一篇我们完成了微信公众平台与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

    相关文章

      网友评论

        本文标题:微信点餐平台开发(二)

        本文链接:https://www.haomeiwen.com/subject/zclxsttx.html