# 微信菜单服务

## 功能介绍

微信菜单服务提供了创建、查询、删除公众号菜单的功能，支持普通菜单和个性化菜单的管理。

## 核心方法

### WechatMenuService

#### createMenu(array $menu)

创建菜单。

**参数：**
- `$menu` - 菜单配置数组

**返回值：** 操作结果

**示例：**
```php
use Kylin\Wechat\Facades\Wechat;

// 创建普通菜单
$menu = [
    'button' => [
        [
            'type' => 'click',
            'name' => '今日歌曲',
            'key' => 'V1001_TODAY_MUSIC'
        ],
        [
            'name' => '菜单',
            'sub_button' => [
                [
                    'type' => 'view',
                    'name' => '搜索',
                    'url' => 'http://www.soso.com/'
                ],
                [
                    'type' => 'miniprogram',
                    'name' => '小程序',
                    'url' => 'http://mp.weixin.qq.com',
                    'appid' => 'wx286b93c14bbf93aa',
                    'pagepath' => 'pages/lunar/index'
                ],
                [
                    'type' => 'click',
                    'name' => '赞一下我们',
                    'key' => 'V1001_GOOD'
                ]
            ]
        ]
    ]
];

$result = Wechat::officialAccount()->menu->createMenu($menu);
print_r($result);
```

#### getMenu()

获取菜单。

**返回值：** 菜单信息

**示例：**
```php
use Kylin\Wechat\Facades\Wechat;

// 获取菜单
$menu = Wechat::officialAccount()->menu->getMenu();
print_r($menu);
```

#### deleteMenu()

删除菜单。

**返回值：** 操作结果

**示例：**
```php
use Kylin\Wechat\Facades\Wechat;

// 删除菜单
$result = Wechat::officialAccount()->menu->deleteMenu();
print_r($result);
```

#### createConditionalMenu(array $menu)

创建个性化菜单。

**参数：**
- `$menu` - 个性化菜单配置数组

**返回值：** 操作结果

**示例：**
```php
use Kylin\Wechat\Facades\Wechat;

// 创建个性化菜单
$menu = [
    'button' => [
        [
            'type' => 'click',
            'name' => '今日歌曲',
            'key' => 'V1001_TODAY_MUSIC'
        ],
        [
            'name' => '菜单',
            'sub_button' => [
                [
                    'type' => 'view',
                    'name' => '搜索',
                    'url' => 'http://www.soso.com/'
                ],
                [
                    'type' => 'click',
                    'name' => '赞一下我们',
                    'key' => 'V1001_GOOD'
                ]
            ]
        ]
    ],
    'matchrule' => [
        'tag_id' => '100',
        'sex' => '1',
        'country' => '中国',
        'province' => '广东',
        'city' => '广州',
        'client_platform_type' => '2',
        'language' => 'zh_CN'
    ]
];

$result = Wechat::officialAccount()->menu->createConditionalMenu($menu);
print_r($result);
```

#### deleteConditionalMenu(string $menuId)

删除个性化菜单。

**参数：**
- `$menuId` - 个性化菜单 ID

**返回值：** 操作结果

**示例：**
```php
use Kylin\Wechat\Facades\Wechat;

// 删除个性化菜单
$result = Wechat::officialAccount()->menu->deleteConditionalMenu('MENU_ID');
print_r($result);
```

#### tryMatch(string $userId)

测试个性化菜单匹配结果。

**参数：**
- `$userId` - 用户的 OpenID 或微信号

**返回值：** 匹配的菜单

**示例：**
```php
use Kylin\Wechat\Facades\Wechat;

// 测试个性化菜单匹配
$menu = Wechat::officialAccount()->menu->tryMatch('o4HhH5tZ-xxxxx');
print_r($menu);
```

## 菜单类型

### 1. click

点击推事件，用户点击菜单时，微信服务器会向开发者服务器发送一个 POST 请求，开发者可以根据 `key` 值处理不同的逻辑。

**示例：**
```php
[
    'type' => 'click',
    'name' => '今日歌曲',
    'key' => 'V1001_TODAY_MUSIC'
]
```

### 2. view

跳转 URL，用户点击菜单时，直接跳转到指定的 URL。

**示例：**
```php
[
    'type' => 'view',
    'name' => '搜索',
    'url' => 'http://www.soso.com/'
]
```

### 3. miniprogram

跳转小程序，用户点击菜单时，跳转到指定的小程序。

**示例：**
```php
[
    'type' => 'miniprogram',
    'name' => '小程序',
    'url' => 'http://mp.weixin.qq.com',
    'appid' => 'wx286b93c14bbf93aa',
    'pagepath' => 'pages/lunar/index'
]
```

### 4. scancode_push

扫码推事件，用户点击菜单后，微信会弹出扫码界面，扫描后将结果发送给开发者服务器。

