在開啟長(zhǎng)沙微信公眾號(hào)開發(fā)者模式以后,在微信公眾號(hào)平臺(tái)設(shè)置的自動(dòng)回復(fù)和自定義菜單會(huì)失效,所以我們要進(jìn)行自定義
當(dāng)然, 產(chǎn)品會(huì)讓你將這個(gè)功能開發(fā)成后臺(tái)功能,想什么時(shí)候更改就什么時(shí)候更改,多酸爽
自定義菜單最多包括3個(gè)一級(jí)菜單,每個(gè)一級(jí)菜單最多包含5個(gè)二級(jí)菜單,自定義菜單的接口還包括了可實(shí)現(xiàn)10種類型按鈕
我們項(xiàng)目基本用于跳轉(zhuǎn)頁(yè)面,不做推送啥的,所以只用view
:跳轉(zhuǎn)URL用戶點(diǎn)擊view類型按鈕后,微信客戶端將會(huì)打開開發(fā)者在按鈕中填寫的網(wǎng)頁(yè)URL
微信的文檔也很酸爽,到底用json
還是數(shù)組,奇葩啊
{ "button":[ { "type":"view", "name":"官方網(wǎng)站", "url":"https://qq52o.me" }, { "name":"技術(shù)筆記", "sub_button":[ { "type":"view", "name":"PHP", "url":"https://qq52o.me/category/php" }, { "type":"view", "name":"Python", "url":"https://qq52o.me/category/python" }, { "type":"view", "name":"Linux", "url":"https://qq52o.me/category/linux" }] }] }
將就看吧,二級(jí)菜單的一級(jí)菜單只需要顯示名稱,多了一個(gè)sub_button
數(shù)組
跳轉(zhuǎn)頁(yè)面的參數(shù)也是唯一的:type
,name
,url
后臺(tái)給設(shè)置一個(gè)CRUD
操作就行,添加需要顯示的名稱,URL,如果是二級(jí)的話,還要選擇關(guān)聯(lián)一級(jí)菜單
// 0 表示為一級(jí)菜單$data = WechatMenu::find()->where(['first_id' => 0])->asArray()->all();$secMenuData = [];foreach ($data as $key => $val){ $secMenuData[$key]['name'] = $val['name']; // 有二級(jí)菜單的時(shí)候 一級(jí)不需要鏈接 留空 if(empty($val['url'])) { // 找二級(jí)菜單的信息 $son = WechatMenu::find()->where(['first_id' => $val['id']])->asArray()->all(); if(!empty($son)){ foreach ($son as $k => $value) { $secMenuData[$key]['sub_button'][] = [ 'type' => 'view', 'url' => $value['url'], 'name' => $value['name'], ]; } } }else{ $secMenuData[$key]['type'] = 'view'; $secMenuData[$key]['url'] = $val['url']; }}
得到數(shù)據(jù)以后,轉(zhuǎn)一下json
格式,這里要注意一下的是
需要加上json_encode
的第二個(gè)參數(shù)JSON_UNESCAPED_UNICODE
不然會(huì)提示errcode":40033,"errmsg":"invalid charset. please check your request, if include uxxxx will create
錯(cuò)誤
原因是把中文自動(dòng)進(jìn)行了unicode
編碼
還要注意外面還有一個(gè)button
,我們?cè)龠M(jìn)行拼接
rsort($secMenuData);$secMenuData = ['button'=>$secMenuData];$menuJson = json_encode($secMenuData,JSON_UNESCAPED_UNICODE);//$menuJson = "{"button":".$secMenuData."}";$wechat = new WeChat(['appId'=>$appid,'appSecret' => $appKey]);$data = $wechat->setWeChatMenu($menuJson);if($data['errcode'] == 0){ Yii::$app->session->setFlash('success','應(yīng)用微信成功!'); return $this->redirect(['index']);}else{ Yii::$app->session->setFlash('error',$data['errmsg'].'請(qǐng)截圖聯(lián)系技術(shù)人員!'); return $this->redirect(['index']);}
轉(zhuǎn)義是因?yàn)槲抑坝玫膯我?hào),他提示我{"errcode":40016,"errmsg":"invalid button size"}
,轉(zhuǎn)義之后就正常了
不想拼接的話就在之前拼接為數(shù)組,一起進(jìn)行json_encode
就ok了
然后就調(diào)用定義的設(shè)置微信自定義菜單的方法就ok了