# ShopXO 钩子完整清单（v6.8.0）

> 从源码提取：`app/service/*.php`, `app/index/controller/*.php`, `app/admin/controller/*.php`
> 提取时间：2026-04-15
> 提取方式：`grep "hook_name = \|'plugins_" /var/www/html/app/**/*.php`

---

## 一、订单支付 — 票务插件最关键

来源：`app/service/OrderService.php`

| 钩子名称 | 触发时机 | 参数关键字段 | 票务用途 |
|---------|---------|-----------|---------|
| `plugins_service_order_pay_launch_begin` | 发起支付前 | `business_ids`, `business_data`, `payment`, `params` | 支付前预处理 |
| `plugins_service_order_pay_launch_handle` | 支付方式处理 | 同上 | 扩展支付方式 |
| `plugins_service_order_pay_notify_handle` | 支付回调通知 | `business_ids`, `business_data` | **★ 支付成功，最佳入场点** |
| `plugins_service_order_pay_handle_begin` | 支付成功后开始 | `business_data`, `payment` | 支付成功业务处理开始 |
| `plugins_service_order_pay_success_handle_end` | 支付成功处理结束 | `business_data` | **★ 支付完全成功，生成票务记录** |
| `plugins_service_order_total_begin` | 订单总价计算前 | `goods`, `params` | 修改商品价格/附加费用 |
| `plugins_service_order_status_change_history_success_handle` | 订单状态变更历史 | `order_id`, `old_status`, `new_status` | 监听状态变化 |
| `plugins_service_order_delete_success` | 订单删除成功 | `order_id` | 清理关联票务数据 |

---

## 二、商品详情页（前端）— 票务 UI 注入点

来源：`app/index/controller/Goods.php`

| 钩子名称 | 位置描述 | 最佳注入 |
|---------|---------|---------|
| `plugins_view_goods_detail_base_top` | 商品基础信息区顶部 | |
| `plugins_view_goods_detail_base_sku_top` | SKU/规格选择区顶部 | **★ 票务选座最佳注入点** |
| `plugins_view_goods_detail_base_inventory_top` | 库存显示区顶部 | |
| `plugins_view_goods_detail_base_inventory_bottom` | 库存显示区底部 | |
| `plugins_view_goods_detail_base_buy_nav_min_inside_begin` | 购买按钮区内部前 | |
| `plugins_view_goods_detail_base_buy_nav_min_inside` | 购买按钮区内部后 | |
| `plugins_view_goods_detail_base_bottom` | 商品基础信息区底部 | |
| `plugins_view_goods_detail_panel_original_price_top` | 原价上方 | |
| `plugins_view_goods_detail_panel_price_top` | 现价上方 | |
| `plugins_view_goods_detail_panel_price_bottom` | 现价下方 | |
| `plugins_view_goods_detail_panel_bottom` | 购买面板底部 | |
| `plugins_view_goods_detail_photo_within` | 相册内部 | |
| `plugins_view_goods_detail_photo_bottom` | 相册底部 | |
| `plugins_view_goods_detail_buy_nav_top` | 购买导航顶部 | |
| `plugins_view_goods_detail_right_content_top` | 右侧内容顶部 | |
| `plugins_view_goods_detail_right_content_bottom` | 右侧内容底部 | |
| `plugins_view_goods_detail_right_content_inside_top` | 右侧内容内部顶部 | |
| `plugins_view_goods_detail_right_content_inside_bottom` | 右侧内容内部底部 | |
| `plugins_view_goods_detail_tabs_top` | 标签页顶部 | |
| `plugins_view_goods_detail_tabs_content` | 标签页内容 | |
| `plugins_view_goods_detail_tabs_comments_top` | 评论区顶部 | |
| `plugins_view_goods_detail_tabs_comments_bottom` | 评论区底部 | |
| `plugins_view_goods_detail_tabs_guess_like_top` | 猜你喜欢顶部 | |
| `plugins_view_goods_detail_tabs_guess_like_bottom` | 猜你喜欢底部 | |
| `plugins_view_goods_detail_tabs_bottom` | 标签页底部 | |
| `plugins_view_goods_detail_content_top` | 商品详情内容顶部 | |
| `plugins_view_goods_detail_content_bottom` | 商品详情内容底部 | |
| `plugins_view_goods_detail_left_top` | 左侧区域顶部 | |
| `plugins_view_goods_detail_title` | 商品标题区 | |

---

## 三、购物车/结算页（前端）

来源：`app/index/controller/Buy.php`

| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_view_buy_top` | 结算页顶部 |
| `plugins_view_buy_inside_top` | 结算内容区顶部 |
| `plugins_view_buy_address_bottom` | 收货地址下方 |
| `plugins_view_buy_payment_bottom` | 支付方式下方 |
| `plugins_view_buy_group_goods_bottom` | 商品分组下方 |
| `plugins_view_buy_user_note_bottom` | 用户备注下方 |
| `plugins_view_buy_base_confirm_top` | 确认信息顶部 |
| `plugins_view_buy_form_inside` | 表单内部 |
| `plugins_view_buy_inside_bottom` | 结算内容区底部 |
| `plugins_view_buy_bottom` | 结算页底部 |

---

## 四、用户中心（前端）

来源：`app/index/controller/User.php`

| 钩子名称 | 位置描述 | 票务用途 |
|---------|---------|---------|
| `plugins_view_user_center_top` | 用户中心顶部 | |
| `plugins_view_user_base_bottom` | 用户基础信息底部 | |
| `plugins_view_user_various_top` | 聚合内容顶部 | |
| `plugins_view_user_various_bottom` | 聚合内容底部 | |
| `plugins_view_user_various_inside_top` | 聚合内容内部顶部 | **★ 票夹最佳注入点** |
| `plugins_view_user_various_inside_bottom` | 聚合内容内部底部 | |

---

## 五、全局页面（前端）

来源：`app/index/controller/Common.php`

### CSS/JS 加载钩子
| 钩子名称 | 用途 |
|---------|------|
| `plugins_css` | 全局 CSS |
| `plugins_js` | 全局 JS |

### 全局视图钩子
| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_common_header` | 全局头部 |
| `plugins_common_header_css` | 头部 CSS |
| `plugins_common_header_javascript` | 头部 JS |
| `plugins_common_page_bottom` | 全局页面底部 |
| `plugins_view_common_top` | 全局页面顶部 |
| `plugins_view_common_bottom` | 全局页面底部 |
| `plugins_view_common_top_header` | 头部内顶部 |
| `plugins_view_common_bottom_footer` | 底部内 |

### 头部导航钩子
| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_view_header_navigation_top_left_begin` | 导航左上起始 |
| `plugins_view_header_navigation_top_left_end` | 导航左上结束 |
| `plugins_view_header_navigation_top_right_begin` | 导航右上起始 |
| `plugins_view_header_navigation_top_right_end` | 导航右上结束 |
| `plugins_view_common_header_nav_left` | 导航左侧 |
| `plugins_view_common_header_nav_search_inside` | 搜索框内部 |
| `plugins_view_common_header_nav_content_inside_top` | 导航内容顶部 |
| `plugins_view_common_header_nav_content_inside_bottom` | 导航内容底部 |
| `plugins_view_common_header_nav_right` | 导航右侧 |
| `plugins_view_common_logo_right` | Logo 右侧 |
| `plugins_view_common_search_right` | 搜索框右侧 |
| `plugins_view_common_search_inside_left` | 搜索框内部左侧 |
| `plugins_view_common_search_inside_right` | 搜索框内部右侧 |

### 登录/注册页钩子
| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_view_user_login_content_inside_top` | 登录内容内部顶部 |
| `plugins_view_user_login_content_inside_bottom` | 登录内容内部底部 |
| `plugins_view_user_login_info_top` | 登录信息区域顶部 |
| `plugins_view_user_login_inside_bottom` | 登录区域内部底部 |
| `plugins_view_user_login_inside_reg_bottom` | 注册登录区域底部 |
| `plugins_view_user_login_content_bottom` | 登录内容底部 |
| `plugins_view_user_reg_info` | 注册信息区域 |
| `plugins_view_user_reg_info_top` | 注册信息顶部 |
| `plugins_view_user_reg_info_inside_bottom` | 注册信息内部底部 |
| `plugins_view_user_reg_info_inside_login_bottom` | 注册内登录底部 |
| `plugins_view_user_reg_info_bottom` | 注册信息底部 |

### 底部钩子
| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_view_common_footer_top` | 页脚顶部 |

---

## 六、首页楼层（前端）

来源：`app/index/controller/Index.php`

| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_view_home_floor_top` | 首页楼层顶部 |
| `plugins_view_home_floor_bottom` | 首页楼层底部 |
| `plugins_view_home_banner_mixed_bottom` | 混合 Banner 底部 |

---

## 七、搜索页（前端）

来源：`app/index/controller/Search.php`

