微信公众号开发(二) 自定义菜单开发

    由于微信公众号启用了服务器配置,自定义代码就不能用了,需要开发者自己负责创建公众号的菜单。这个功能不太常用,就没做页面配置,直接写了个脚本来生成公众号的菜单。微信自定义菜单文档: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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值