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 這是說明創建成功了,錯誤的話會返回錯誤碼的 

然後我們就可以在手機上看到菜單啦

讓服務器跑起來,點擊菜單看反應

 

下一章我們將進行自定義 頁面,也就是網頁授權

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章