微信公眾號自定義選單
如何才能自定義選單
有兩種方式可以自定義選單,一種是非開發者模式,直接進入公眾號的管理後臺操作:
非開發者模式這裡不多講。另外一種是開發者模式。要進入開發者模式需要配置token和URL(這個之前有篇文章講到)
配置完後,再進入非開發者的管理後臺,發現已經不能操作了,後面只能通過程式控制了。
自定義選單流程
第一步獲取基礎token
其實官方api說的都很清楚了,使用appid 和appsecret 向微信憑證獲取介面請求access_token。
AppID是應用ID,也就是微信開發者編號的意思,在微信中主要用於建立微信選單等。
AppSecret是應用密匙,與AppID是相配合的,意思可理解為這是私密的應用編號。
返
回的是json格式的token和token有效期。(這個有效期的處理後面後面會寫專門的文章說明)我用的是開源的Wechat類,這是網上很出名的微信公眾平臺PHP-SDK。checkAuth方法就是處理這個功能的。
/**
* 獲取access_token
* @param string $appid 如在類初始化時已提供,則可為空
* @param string $appsecret 如在類初始化時已提供,則可為空
* @param string $token 手動指定access_token,非必要情況不建議用
*/
public function checkAuth($appid='',$appsecret='',$token=''){
$this->log('checkAuth');
if (!$appid || !$appsecret) {
$appid = $this->appid;
$appsecret = $this->appsecret;
}
if ($token) { //手動指定token,優先使用
$this->access_token=$token ;
return $this->access_token;
}
$authname = 'wechat_access_token'.$appid;
if ($rs = $this->getCache($authname)) {
$this->access_token = $rs;
return $rs;
}
$result = $this->http_get(self::API_URL_PREFIX.self::AUTH_URL.'appid='.$appid.'&secret='.$appsecret);
if ($result)
{
$json = json_decode($result,true);
if (!$json || isset($json['errcode'])) {
$this->errCode = $json['errcode'];
$this->errMsg = $json['errmsg'];
return false;
}
$this->access_token = $json['access_token'];
$expire = $json['expires_in'] ? intval($json['expires_in'])-100 : 3600;
$this->setCache($authname,$this->access_token,$expire);
return $this->access_token;
}
return false;
}
第二步建立選單
微信選單介面有建立,查詢,刪除選單的介面,事實上如果要修改選單,只要重新建立即可,不需要刪除。
根據官方文件,向微信伺服器POST一個json的結構體就可以建立選單了。地址是:
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"選單",
"sub_button":[
{
"type":"view",
"name":"搜尋",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"視訊",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"贊一下我們",
"key":"V1001_GOOD"
}]
}]
}
我用的是Wechat類,有封裝好的建立選單介面,不過注意傳入的選單引數不是json格式,而是array陣列。
$newmenu = array (
'button' => array (
0 => array (
'name' => '我是商戶',
'sub_button' => array (
0 => array (
'type' => 'view',
'name' => '繫結',
'url' => 'https://www.baidu.com',
),
1 => array (
'type' => 'view',
'name' => '解綁',
'url' => 'https://www.baidu.com',
),
2 => array (
'type' => 'view',
'name' => '訂單查詢',
'url' => 'https://www.baidu.com',
),
),
),
)
);
$result = $weObj->createMenu($newmenu)
介面頻率呼叫問題
如上圖所示,選單建立介面每日的呼叫頻率是1000次,這些頻率限制主要是防止開發者程式設計不規範會對微信伺服器造成壓力而設計的。
比如選單建立這樣的介面。建立成功後會永久生效,除非選單有改動,否則不應該重複呼叫。所以每天1000次當然是夠用的。
像自定義回覆這樣的介面就沒有呼叫頻率限制,這個也好理解。一些粉絲量很大的公眾號每天肯定有成千上萬的回覆訊息,做限制也不合理。
所以我們再程式設計時,要注意選單的處理不和自定義回覆的處理放在一起就行。比如可以定義兩個php頁面,一個是處理回覆訊息的,這個地址你公眾平臺的伺服器地址。另外一個建立選單的頁面只要訪問一次就可以了。