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.

141 lines
11 KiB

2 months ago
<?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) {
// 树形排布,将一维数组转换为树形结构,以支持子菜单
2 months ago
$menuList2 = $menuList;
foreach ($menuList as $key => $menu) {
foreach ($menuList2 as $k => $menu2) {
// 如果当前菜单是另一个菜单的子菜单则添加到父菜单的sub_button中
if ($menu['id'] == $menu2['pid']) {
2 months ago
$menuList[$key]['sub_button'][] = $menu2;
// 从数组中移除已经添加为子菜单的项
2 months ago
unset($menuList[$k]);
}
}
}
// 处理数据,遍历菜单数组,处理每个菜单项的详细信息
foreach ($menuList as $key => $menu) {
// 根据菜单类型处理type和code
if ($menu['type'] == 'view') {
// 对于view类型的菜单将code值作为URL
2 months ago
$menuList[$key]['url'] = urlencode($menu['code']);
} else if ($menu['type'] == 'click') {
// 对于click类型的菜单将code值作为key
2 months ago
$menuList[$key]['key'] = $menu['code'];
} else if (!empty($menu['type'])) {
// 对于其他类型的菜单将code值作为key并初始化sub_button数组
2 months ago
$menuList[$key]['key'] = $menu['code'];
if (!isset($menu['sub_button'])) $menuList[$key]['sub_button'] = array();
}
// 移除不需要的code字段
2 months ago
unset($menuList[$key]['code'], $menuList[$key]['id'], $menuList[$key]['pid']);
// 处理名字,对菜单名称进行编码以确保在JSON序列化时不会转换成Unicode字符
2 months ago
$menuList[$key]['name'] = urlencode($menu['name']);
// 如果存在子菜单,则递归处理子菜单
if (isset($menu['sub_button'])) {
2 months ago
unset($menuList[$key]['type']);
foreach ($menu['sub_button'] as $k => $son) {
// 根据子菜单类型处理type和code
if ($son['type'] == 'view') {
2 months ago
$menuList[$key]['sub_button'][$k]['url'] = urlencode($son['code']);
} else if ($son['type'] == 'click') {
2 months ago
$menuList[$key]['sub_button'][$k]['key'] = $son['code'];
} else {
2 months ago
$menuList[$key]['sub_button'][$k]['key'] = $son['code'];
$menuList[$key]['sub_button'][$k]['sub_button'] = array();
}
// 移除不需要的code字段
2 months ago
unset($menuList[$key]['sub_button'][$k]['code'], $menuList[$key]['sub_button'][$k]['id'], $menuList[$key]['sub_button'][$k]['pid']);
// 处理名字。因为汉字不能在转换JSON时被转为UNICODE
2 months ago
$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
2 months ago
$accessToken = AccessToken::getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' . $accessToken;
// 发起POST请求将菜单数据发送到微信服务器
2 months ago
$result = Curl::callWebServer($url, $data, 'POST');
return $result['errcode'] == 0 ? true : $result; // 如果微信服务器返回errcode为0表示菜单创建成功
}
/**
* 获取微信菜单
* 此方法用于从微信服务器获取当前公众号的自定义菜单
*
* @return bool|mixed 获取成功返回菜单信息,失败返回错误信息
*/
public static function getMenu() {
// 获取微信ACCESS_TOKEN
2 months ago
$accessToken = AccessToken::getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token=' . $accessToken;
// 发起GET请求从微信服务器获取菜单信息
2 months ago
return Curl::callWebServer($url, '', 'GET');
}
/**
* 删除微信菜单
* 此方法用于删除当前公众号的自定义菜单
*
* @return bool|mixed 删除成功返回{"errcode":0,"errmsg":"ok"},失败返回错误信息
*/
public static function delMenu() {
// 获取微信ACCESS_TOKEN
2 months ago
$accessToken = AccessToken::getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=' . $accessToken;
// 发起GET请求删除微信服务器上的自定义菜单
2 months ago
return Curl::callWebServer($url, '', 'GET');
}
}
命名空间声明namespace LaneWeChat\Core; 定义了类的命名空间表明这个类属于LaneWeChat模块的核心部分。
类定义class Menu 定义了一个用于管理微信自定义菜单的类。
setMenu方法用于创建自定义菜单。处理菜单数据将一维数组转换为树形结构支持子菜单并发送POST请求到微信服务器。
getMenu方法用于获取当前公众号的自定义菜单信息。发送GET请求到微信服务器。
delMenu方法用于删除当前公众号的自定义菜单。发送GET请求到微信服务器
命名空间声明namespace LaneWeChat\Core; 定义了类的命名空间表明这个类属于LaneWeChat模块的核心部分。
类定义class Menu 定义了一个用于管理微信自定义菜单的类。
setMenu方法用于创建自定义菜单。处理菜单数据将一维数组转换为树形结构支持子菜单并发送POST请求到微信服务器。
getMenu方法用于获取当前公众号的自定义菜单信息。发送GET请求到微信服务器。
delMenu方法用于删除当前公众号的自定义菜单。发送GET请求到微信服务器
命名空间声明namespace LaneWeChat\Core; 定义了类的命名空间表明这个类属于LaneWeChat模块的核心部分。
类定义class Menu 定义了一个用于管理微信自定义菜单的类。
setMenu方法用于创建自定义菜单。处理菜单数据将一维数组转换为树形结构支持子菜单并发送POST请求到微信服务器。
getMenu方法用于获取当前公众号的自定义菜单信息。发送GET请求到微信服务器。
delMenu方法用于删除当前公众号的自定义菜单。发送GET请求到微信服务器
命名空间声明namespace LaneWeChat\Core; 定义了类的命名空间表明这个类属于LaneWeChat模块的核心部分。
类定义class Menu 定义了一个用于管理微信自定义菜单的类。
setMenu方法用于创建自定义菜单。处理菜单数据将一维数组转换为树形结构支持子菜单并发送POST请求到微信服务器。
getMenu方法用于获取当前公众号的自定义菜单信息。发送GET请求到微信服务器。
delMenu方法用于删除当前公众号的自定义菜单。发送GET请求到微信服务器命名空间声明namespace LaneWeChat\Core; 定义了类的命名空间表明这个类属于LaneWeChat模块的核心部分。
类定义class Menu 定义了一个用于管理微信自定义菜单的类。
setMenu方法用于创建自定义菜单。处理菜单数据将一维数组转换为树形结构支持子菜单并发送POST请求到微信服务器。
getMenu方法用于获取当前公众号的自定义菜单信息。发送GET请求到微信服务器。
delMenu方法用于删除当前公众号的自定义菜单。发送GET请求到微信服务器