這個自定義菜單屬於高級接口,如果想用,要麼你是服務號、測試號,要麼花錢認證訂閱號,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 這是說明創建成功了,錯誤的話會返回錯誤碼的
然後我們就可以在手機上看到菜單啦
讓服務器跑起來,點擊菜單看反應
下一章我們將進行自定義 頁面,也就是網頁授權