把公眾號分成訂閱號和服務號兩種,服務號可以自訂菜單, 菜單大大方便了使用者操作。
比如:公眾服務號 "中國南方航空" 的自訂菜單如:
點菜單就可以直接進入操作了,方便!
PS:服務號需要以單位身份註冊(需上傳單位證件等進行認證),個人身份只能註冊訂閱號(無自訂菜單)
PS:易信允許所有公眾號均可自訂菜單(還是易信好!)
但是,對於公用平台開發人員來說,定義、產生菜單還真有一點點麻煩。
我看了開發文檔,測試了3個小時,才算搞明白了。在此,寫點心得,並提供一個類,徹底簡化開發人員的編碼工作。
先講一下原理(詳見公用平台開發文檔):
1,註冊公眾號、開通開發人員模式時,平台將提供兩個參數 APPID,APPSECRET (對於的訂閱號,平台不提供; 易信所有公眾號均提供)
2,自訂菜單前,須向平台申請一個使用憑證(AccessToken), 方法如下:
用GET方式讀取URL https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
其中:APPID,APPSECRET 用實際參數值代入
返回結果是一個JSON格式的文本,其中有AccessToken. (JSON是一種資料交換格式,不瞭解的同學要從頭學一下才能明白)
AccessToken不是永久有效,返回結果中有一個失效時間,即過了XX秒後(一般是一天左右), AccessToken就會失效。
對於易信平台,上述URL為
3,獲得有效AccessToken後,就可以進行自訂菜單建立、刪除操作了。
3.1 建立菜單
用POST方式向這個URL提交菜單定義資料, URL:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
其中: 用實際參數值代入
菜單定義資料是一個JSON格式的文本 (開發文檔講得不是那麼清晰,讓我理解了好一會),做為POST方式的提交資料
返回結果是一個JSON格式的文本,其中有操作成功碼和出錯資訊
對於易信平台,建立菜單的URL為
3.2 刪除菜單
用GET方式讀取URL https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
其中: 用實際參數值代入
返回結果是一個JSON格式的文本,其中有AccessToken. (JSON是一種資料交換格式,不瞭解的同學要從頭學一下才能明白)
AccessToken不是永久有效,返回結果中還有一個失效時間,即過了XX秒後(一般是一天左右), AccessToken就會失效。
對於易信平台,上述URL為
上述過程需要開發人員非常瞭解 HTTP協議細節和JSON格式,對於一般開發人員來說,可能是個噩夢。
經本人編碼、測試,在此提供兩個類,徹底簡化開發人員的自訂菜單的開發工作 (開發人員無需再去理解HTTP協議、JSON和公用平台協議了)
結果如下:
開發語言: PHP 5.X
源碼: http://download.csdn.net/detail/c80486/6357873
檔案名稱:jostudio.wechatmenu.php 此處只講其使用。(感興趣的同學,可以看原始碼注釋)
檔案中定義了兩個類:
第一個類:WeChatMenu 用於菜單操作
第二個類:MenuDefine 用於菜單資料定義
用這兩個類實現的自訂菜單操作,常式檔案 test_menu.php
<?php
include_once 'jostudio.wechatmenu.php'; //包含WeChatMenu類
$AppId="9cXXXXXXXXXXXXXXXXXX"; //公用平台提供的AppId參數
$AppSecret="61XXXXXXXXXXXXXX"; //公用平台提供的AppSecret參數
//建立一個WeChatMenu類的執行個體
$object = new WeChatMenu("weixin",$AppId, $AppSecret); //第一個參數 "weixin", 表明是針對平台的
//$object = new WeChatMenu("yixin",$AppId, $AppSecret); //第一個參數 "yixin", 表明是針對易信平台的
//定義一個菜單資料
$menu = new MenuDefine(); //建立一個MenuDefine執行個體
$menu->menuStart(); //菜單開始
$menu->addMenu("娛樂天地");
$menu->addMenuItem("猜謎語", "riddle");
$menu->addMenuItem("講笑話", "joke");
$menu->addMenuItem("聽音樂", "music");
$menu->addMenuItem("看電影", "movie");
$menu->addMenuItem("看小說", "novel");
$menu->addMenu("工具 + 生產力");
$menu->addMenuItem("找美食", "food");
$menu->addMenuItem("城市天氣", "weather");
$menu->addMenuItem("翻譯", "translate");
$menu->menuEnd(); //菜單定義結束, 則此時$menu->str中有菜單定義資料(JSON格式)
//產生菜單
echo "<h2>Create Menu</h2>";
if ($object->createMenu($menu->str)) //$menu->str中有菜單定義資料(JSON格式)
echo "Create menu OK";
else
echo "Create menu failure:".$menuObject->errmsg;
echo "<hr>";
//擷取當前菜單資料
echo "<h2>Get Menu: the menu json data is</h2>";
echo $object->getMenu();
echo "<hr>";
/*
//刪除菜單
echo "<h2>Delete Menu</h2>";
echo $object->deleteMenu();
echo "<hr>";
*/
?>
代碼說明:
1,首先: include_once 'jostudio.wechatmenu.php'; //包含WeChatMenu類
2,$AppId, $AppSecret是平台提供的兩個參數,請修改代碼,填入真實的值
3,建立一個WeChatMenu類的執行個體
$object = new WeChatMenu($platform, $AppId, $AppSecret);
第一個參數(文本型) $platform 指明是針對哪個平台,平台為"weixin", 易信平台為"yixin"
4, 定義菜單資料
4.1首先,建立一個MenuDefine執行個體
$menu = new MenuDefine(); //建立一個MenuDefine執行個體
4.2然後加入菜單
$menu->addMenu($name); //一級菜單, $name為菜單名
4.3再加入功能表項目
$menu->addMenuItem($name, $key); //二級菜單
$name為功能表項目名稱
$key是菜單的鍵值,使用者點擊該功能表項目時,將產生一個click訊息, 訊息中有這個key值,標明是哪個菜單被點擊了
4.4如此類推,逐個加入。
上述常式中,共定義了兩個一級菜單
4.5菜單定義結束,用 $menu->menuEnd(); 結束菜單定義, 則此時$menu的str變數中已產生了菜單定義資料(JSON格式)
MenuDefine這個類是用於簡化菜單定義的,最後產生的JSON格式的資料,儲存在 $menu->str中。
5, 調用WeChatMenu類的createMenu($menu_data)方法建立自訂菜單
代碼為: $object->createMenu($menu->str))
createMenu() 將自動完成原理介紹中的所有過程
如成功建立菜單, createMenu()將返回true
如建立菜單失敗, createMenu()將返回false, 錯誤碼和錯誤資訊分別記錄在 $object->errcode 和 $object->errmsg 兩個變數中
6, 調用WeChatMenu類的getMenu()方法可以讀取當前平台上的菜單定義資料, 返回結果是一個JSON格式的文本
7, 調用WeChatMenu類的deleteMenu()方法可以刪除平台上的菜單定義, 如成功則返回true
test_menu.php 這個常式檔案是完整可用的,根據需要修改一下,上傳到伺服器上,load一下即可完成自訂菜單操作
上述菜單的實際螢幕效果如下:
這是俺的易信公眾號的菜單效果。
由於俺的公眾號不是服務號、而是訂閱號,沒有自訂菜單功能,俺只能在易信中完成這個菜單了。
可以在易信中掃描以下二維碼,加一下易信公眾號“智能科技”,實際看看菜單效果