| 钩子名称 | 位置描述 |
|---------|---------|
| `plugins_view_search_top` | 搜索页顶部 |
| `plugins_view_search_bottom` | 搜索页底部 |
| `plugins_view_search_inside_top` | 搜索结果区顶部 |
| `plugins_view_search_inside_bottom` | 搜索结果区底部 |
| `plugins_view_search_data_top` | 商品列表顶部 |
| `plugins_view_search_data_bottom` | 商品列表底部 |
| `plugins_view_search_map_top` | 地图区域顶部 |
| `plugins_view_search_nav_top` | 筛选导航顶部 |
| `plugins_view_search_nav_inside_begin` | 筛选导航内部起始 |
| `plugins_view_search_nav_inside_end` | 筛选导航内部结束 |
| `plugins_view_search_map_inside_begin` | 地图内部起始 |
| `plugins_view_search_map_inside_base_bottom` | 地图基础内容底部 |
| `plugins_view_search_map_inside_end` | 地图内部结束 |

---

## 八、服务层钩子（业务逻辑）

来源：`app/service/GoodsService.php`

| 钩子名称 | 触发时机 | 票务用途 |
|---------|---------|---------|
| `plugins_service_goods_data` | 商品数据读取 | |
| `plugins_service_goods_spec_data` | 商品规格数据 | **★ 票务座位规格注入** |
| `plugins_service_goods_parameters_data` | 商品参数数据 | |
| `plugins_service_goods_content_app_data` | 商品详情 APP 数据 | |
| `plugins_service_home_floor_data_begin` | 首页楼层数据前 | |
| `plugins_service_category_goods_total_begin` | 分类商品总数前 | |
| `plugins_service_category_goods_list_begin` | 分类商品列表前 | |
| `plugins_service_goods_list_begin` | 商品列表前 | |
| `plugins_service_goods_total_begin` | 商品总数前 | |
| `plugins_service_goods_list_handle_begin` | 商品列表处理开始 | |
| `plugins_service_goods_handle_begin` | 商品处理开始 | |
| `plugins_service_goods_handle_end` | 商品处理结束 | |
| `plugins_service_goods_list_handle_end` | 商品列表处理结束 | |
| `plugins_service_goods_save_handle` | 商品保存处理 | |
| `plugins_service_goods_save_thing_begin` | 商品保存项目开始 | |
| `plugins_service_goods_save_thing_end` | 商品保存项目结束 | |
| `plugins_service_goods_save_end` | 商品保存结束 | |
| `plugins_service_goods_base_update` | 商品基础更新 | |
| `plugins_service_goods_delete` | 商品删除 | |
| `plugins_service_goods_field_status_update` | 商品字段状态更新 | |
| `plugins_service_goods_spec_base` | 商品规格基础 | |
| `plugins_service_goods_spec_type` | 商品规格类型 | |
| `plugins_service_goods_spec_extends_handle` | 商品规格扩展处理 | |
| `plugins_service_goods_buy_left_nav_handle` | 购买左侧导航处理 | |
| `plugins_service_goods_buy_nav_button_handle` | 购买导航按钮处理 | |
| `plugins_service_goods_detail_middle_tabs_nav_handle` | 详情页标签导航处理 | |
| `plugins_service_goods_search_list_begin` | 商品搜索列表开始 | |
| `plugins_service_goods_base_forbid_operate_data` | 商品禁止操作数据 | |
| `plugins_service_goods_params_operate_data` | 商品参数操作数据 | |
| `plugins_service_goods_spec_operate_data` | 商品规格操作数据 | |

---

## 九、服务层钩子（订单）

来源：`app/service/OrderService.php`

| 钩子名称 | 触发时机 |
|---------|---------|
| `plugins_service_order_pay_launch_begin` | 发起支付前 |
| `plugins_service_order_pay_launch_handle` | 支付方式处理 |
| `plugins_service_order_pay_notify_handle` | 支付通知处理 |
| `plugins_service_order_pay_handle_begin` | 支付成功开始处理 |
| `plugins_service_order_pay_success_handle_end` | 支付成功处理结束 |
| `plugins_service_order_total_begin` | 订单总价计算前 |
| `plugins_service_order_status_group_total_begin` | 订单状态分组统计前 |
| `plugins_service_order_list_begin` | 订单列表前 |
| `plugins_service_order_list_handle_begin` | 订单列表处理开始 |
| `plugins_service_order_handle_begin` | 订单处理开始 |
| `plugins_service_order_handle_end` | 订单处理结束 |
| `plugins_service_order_list_handle_end` | 订单列表处理结束 |
| `plugins_service_order_detail_data` | 订单详情数据 |
| `plugins_service_order_extraction_data` | 订单提取数据（取货码） |
| `plugins_service_order_trace_source_data` | 订单溯源数据 |
| `plugins_service_order_service_data` | 订单服务数据 |
| `plugins_service_order_express_data` | 订单快递数据 |
| `plugins_service_order_address_data` | 订单地址数据 |
| `plugins_service_order_status_change_history_success_handle` | 订单状态变更历史 |
| `plugins_service_order_delete_success` | 订单删除成功 |

