You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
7.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace LaneWeChat\Core;
class Menu{
/**
* 添加菜单一级菜单最多3个每个一级菜单最多可以有5个二级菜单
* @param $menuList
* array(
* array('id'=>'', 'pid'=>'', 'name'=>'', 'type'=>'', 'code'=>''),
* array('id'=>'', 'pid'=>'', 'name'=>'', 'type'=>'', 'code'=>''),
* array('id'=>'', 'pid'=>'', 'name'=>'', 'type'=>'', 'code'=>''),
* );
* 'code'是view类型的URL或者其他类型的key
* 'type'是菜单类型,如下:
* 1、click点击推事件用户点击click类型按钮后微信服务器会通过消息接口推送消息类型为event的结构给开发者参考消息接口指南并且带上按钮中开发者填写的key值开发者可以通过自定义的key值与用户进行交互
* 2、view跳转URL用户点击view类型按钮后微信客户端将会打开开发者在按钮中填写的网页URL可与网页授权获取用户基本信息接口结合获得用户基本信息。
* 3、scancode_push扫码推事件用户点击按钮后微信客户端将调起扫一扫工具完成扫码操作后显示扫描结果如果是URL将进入URL且会将扫码的结果传给开发者开发者可以下发消息。
* 4、scancode_waitmsg扫码推事件且弹出“消息接收中”提示框用户点击按钮后微信客户端将调起扫一扫工具完成扫码操作后将扫码的结果传给开发者同时收起扫一扫工具然后弹出“消息接收中”提示框随后可能会收到开发者下发的消息。
* 5、pic_sysphoto弹出系统拍照发图用户点击按钮后微信客户端将调起系统相机完成拍照操作后会将拍摄的相片发送给开发者并推送事件给开发者同时收起系统相机随后可能会收到开发者下发的消息。
* 6、pic_photo_or_album弹出拍照或者相册发图用户点击按钮后微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
* 7、pic_weixin弹出微信相册发图器用户点击按钮后微信客户端将调起微信相册完成选择操作后将选择的相片发送给开发者的服务器并推送事件给开发者同时收起相册随后可能会收到开发者下发的消息。
* 8、location_select弹出地理位置选择器用户点击按钮后微信客户端将调起地理位置选择工具完成选择操作后将选择的地理位置发送给开发者的服务器同时收起位置选择工具随后可能会收到开发者下发的消息。
*
* @return bool
*/
public static function setMenu($menuList){
//树形排布,将一维数组转换为树形结构,以支持子菜单
$menuList2 = $menuList;
foreach($menuList as $key=>$menu){
foreach($menuList2 as $k=>$menu2){
// 如果当前菜单是另一个菜单的子菜单则添加到父菜单的sub_button中
if($menu['id'] == $menu2['pid']){
$menuList[$key]['sub_button'][] = $menu2;
// 从数组中移除已经添加为子菜单的项
unset($menuList[$k]);
}
}
}
//处理数据,遍历菜单数组,处理每个菜单项的详细信息
foreach($menuList as $key=>$menu){
// 根据菜单类型处理type和code
if($menu['type'] == 'view'){
// 对于view类型的菜单将code值作为URL
$menuList[$key]['url'] = urlencode($menu['code']);
//处理URL。因为URL不能在转换JSON时被转为UNICODE
}else if($menu['type'] == 'click'){
// 对于click类型的菜单将code值作为key
$menuList[$key]['key'] = $menu['code'];
}else if(!empty($menu['type'])){
// 对于其他类型的菜单将code值作为key并初始化sub_button数组
$menuList[$key]['key'] = $menu['code'];
if(!isset($menu['sub_button'])) $menuList[$key]['sub_button'] = array();
}// 移除不需要的code字段
unset($menuList[$key]['code'], $menuList[$key]['id'], $menuList[$key]['pid']);
//处理PID和ID,移除不需要的id和pid字段
//处理名字,对菜单名称进行编码以确保在JSON序列化时不会转换成Unicode字符
$menuList[$key]['name'] = urlencode($menu['name']);
// 如果存在子菜单,则递归处理子菜单
if(isset($menu['sub_button'])){
unset($menuList[$key]['type']);
foreach($menu['sub_button'] as $k=>$son){
// 根据子菜单类型处理type和code
if($son['type'] == 'view'){
$menuList[$key]['sub_button'][$k]['url'] = urlencode($son['code']);
// 对子菜单URL进行编码
}else if($son['type'] == 'click'){
$menuList[$key]['sub_button'][$k]['key'] = $son['code'];
}else{
$menuList[$key]['sub_button'][$k]['key'] = $son['code'];
$menuList[$key]['sub_button'][$k]['sub_button'] = array();
}
// 移除不需要的code字段
unset($menuList[$key]['sub_button'][$k]['code'], $menuList[$key]['sub_button'][$k]['id'], $menuList[$key]['sub_button'][$k]['pid']);
// 移除不需要的id和pid字段
//处理名字。因为汉字不能在转换JSON时被转为UNICODE
$menuList[$key]['sub_button'][$k]['name'] = urlencode($son['name']);
}
}
}
// 整理数据格式,准备发送到微信服务器
$data = array('button' => array_values($menuList));// 重置数组索引
$data = json_encode($data);// 将数组转换为JSON字符串
$data = urldecode($data);// 对JSON字符串进行解码以确保中文字符不会被转换成Unicode字符
// 获取微信ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accessToken;
// 发起POST请求将菜单数据发送到微信服务器
$result = Curl::callWebServer($url, $data, 'POST');
return $result['errcode'] == 0 ? true : $result;// 如果微信服务器返回errcode为0表示菜单创建成功
}// 返回微信服务器返回的结果
/**
* 获取微信菜单
* 此方法用于从微信服务器获取当前公众号的自定义菜单
*
* @return bool|mixed 获取成功返回菜单信息,失败返回错误信息
*/
public static function getMenu(){
// 获取微信ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$accessToken;
// 发起GET请求从微信服务器获取菜单信息
return Curl::callWebServer($url, '', 'GET');
}
/**
* 删除微信菜单
* 此方法用于删除当前公众号的自定义菜单
*
* @return bool|mixed 删除成功返回{"errcode":0,"errmsg":"ok"},失败返回错误信息
*/
public static function delMenu(){
// 获取微信ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$accessToken;
// 发起GET请求删除微信服务器上的自定义菜单
return Curl::callWebServer($url, '', 'GET');
}
}