**示例：**
```php
[
    'type' => 'scancode_push',
    'name' => '扫码',
    'key' => 'rselfmenu_0_0'
]
```

### 5. scancode_waitmsg

扫码推事件且弹出“消息接收中”提示框，用户点击菜单后，微信会弹出扫码界面，扫描后将结果发送给开发者服务器，同时弹出“消息接收中”提示框。

**示例：**
```php
[
    'type' => 'scancode_waitmsg',
    'name' => '扫码带提示',
    'key' => 'rselfmenu_0_1'
]
```

### 6. pic_sysphoto

弹出系统拍照发图，用户点击菜单后，微信会弹出系统拍照界面，拍照后将图片发送给开发者服务器。

**示例：**
```php
[
    'type' => 'pic_sysphoto',
    'name' => '系统拍照',
    'key' => 'rselfmenu_1_0'
]
```

### 7. pic_photo_or_album

弹出拍照或者相册发图，用户点击菜单后，微信会弹出选择界面，用户可以选择拍照或者从相册中选择图片，选择后将图片发送给开发者服务器。

**示例：**
```php
[
    'type' => 'pic_photo_or_album',
    'name' => '拍照或相册',
    'key' => 'rselfmenu_1_1'
]
```

### 8. pic_weixin

弹出微信相册发图器，用户点击菜单后，微信会弹出微信相册界面，用户可以选择图片，选择后将图片发送给开发者服务器。

**示例：**
```php
[
    'type' => 'pic_weixin',
    'name' => '微信相册',
    'key' => 'rselfmenu_1_2'
]
```

### 9. location_select

弹出地理位置选择器，用户点击菜单后，微信会弹出地理位置选择界面，用户选择位置后将位置信息发送给开发者服务器。

**示例：**
```php
[
    'type' => 'location_select',
    'name' => '发送位置',
    'key' => 'rselfmenu_2_0'
]
```

### 10. media_id

下发消息（除文本消息），用户点击菜单后，微信会向用户发送指定的媒体文件。

**示例：**
```php
[
    'type' => 'media_id',
    'name' => '图片',
    'media_id' => 'MEDIA_ID'
]
```

### 11. view_limited

跳转图文消息 URL，用户点击菜单后，跳转到指定的图文消息页面。

**示例：**
```php
[
    'type' => 'view_limited',
    'name' => '图文消息',
    'media_id' => 'MEDIA_ID'
]
```

## 实际应用场景

### 1. 创建多级菜单

```php
use Kylin\Wechat\Facades\Wechat;

// 创建多级菜单
$menu = [
    'button' => [
        // 第一级菜单 1
        [
            'name' => '首页',
            'type' => 'view',
            'url' => 'http://www.example.com'
        ],
        // 第一级菜单 2
        [
            'name' => '功能',
            'sub_button' => [
                // 第二级菜单 1
                [
                    'name' => '个人中心',
                    'type' => 'view',
                    'url' => 'http://www.example.com/user'
                ],
                // 第二级菜单 2
                [
                    'name' => '我的订单',
                    'type' => 'view',
                    'url' => 'http://www.example.com/order'
                ],
                // 第二级菜单 3
                [
                    'name' => '联系我们',
                    'type' => 'click',
                    'key' => 'contact_us'
                ]
            ]
        ],
        // 第一级菜单 3
        [
            'name' => '更多',
            'sub_button' => [
                [
                    'name' => '关于我们',
                    'type' => 'view',
                    'url' => 'http://www.example.com/about'
                ],
                [
                    'name' => '帮助中心',
                    'type' => 'view',
                    'url' => 'http://www.example.com/help'
                ]
            ]
        ]
    ]
];

$result = Wechat::officialAccount()->menu->createMenu($menu);
```

### 2. 创建个性化菜单

```php
use Kylin\Wechat\Facades\Wechat;

// 创建个性化菜单（针对男性用户）
$menu = [
    'button' => [
        [
            'type' => 'view',
            'name' => '男装',
            'url' => 'http://www.example.com/men'
        ],
        [
            'type' => 'view',
            'name' => '运动',
            'url' => 'http://www.example.com/sports'
        ]
    ],
    'matchrule' => [
        'sex' => '1' // 1 表示男性
    ]
];

$result = Wechat::officialAccount()->menu->createConditionalMenu($menu);

// 创建个性化菜单（针对女性用户）
$menu = [
    'button' => [
        [
            'type' => 'view',
            'name' => '女装',
            'url' => 'http://www.example.com/women'
        ],
        [
            'type' => 'view',
            'name' => '美妆',
            'url' => 'http://www.example.com/beauty'
        ]
    ],
    'matchrule' => [
        'sex' => '2' // 2 表示女性
    ]
];

$result = Wechat::officialAccount()->menu->createConditionalMenu($menu);
```
