加载中…
文档目录
插件开发指南

简介

本指南面向DouPHP插件开发者,聚焦于"支付类插件"的完整开发流程与规范。内容涵盖:

  • 插件目录结构与命名约定
  • 配置文件 manifest.php 的结构与参数定义
  • Provider 与 Service 的职责划分、接口契约、方法签名、异常处理与日志记录最佳实践
  • 全新 后台导航配置系统(使用 admin/nav/*.php 文件实现声明式菜单管理)
  • 从简单功能到复杂业务的示例路径指引
  • 调试技巧、测试方法、性能优化建议
  • 代码规范、安全注意事项与兼容性要求

项目结构

DouPHP 将插件统一放置在 plugin 目录下,每个插件一个独立子目录,包含:

  • manifest.php:插件元数据与入口声明
  • XxxProvider.php:实现系统定义的 Provider 接口,作为系统调用入口
  • XxxService.php:承载具体业务逻辑(对接第三方SDK、组装请求、处理回调等)
  • 可选:sdk/、cert/、img/、qrcode.php 等扩展资源
  • 新增 admin/nav/*.php:后台导航配置文件(用于模块安装时自动注册导航菜单)
graph TB
subgraph "插件目录"
M["manifest.php"]
P["XxxProvider.php"]
S["XxxService.php"]
N["admin/nav/*.php"]
SDK["sdk/ 或第三方库"]
RES["其他资源(证书/图片/脚本)"]
end
M --> P
P --> S
S --> SDK
S --> RES
N --> M

章节来源

  • plugin/wxpay/manifest.php:1-11
  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473
  • admin/nav/ai.php:1-49

核心组件

  • 插件清单 manifest.php
    • 必须返回数组,至少包含:
      • plugin_group:插件分组标识(如 payment)
      • provider:Provider 类的完全限定名
  • Provider 类
    • 实现 PaymentPluginProviderInterface(基础支付能力)
    • 可选实现 ReconcilablePaymentProviderInterface(支持主动对账查询)
    • 可选实现 PollablePaymentProviderInterface(支持轮询状态,如扫码支付)
    • 必须提供:pluginId()、meta()、start()、notify()、finish()
    • 若实现查询接口,需提供 query();若实现轮询接口,需提供 status()
  • Service 类
    • 封装具体业务逻辑:构造请求、调用第三方SDK、解析响应、落库、写日志、跳转URL等
    • 通过依赖注入获取系统服务(如 PaymentService)

章节来源

  • core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
  • core/infra/plugin/Contract/ReconcilablePaymentProviderInterface.php
  • core/infra/plugin/Contract/PollablePaymentProviderInterface.php
  • plugin/alipay/AlipayProvider.php:1-111
  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/cod/CodProvider.php:1-92

架构总览

支付插件在系统中的调用链路如下:

  • 前端发起支付 -> 路由到插件入口 -> Provider.start() -> Service.start() 生成支付页面/链接
  • 第三方支付异步通知 -> 路由到插件 notify -> Provider.notify() -> Service.notify() 验签并推进订单状态
  • 同步回跳 -> 路由到插件 finish -> Provider.finish() -> Service.finish() 返回用户应跳转的页面
  • 主动对账/轮询 -> 系统调度 query()/status() -> Service.query()/status() 查询并更新状态
sequenceDiagram
participant U as "用户浏览器"
participant SYS as "DouPHP 系统"
participant PRV as "XxxProvider"
participant SVC as "XxxService"
participant EXT as "第三方SDK/平台"
U->>SYS : 发起支付
SYS->>PRV : start(PaymentRequest)
PRV->>SVC : start(request)
SVC->>EXT : 创建订单/获取支付参数
EXT-->>SVC : 支付参数/二维码/链接
SVC-->>PRV : HTML/URL
PRV-->>U : 渲染支付页或重定向
EXT-->>SYS : 异步通知
SYS->>PRV : notify(PaymentCallbackPayload)
PRV->>SVC : notify(payload)
SVC->>EXT : 验签/确认
SVC-->>SYS : success/fail
SYS-->>EXT : 返回确认结果
U->>SYS : 同步回跳
SYS->>PRV : finish(PaymentCallbackPayload)
PRV->>SVC : finish(payload)
SVC-->>PRV : 跳转URL
PRV-->>U : 重定向到订单页

图表来源

  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473
  • plugin/alipay/AlipayProvider.php:1-111

详细组件分析

微信支付插件(wxpay)

  • 目录职责
    • manifest.php:声明分组 payment 与 Provider 类
    • WxpayProvider.php:实现支付、通知、回跳、轮询、对账等能力
    • WxpayService.php:按 UA 分流 JSAPI/H5/Native,调用微信SDK,处理回调与轮询,写入日志,跳转订单页
  • 关键流程
    • start:根据 UA 选择 JSAPI/H5/Native,生成支付参数或二维码
    • notify:加载SDK并验签,成功后通过 PaymentService 标记成功
    • finish:返回订单详情页URL
    • status:Native 扫码轮询,按 paymentSn 查询微信并推进状态
    • query:主动对账,返回成功/失败/未找到/待支付等结果
classDiagram
class WxpayProvider {
+pluginId() string
+meta() array
+start(request) string
+notify(payload) string
+finish(payload) string
+status(payload) string
+query(request) PaymentQueryResult
}
class WxpayService {
+start(request) string
+notify(payload) string
+finish(payload) string
+status(payload) string
+query(request) PaymentQueryResult
-callOrderQuery(paymentSn) array|null
-buildConfig() array
-bootSdk(files) void
-initLog() void
}
WxpayProvider --> WxpayService : "委托业务逻辑"

图表来源

  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473

章节来源

  • plugin/wxpay/manifest.php:1-11
  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473

支付宝插件(alipay)

  • 目录职责
    • manifest.php:声明分组 payment 与 Provider 类
    • AlipayProvider.php:实现基础支付能力与主动对账
  • 关键流程
    • start:生成PC端支付页面/链接
    • notify:接收并处理支付宝异步通知
    • finish:返回用户应跳转的页面
    • query:主动对账,返回交易状态
sequenceDiagram
participant U as "用户浏览器"
participant SYS as "DouPHP 系统"
participant AP as "AlipayProvider"
participant AS as "AlipayService"
participant ALI as "支付宝SDK/平台"
U->>SYS : 发起支付
SYS->>AP : start(request)
AP->>AS : start(request)
AS->>ALI : 创建订单/获取支付参数
ALI-->>AS : 支付参数/链接
AS-->>AP : HTML/URL
AP-->>U : 渲染或重定向
ALI-->>SYS : 异步通知
SYS->>AP : notify(payload)
AP->>AS : notify(payload)
AS->>ALI : 验签/确认
AS-->>SYS : success/fail
SYS-->>ALI : 返回确认结果

图表来源

  • plugin/alipay/AlipayProvider.php:1-111

章节来源

  • plugin/alipay/manifest.php:1-11
  • plugin/alipay/AlipayProvider.php:1-111

货到付款插件(cod)

  • 目录职责
    • manifest.php:声明分组 payment 与 Provider 类
    • CodProvider.php:实现基础支付能力(无第三方回调)
  • 关键流程
    • start:展示货到付款提示与下单按钮
    • notify:无第三方回调,直接返回 fail
    • finish:返回首页或订单列表
flowchart TD
Start(["开始"]) --> Show["显示货到付款提示"]
Show --> UserAction{"用户是否完成线下付款?"}
UserAction --> |否| Cancel["取消/返回"]
UserAction --> |是| Finish["finish() 返回首页"]
Cancel --> End(["结束"])
Finish --> End

图表来源

  • plugin/cod/CodProvider.php:1-92

章节来源

  • plugin/cod/manifest.php:1-11
  • plugin/cod/CodProvider.php:1-92

后台导航配置

全新 DouPHP 引入了基于 admin/nav/*.php 文件的声明式导航配置系统,替代了传统的基于路由的导航DSL配置。

导航配置架构

新的导航系统采用声明式配置方式,每个模块可以在自己的 admin/nav/<module>.php 文件中定义后台子菜单族。这些配置文件由 AdminMenuRegistry::subMenus() 在启动时自动发现和装配,实现了灵活可扩展的菜单管理机制。

导航配置文件结构

每个导航配置文件返回一个包含以下字段的数组:

return array(
    'title' => '模块标题',           // 语言键,显示为菜单组标题
    'icon' => 'bi-icon-name',      // Bootstrap Icons 图标类名
    'items' => array(              // 子菜单项数组
        array(
            'key' => 'item_key',   // 唯一标识符
            'name' => 'lang_key',  // 语言键,显示名称
            'link' => 'route.name',// 路由名
            'match' => array('route.*'), // 路由匹配模式
            'exclude' => array(),  // 排除模式
            'when' => array(),     // 可见条件
            'params' => array(),   // 路由参数
            'renders' => null,     // 指定渲染的族
            'source' => null,      // 动态项源
        ),
    ),
);

完整模块导航配置示例

AI模块导航配置

AI模块提供了完整的后台导航配置,包含AI模型管理、任务管理等子菜单:

return array(
    'title' => 'ai',
    'icon' => 'bi-robot',
    'items' => array(
        array(
            'key' => 'ai', 'name' => 'ai', 'link' => 'admin.ai',
            'match' => array('admin.ai.*', 'admin.ai_generate.*'),
        ),
        array(
            'key' => 'model', 'name' => 'ai_model', 'link' => 'admin.ai.model',
            'match' => array('admin.ai.model.*', 'admin.ai.key.*'),
        ),
        array(
            'key' => 'log', 'name' => 'ai_log', 'link' => 'admin.ai.log',
            'match' => array('admin.ai.log.*'),
        ),
        array(
            'key' => 'task', 'name' => 'ai_task', 'link' => 'admin.ai.task',
            'match' => array('admin.ai.task.*'),
        ),
    ),
);

预约模块导航配置

预约模块展示了复杂的导航配置,包括作品管理、排班管理、规则设置等功能:

return array(
    'title' => 'book',
    'icon' => 'bi-book',
    'items' => array(
        array(
            'key' => 'book', 'name' => 'book', 'link' => 'admin.book',
            'match' => array('admin.book.*'), 'exclude' => array('admin.book.work.*'),
        ),
        array('key' => 'item', 'name' => 'book_item', 'link' => 'admin.book.item', 'match' => array('admin.book.item.*')),
        array('key' => 'schedule', 'name' => 'book_schedule', 'link' => 'admin.book.schedule', 'match' => array('admin.book.schedule.*')),
        array(
            'key' => 'rule', 'name' => 'book_rule', 'link' => 'admin.book.rule',
            'match' => array('admin.book.rule.*', 'admin.book.rule_slot.*'),
        ),
        array('key' => 'class', 'name' => 'book_class', 'link' => 'admin.book.class', 'match' => array('admin.book.class.*')),
        array('key' => 'contact', 'name' => 'book_contact', 'link' => 'admin.book.contact', 'match' => array('admin.book.contact.*')),
        array('key' => 'blacklist', 'name' => 'book_blacklist', 'link' => 'admin.book.blacklist', 'match' => array('admin.book.blacklist.*')),
        array(
            'key' => 'set', 'name' => 'book_set', 'link' => 'admin.book.set',
            'match' => array('admin.book.set'),
        ),
    ),
);

聊天模块导航配置

聊天模块包含了会话管理、知识库、套餐订阅等完整功能:

return array(
    'title' => 'chat',
    'icon' => 'bi-chat',
    'items' => array(
        array('key' => 'chat', 'name' => 'chat', 'link' => 'admin.chat', 'match' => array('admin.chat.*')),
        array('key' => 'session', 'name' => 'chat_session', 'link' => 'admin.chat.session', 'match' => array('admin.chat.session.*')),
        array(
            'key' => 'knowledge', 'name' => 'chat_knowledge', 'link' => 'admin.chat.knowledge',
            'match' => array('admin.chat.knowledge.*', 'admin.chat_knowledge.category.*'),
        ),
        array('key' => 'package', 'name' => 'chat_package', 'link' => 'admin.chat.package', 'match' => array('admin.chat.package.*')),
        array('key' => 'subscription', 'name' => 'chat_subscription', 'link' => 'admin.chat.subscription', 'match' => array('admin.chat.subscription.*')),
        array('key' => 'quota', 'name' => 'chat_quota', 'link' => 'admin.chat.quota', 'match' => array('admin.chat.quota.*')),
        array('key' => 'usage_log', 'name' => 'chat_usage_log', 'link' => 'admin.chat.usage_log', 'match' => array('admin.chat.usage_log.*')),
        array('key' => 'daily_stats', 'name' => 'chat_daily_stats', 'link' => 'admin.chat.daily_stats', 'match' => array('admin.chat.daily_stats.*')),
        array('key' => 'task', 'name' => 'chat_task', 'link' => 'admin.chat.task', 'match' => array('admin.chat.task.*')),
    ),
);

分销模块导航配置

分销模块专注于分销体系管理,包含申请、奖励、等级等核心功能:

return array(
    'title' => 'distribution',
    'icon' => 'bi-diagram-3',
    'items' => array(
        array('key' => 'people', 'name' => 'distribution_apply', 'link' => 'admin.distribution', 'match' => array('admin.distribution.*')),
        array('key' => 'reward', 'name' => 'distribution_reward', 'link' => 'admin.distribution.reward', 'match' => array('admin.distribution.reward.*')),
        array('key' => 'level', 'name' => 'distribution_level', 'link' => 'admin.distribution.level', 'match' => array('admin.distribution.level.*')),
        array('key' => 'level_log', 'name' => 'distribution_level_log_manager', 'link' => 'admin.distribution.level_log', 'match' => array('admin.distribution.level_log.*')),
    ),
);

用户模块导航配置

用户模块提供了完整的用户管理体系,包含联系人、日志、等级等管理功能:

return array(
    'title' => 'user',
    'icon' => 'bi-people',
    'items' => array(
        array(
            'key' => 'user', 'name' => 'user', 'link' => 'admin.user',
            'match' => array('admin.user.*'),
        ),
        array('key' => 'user_center_placeholder', 'source' => 'user_center'),
        array(
            'key' => 'contact', 'name' => 'user_contact_manager', 'link' => 'admin.user.contact',
            'match' => array('admin.user.contact.*'),
        ),
        array(
            'key' => 'log', 'name' => 'user_log_manager', 'link' => 'admin.user.log',
            'match' => array('admin.user.log.*'),
        ),
        array(
            'key' => 'level_log', 'name' => 'user_level_log_manager', 'link' => 'admin.user.level_log',
            'match' => array('admin.user.level_log.*'),
        ),
    ),
);

微信模块导航配置

微信模块集成了微信公众号管理功能,包含菜单、媒体、系统等管理:

return array(
    'title' => 'weixin',
    'icon' => 'bi-weixin',
    'items' => array(
        array('key' => 'menu', 'name' => 'weixin_menu', 'link' => 'admin.weixin.menu', 'match' => array('admin.weixin.menu.*')),
        array(
            'key' => 'media', 'name' => 'weixin_media', 'link' => 'admin.weixin.media',
            'match' => array('admin.weixin.media.*', 'admin.weixin_media.*'),
        ),
        array('key' => 'system', 'name' => 'weixin_system', 'link' => 'admin.weixin.system', 'match' => array('admin.weixin.system.*')),
    ),
);

导航匹配规则

导航系统使用灵活的匹配规则来确定当前页面的激活状态:

  • 段边界通配:admin.user.* 匹配 admin.user 及其任意层下级
  • 精确匹配:admin.user.log 精确匹配特定路由
  • 尾缀兼容:admin.user.contact.* 同时匹配 admin.user.contact 本身
  • 排除规则:使用 exclude 字段排除特定路由
  • 条件显示:使用 when 字段控制菜单项的可见性

导航装配流程

导航配置的生命周期如下:

sequenceDiagram
participant FS as "文件系统"
participant REG as "AdminMenuRegistry"
participant RES as "AdminNavResolver"
participant UI as "后台界面"
FS->>REG : 扫描 admin/nav/*.php
REG->>REG : include 导航配置文件
REG->>RES : 提供导航族数据
RES->>RES : 计算当前路由匹配
RES->>UI : 返回激活状态和菜单结构

图表来源

  • admin/service/menu/AdminMenuRegistry.php:77-159
  • admin/service/menu/AdminNavResolver.php:64-136

插件集成导航配置

对于需要后台管理界面的插件,可以按照以下步骤集成导航配置:

  1. 创建导航配置文件:在插件根目录创建 admin/nav/<module>.php
  2. 定义菜单结构:按照上述格式定义菜单项
  3. 配置路由匹配:确保 match 数组中的路由与实际路由一致
  4. 添加语言包:为菜单项添加相应的语言翻译
  5. 测试验证:安装插件后检查后台菜单是否正确显示

章节来源

  • admin/nav/ai.php:1-49
  • admin/nav/book.php:1-52
  • admin/nav/chat.php:1-45
  • admin/nav/distribution.php:1-38
  • admin/nav/user.php:1-52
  • admin/nav/weixin.php:1-39
  • admin/service/menu/AdminMenuRegistry.php:1-298
  • admin/service/menu/AdminNavResolver.php:1-455

依赖关系分析

  • 插件清单与Provider绑定
    • manifest.php 中的 provider 字段指向具体类,系统据此实例化并调用
  • Provider 与 Service 解耦
    • Provider 仅负责接口契约与参数传递,Service 承载业务细节
  • 接口契约约束
    • PaymentPluginProviderInterface:基础支付能力
    • ReconcilablePaymentProviderInterface:支持主动对账
    • PollablePaymentProviderInterface:支持轮询状态(如扫码支付)
  • 新增 导航配置与模块注册
    • admin/nav/*.php 文件随模块安装自动注册到导航系统
    • AdminMenuRegistry 负责发现和装配导航配置
graph LR
MAN["manifest.php"] --> PROV["XxxProvider"]
PROV --> IF1["PaymentPluginProviderInterface"]
PROV --> IF2["ReconcilablePaymentProviderInterface?"]
PROV --> IF3["PollablePaymentProviderInterface?"]
PROV --> SVC["XxxService"]
NAV["admin/nav/*.php"] --> REG["AdminMenuRegistry"]
REG --> RES["AdminNavResolver"]
RES --> UI["后台界面"]

图表来源

  • plugin/wxpay/manifest.php:1-11
  • plugin/alipay/AlipayProvider.php:1-111
  • plugin/wxpay/WxpayProvider.php:1-127
  • core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
  • admin/service/menu/AdminMenuRegistry.php:77-159

章节来源

  • plugin/wxpay/manifest.php:1-11
  • plugin/alipay/manifest.php:1-11
  • core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67

性能考虑

  • 按需加载SDK:仅在需要时引入第三方SDK文件,避免全局加载开销
  • 合理日志:将敏感信息脱敏后落盘,控制日志级别与滚动策略
  • 减少重复网络请求:对同一订单的轮询进行节流与去抖
  • 使用系统服务:通过 PaymentService 统一推进订单状态,避免重复逻辑
  • 配置缓存:插件配置读取可结合系统缓存机制(如有)
  • 新增 导航配置缓存:导航配置在请求级缓存,避免重复扫描文件系统

故障排查指南

  • 常见问题定位
    • 插件未生效:检查 manifest.php 中 provider 类是否存在且命名空间正确
    • 回调失败:核对 notifyUrl 是否正确注册,验签逻辑是否一致
    • 轮询无效:确认 status() 中 paymentSn 来源与查询条件
    • 对账不一致:检查 query() 返回状态映射与原始报文保存
    • 新增 导航不显示:检查 admin/nav/*.php 文件格式和路由匹配规则
  • 日志查看
    • 微信支付日志位于 storage/log/payment/wxpay/ 下,按日期分文件
  • 调试建议
    • 在 Service 中记录关键参数与返回值(注意脱敏)
    • 使用浏览器开发者工具观察前端JS轮询与跳转行为
    • 模拟第三方回调(本地代理或内网穿透)验证 notify/finish
    • 新增 使用 AdminMenuRegistry::subMenus() 调试导航配置

章节来源

  • plugin/wxpay/WxpayService.php:433-455

结论

DouPHP 插件体系通过清晰的目录规范、统一的接口契约与 Provider/Service 职责分离,使支付插件具备高内聚、低耦合、易扩展的特点。全新的后台导航配置系统进一步简化了模块的后台管理界面集成,通过声明式的配置文件实现了灵活可扩展的导航机制。遵循本指南可实现从简单到复杂的各类支付插件,并确保稳定性、可维护性与安全性。

附录

插件目录结构规范

  • 必需文件
    • manifest.php:返回 plugin_group 与 provider
    • XxxProvider.php:实现系统接口
    • XxxService.php:实现业务逻辑
  • 推荐组织
    • sdk/:第三方SDK或库
    • cert/:证书文件(如微信支付证书)
    • img/:插件相关图片资源
    • qrcode.php:二维码生成或展示脚本(可选)
  • 新增 后台管理界面
    • admin/nav/*.php:后台导航配置文件(可选,用于模块安装时自动注册导航菜单)

章节来源

  • plugin/wxpay/manifest.php:1-11
  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473
  • admin/nav/ai.php:1-49

manifest.php 结构与参数

  • 必填键
    • plugin_group:插件分组(如 payment)
    • provider:Provider 类完全限定名
  • 说明
    • 该文件由系统加载以发现并实例化插件

章节来源

  • plugin/wxpay/manifest.php:1-11
  • plugin/alipay/manifest.php:1-11
  • plugin/cod/manifest.php:1-11

Provider 与 Service 实现规范

  • Provider
    • 实现 PaymentPluginProviderInterface 基础方法
    • 可选实现 ReconcilablePaymentProviderInterface(query)
    • 可选实现 PollablePaymentProviderInterface(status)
    • meta() 中描述插件名称、版本、分组、客户端限制与配置项
  • Service
    • 封装第三方SDK调用、参数构建、响应解析、状态推进、日志记录
    • 通过依赖注入获取系统服务(如 PaymentService)
    • 保持方法单一职责,便于测试与维护

章节来源

  • core/infra/plugin/Contract/PaymentPluginProviderInterface.php:1-67
  • plugin/alipay/AlipayProvider.php:1-111
  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473

后台导航配置规范

  • 配置文件位置
    • admin/nav/&lt;module>.php:模块导航配置文件
  • 必需字段
    • title:菜单组标题(语言键)
    • icon:Bootstrap Icons 图标类名
    • items:子菜单项数组
  • 菜单项字段
    • key:唯一标识符
    • name:显示名称(语言键)
    • link:路由名
    • match:路由匹配模式数组
    • exclude:排除模式数组
    • when:可见条件数组
    • params:路由参数数组
    • renders:指定渲染的族
    • source:动态项源
  • 匹配规则
    • 段边界通配:admin.user.*
    • 精确匹配:admin.user.log
    • 尾缀兼容:admin.user.contact.*

章节来源

  • admin/nav/ai.php:1-49
  • admin/nav/book.php:1-52
  • admin/service/menu/AdminMenuRegistry.php:23-62
  • admin/service/menu/AdminNavResolver.php:35-51

开发示例路径指引

  • 简单功能插件:参考货到付款插件
    • 目录:plugin/cod
    • 重点:manifest.php、CodProvider.php、CodService.php
  • 复杂业务插件:参考微信支付插件
    • 目录:plugin/wxpay
    • 重点:WxpayProvider.php、WxpayService.php、SDK集成、回调与轮询
  • 新增 带后台管理的插件:参考AI模块
    • 目录:admin/nav/ai.php
    • 重点:导航配置、路由匹配、菜单结构

章节来源

  • plugin/cod/CodProvider.php:1-92
  • plugin/wxpay/WxpayProvider.php:1-127
  • plugin/wxpay/WxpayService.php:1-473
  • admin/nav/ai.php:1-49

调试技巧与测试方法

  • 本地调试
    • 使用内网穿透暴露 notifyUrl,确保第三方能回调
    • 在 Service 中记录关键参数与响应(脱敏)
  • 单元测试
    • 针对 Service 的纯函数逻辑编写单测(如参数构建、状态映射)
    • Mock 第三方SDK调用,验证边界条件
  • 集成测试
    • 使用沙箱环境验证 start/notify/finish/query/status 全流程
  • 新增 导航配置调试
    • 使用 AdminMenuRegistry::subMenus() 检查导航配置是否正确加载
    • 验证路由匹配规则是否符合预期
    • 检查语言包是否正确配置

代码规范与安全注意事项

  • 代码规范
    • 严格遵循PSR-4命名空间与自动加载
    • 方法短小清晰,单一职责,避免过长函数
    • 常量与配置集中管理,避免硬编码
  • 安全考虑
    • 所有外部输入必须校验与过滤
    • 敏感信息(密钥、证书)不得入库或输出到日志
    • 回调验签必须严格,防止伪造请求
  • 兼容性要求
    • 兼容多客户端(PC/Mobile/小程序),通过 allow_client 与UA判断
    • 向后兼容:新增字段需有默认值,避免破坏旧配置
  • 新增 导航配置安全
    • 导航配置文件必须包含安全检查(IN_DOUCO 常量检查)
    • 路由匹配规则要精确,避免意外匹配
    • 菜单权限控制要完善,防止越权访问
添加日期:2026-10-05