Python Tornado之搭建微信公众号自定义菜单(五)

       这个自定义菜单属于高级接口,如果想用,要么你是服务号、测试号,要么花钱认证订阅号,300一年。接着上篇文章继续,还是强烈建议大家阅读 官方文档

一、基本知识

以下内容来自微信官网:

1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

4、自定义菜单接口可实现多种类型按钮,最常用的是click和view,更多的事件请自行阅读官方文档:

click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;

view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

二、上代码(完整代码在 这篇博客

 

1、wxmenu.py,这个文件可以独立运行(完整代码在 这篇博客),贴出部分代码便于理解,想要运行还得看 完整代码

from wxconfig import WxConfig
from wxcache import TokenCache
from wxauthorize import WxAuthorServer
from wxlogger import logger
import requests
import json

class WxMenuServer(object):
    """这是一个创建自定义菜单的文件,当你需要更新菜单的时候执行这个文件"""
    token_cache = TokenCache()  # 微信token缓存对象
    # 微信网页授权server,目的是为了重定向,类似关卡
    wx_author_server = WxAuthorServer()  

    def create_menu(self):
        """
        自定义菜单创建接口,这个非常灵活,
        我们可以设置权限,可以传入参数等等,
        我们这边就直接写死了
        """
        try:
            access_token=self.token_cache.get_cache('access_token')
            if not access_token:
                logger.error('创建菜单 获取 token失败')
                return None
            url = WxConfig.menu_create_url + access_token
            data = self.create_menu_data()
            r = requests.post(url, data.encode('utf-8'))
            if not r.status_code == 200:
                logger.error('创建菜单 网络错误')
                return None
            json_res = json.loads(r.text)
            if 'errcode' in json_res.keys():
                errcode = json_res['errcode']
                return errcode
        except Exception as e:
            logger.error('wxmenu create_menu'+str(e))

    def get_menu(self):
        """自定义菜单查询接口"""
        try:
            access_token=self.token_cache.get_cache('access_token')
            if not access_token:
                return None
            url = WxConfig.menu_get_url + access_token
            r = requests.get(url)
            if not r.status_code == 200:
                return None
            json_res = json.loads(r.text)
            if 'errcode' in json_res.keys():
                errcode = json_res['errcode']
                logger.error('自定义菜单查询失败!')
                return errcode
        except Exception as e:
            logger.error('wxmenu get_menu'+str(e))

    def delete_menu(self):
        """自定义菜单删除接口"""
        try:
            access_token=self.token_cache.get_cache('access_token')
            if not access_token:
                return None
            url = WxConfig.menu_delete_url + access_token
            r = requests.get(url)
            if not r.status_code == 200:
                return None
            json_res = json.loads(r.text)
            if 'errcode' in json_res.keys():
                errcode = json_res['errcode']
                logger.error('自定义菜单删除失败')
                return errcode
        except Exception as e:
            logger.error('wxmenu delete_menu'+str(e))

    def create_menu_data(self):
        """创建菜单数据"""
        menu_data = {'button': []}  # 大菜单
        menu_Index0 = {
            'type': 'click',
            'name': '一级菜单',
            "key":  "menu1"
        }
        menu_data['button'].append(menu_Index0)
        menu_Index1 = {
            "name": "二级菜单",
            "sub_button":
            [
                {
                    "type": "view",
                    "name": "test",
                    "url": self.wx_author_server.get_code_url('test')
                },
                {
                    "type": "click",
                    "name": "click",
                    "key":  "click"
                }
            ]
        }
        menu_data['button'].append(menu_Index1)
        # 菜单三 我们让它请求页面,验证js-sdk权限
        menu_Index2 = {
            'type': 'view',
            'name': 'airkiss',
            "url":  self.wx_author_server.get_code_url('airkiss')
        }
        menu_data['button'].append(menu_Index2)
        menu_data = json.dumps(menu_data, ensure_ascii=False)
        return menu_data

if __name__ == '__main__':
    wx_menu_server = WxMenuServer()
    wx_menu_server.create_menu()

自定义菜单我理解就是我们向自己的公众平台请求,因为我们传入了access_token 是唯一标识,微信服务器可以识别,然后将我们提交的菜单信息保存下来,因此仅需要提交一次即可,当然如果有变动,任需要提交菜单信息。在上面的代码中。我写了三个一级菜单,其中一级菜单还有二级菜单,有click事件,它绑定了key用于对事件区分,还有view类型,绑定了url是页面跳转。

2、配置文件wxconfig.py 因为自定义菜单是我们提交给微信服务器的,因此有一些开放接口必须使用.(完整代码在 这篇博客

class WxConfig(object):
    """
    微信开发--基础配置

    """
    # 测试账号
    AppID = 'wxxxxxxxxxxxxxx'
    AppSecret = 'xxxxxxxxxxxxxxxxxxxxx'

    """微信网页开发域名"""
    AppHost = 'https://www.f203.online'

    '''获取access_token接口'''
    get_access_token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (AppID, AppSecret)

    '''自定义菜单创建接口'''
    menu_create_url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='

    '''自定义菜单查询接口'''
    menu_get_url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='

    '''自定义菜单删除接口'''
    menu_delete_url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='

    '''微信公众号菜单映射页面,参数是page/后面的'''
    wx_menu_state_map = {
        'airkiss': '%s/wx/page/airkiss'% AppHost,
        'test': '%s/wx/page/test'% AppHost
    }

 3、其他的文件我就不传了,完整代码在 这篇博客

三、测试一下

1、我们在服务器上执行 wxmenu.py

执行创建菜单 返回 errcode:0,ermsg:ok 这是说明创建成功了,错误的话会返回错误码的 

然后我们就可以在手机上看到菜单啦

让服务器跑起来,点击菜单看反应

 

下一章我们将进行自定义 页面,也就是网页授权

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖人称王某人的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值