---

## 十、服务层钩子（其他）

来源：`app/service/AppHomeNavService.php`, `app/service/DiyService.php`

| 钩子名称 | 来源 | 触发时机 |
|---------|------|---------|
| `plugins_service_app_home_navigation_{client_type}` | AppHomeNavService | 首页导航（client_type=pc/h5/weixin_mp等） |
| `plugins_module_diy_view_data_handle` | DiyModule | DIY 视图数据处理 |
| `plugins_module_diy_save_data_handle` | DiyModule | DIY 保存数据处理 |
| `plugins_layout_service_url_value_begin` | LayoutModule | 布局服务 URL 值前 |
| `plugins_layout_service_url_value_handle` | LayoutModule | 布局服务 URL 值处理 |
| `plugins_layout_service_search_goods_begin` | LayoutModule | 布局搜索商品前 |
| `plugins_layout_service_goods_data_begin` | LayoutModule | 布局商品数据前 |
| `plugins_layout_service_pages_list` | LayoutModule | 布局页面列表 |

---

## 十一、后台管理钩子

来源：`app/admin/controller/Common.php`

### 全局 CSS/JS 钩子
| 钩子名称 | 用途 |
|---------|------|
| `plugins_admin_css` | 后台全局 CSS |
| `plugins_admin_js` | 后台全局 JS |
| `plugins_admin_common_header` | 后台头部 |
| `plugins_admin_common_header_css` | 后台头部 CSS |
| `plugins_admin_common_header_javascript` | 后台头部 JS |
| `plugins_admin_common_page_bottom` | 后台页面底部 |
| `plugins_admin_view_common_top` | 后台页面顶部 |
| `plugins_admin_view_common_bottom` | 后台页面底部 |

### 后台表单钩子
| 钩子名称 | 来源控制器 |
|---------|---------|
| `plugins_view_admin_goods_save` | Goods.php — 商品保存 |
| `plugins_view_admin_user_save` | User.php — 用户保存 |
| `plugins_view_admin_admin_save` | Admin.php — 管理员保存 |
| `plugins_view_admin_login_info` | Admin.php — 登录页 |
| `plugins_view_admin_role_save` | Role.php — 角色保存 |

---

## 十二、VR 票务插件 — 推荐钩子使用方案

### 方案 A：支付成功立即生成票（最可靠）

**使用钩子**: `plugins_service_order_pay_notify_handle` 或 `plugins_service_order_pay_success_handle_end`

```php
// Event.php
public function PayNotifyHandle($params = [])
{
    // $params['business_data'] 包含订单数据
    // $params['business_ids'] 包含订单ID列表
    $order_id = $params['business_ids'][0] ?? 0;
    $order = Db::name('order')->find($order_id);
    
    if ($order['pay_status'] == 1) {
        // 1. 原子扣 vr_sessions 库存
        // 2. 生成 vr_tickets（AES QR）
        // 3. 写入 vr_attendees
    }
}
```

### 方案 B：商品详情页注入票务选座 UI

**使用钩子**: `plugins_view_goods_detail_base_sku_top`

```php
// view/Goods.php
public static function PluginsViewGoodsDetailBaseSkuTop($params)
{
    $goods = $params['goods'];
    if (empty($goods['item_type']) || $goods['item_type'] != 'ticket') {
        return '';
    }
    return '<div id="ticket-seat-map" data-goods-id="'.$goods['id'].'"></div>';
}
```

### 方案 C：用户中心票夹

**使用钩子**: `plugins_view_user_various_inside_top`

```php
// view/User.php
public static function PluginsViewUserVariousInsideTop($params)
{
    return '<div id="ticket-wallet"></div>';
}
```

---

## 十三、钩子注册方式（config.json）

```json
{
  "base": {
    "name": "VR票务",
    "plugins": "vr_ticket"
  },
  "hook": {
    "plugins_service_order_pay_success_handle_end": [
      "\\app\\plugins\\vr_ticket\\Event::PaySuccess"
    ],
    "plugins_view_goods_detail_base_sku_top": [
      "\\app\\plugins\\vr_ticket\\view\\Goods::PluginsViewGoodsDetailBaseSkuTop"
    ],
    "plugins_view_user_various_inside_top": [
      "\\app\\plugins\\vr_ticket\\view\\User::PluginsViewUserVariousInsideTop"
    ]
  },
  "backend_hook": {
    "plugins_view_admin_goods_save": [
      "\\app\\plugins\\vr_ticket\\hook\\AdminGoodsSave"
    ]
  }
}
```
