由于微信公众号启用了服务器配置,自定义代码就不能用了,需要开发者自己负责创建公众号的菜单。这个功能不太常用,就没做页面配置,直接写了个脚本来生成公众号的菜单。微信自定义菜单文档:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html
menu_utils.py
"""
查询 创建 删除 微信菜单
"""
import json
import requests
class WxMenu(object):
def __init__(self):
self.access_token = "xxxxxxx" # 从微信获取到的全局access_token
self.buttons = []
def query_menu(self):
if not self.access_token:
raise ValueError("[query_meun] access_token不能为空")
wx_url = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token={}".format(
self.access_token)
resp = requests.get(wx_url)
content = resp.json()
print("content: {}".format(json.dumps(content)))
def create_sub_menu(self, menu_type, menu_name, menu_url):
"""
创建二级菜单
:param menu_type:
:param menu_name:
:param menu_url:
:return:
"""
info = {}
info["type"] = menu_type
info["name"] = menu_name
info["url"] = menu_url
return info
def create_parent_menu(self, name, sub_menus):
"""
创建父菜单 即一级菜单
:param sub_menus: 二级菜单 object
:return:
"""
info = {}
info["name"] = name
info["sub_button"] = sub_menus
self.buttons.append(info)
return info
def create_menu_bar(self):
"""
创建菜单栏
:return:
"""
payload = {}
payload["button"] = self.buttons
print("total buttons: \n {}".format(json.dumps(payload)))
wx_c_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={}".format(self.access_token)
headers = {'Content-Type': 'application/json;charset=UTF-8'}
resp = requests.post(wx_c_url, data=json.dumps(payload, ensure_ascii=False).encode())
content = resp.json()
errcode = content.get("errcode")
if errcode == 0:
print("create menu bar success !!!!")
else:
errmsg = content.get("errmsg")
print("create menu bar error: {}".format(errmsg))
def delete_menu(self):
wx_url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={}".format(self.access_token)
resp = requests.get(wx_url)
content = resp.content()
errcode = content.get("errcode")
if errcode == 0:
print("删除自定义菜单成功")
else:
errmsg = content.get("errmsg")
print("删除自定义菜单失败:{}".format(errmsg))
create_menu.py
from menu_utils import WxMenu
def create_wx_menu_bar():
first_sub_menu_infos = [
{
"type": "view",
"name": "热菜",
"url": "https://xxxxxxx"
},
{
"type": "view",
"name": "凉菜",
"url": "https://xxxxx"
},
{
"type": "view",
"name": "素菜",
"url": "https://xxxxx"
},
{
"type": "view",
"name": "荤菜",
"url": "https://xxxxx"
}
]
second_sub_menu_infos = [
{
"type": "view",
"name": "面食",
"url": "https://xxxxx"
},
{
"type": "view",
"name": "米饭",
"url": "https://xxxxx"
},
{
"type": "view",
"name": "粥汤",
"url": "https://xxx"
}
]
third_sub_menu_infos = [
{
"type": "view",
"name": "个人中心",
"url": "https://xxxxx"
},
{
"type": "view",
"name": "物流",
"url": "https://xxx"
},
{
"type": "view",
"name": "在线客服",
"url": "https://xxxxxx"
}
]
wx_menu = WxMenu()
first_sub_menus = []
for item in first_sub_menu_infos:
first_sub_menus.append(wx_menu.create_sub_menu(item.get("type"), item.get("name"), item.get("url")))
wx_menu.create_parent_menu("菜品", first_sub_menus)
second_sub_menus = []
for item in second_sub_menu_infos:
second_sub_menus.append(wx_menu.create_sub_menu(item.get("type"), item.get("name"), item.get("url")))
wx_menu.create_parent_menu("主食", second_sub_menus)
third_sub_menus = []
for item in third_sub_menu_infos:
third_sub_menus.append(wx_menu.create_sub_menu(item.get("type"), item.get("name"), item.get("url")))
wx_menu.create_parent_menu("商城", third_sub_menus)
wx_menu.create_menu_bar()
if __name__ == "__main__":
create_wx_menu_bar()
执行完脚本,公众号上就有对应的菜单了
报错:
invalid charset. please check your request, if include \\uxxxx will create fail! 查了一下是,参数中的中文被转成了unicode编码,而微信的接口不接受\uxxx 这种字符,具体的做法是先把dict转成json字符串,转的过程中json.dumps()加上ensure_ascii=False这个参数,然后把整个字符串转成字节序,即 json.dumps(payload, ensure_ascii=False).encode()