这个自定义菜单属于高级接口,如果想用,要么你是服务号、测试号,要么花钱认证订阅号,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 这是说明创建成功了,错误的话会返回错误码的
然后我们就可以在手机上看到菜单啦
让服务器跑起来,点击菜单看反应
下一章我们将进行自定义 页面,也就是网页授权