payment-system-architecture
约 4052 字大约 14 分钟
2026-02-03
文档版本: v1.0 创建时间: 2026-01-30 适用系统: ShopXO v6.7.0 文档类型: 技术架构方案
目录
1. 系统概览与架构图
1.1 系统定位
ShopXO 支付系统是整个电商系统的核心资金流转模块,负责处理所有涉及资金交易的业务场景:
| 业务类型 | 说明 | 业务标识 |
|---|---|---|
| 订单支付 | 商品订单支付 | order |
| 钱包充值 | 用户钱包余额充值 | wallet_recharge |
| 会员购买 | 会员等级购买 | membership_level_vip |
| 自定义业务 | 插件扩展的其他支付业务 | 自定义标识 |
1.2 整体架构
┌─────────────────────────────────────────────────────────────────────┐
│ 应用层 (Application) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Index模块 │ │ Api模块 │ │ Admin模块 │ │
│ │ (PC/H5) │ │ (小程序/APP) │ │ (后台管理) │ │
│ │ │ │ │ │ │ │
│ │ Buy.php │ │ Buy.php │ │ Payment.php │ │
│ │ Order.php │ │ Ordernotify │ │ (配置管理) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │
└───────────┼──────────────────┼──────────────────────────────────────┘
│ │
┌───────────┼──────────────────┼──────────────────────────────────────┐
│ ▼ ▼ 服务层 (Service Layer) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ PaymentService │ │
│ │ (支付方式服务层) │ │
│ │ • 插件列表管理 • 配置管理 • 安装/卸载 │ │
│ │ • 入口文件生成 • 权限校验 • 合法性验证 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │ │
│ ┌───────────────────────┘ └────────────────────────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────────────────────┐ │ │
│ │ PayLogService │ │ 业务Service层 │ │ │ │
│ │ (支付日志服务) │ │ • OrderService │ │ │ │
│ │ • 日志创建 │ │ • WalletService │ │ │ │
│ │ • 状态更新 │ │ • MembershipService │ │ │ │
│ │ • 幂等性控制 │ │ • 插件扩展Service │ │ │ │
│ └─────────────────────┘ └─────────────────────────────────────┘ │ │
│ │
└──────────────────────────────────────────────────────────────────────┘
│
┌───────────┼──────────────────────────────────────────────────────────┐
│ ▼ 支付扩展层 (Payment Extensions) │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ extend/payment/ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Weixin │ │ Alipay │ │ PayPal │ │ QQ │ ... 60+ │
│ │ (微信) │ │ (支付宝) │ │ (贝宝) │ │ (QQ钱包) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │ │
│ └────────────┴────────────┴────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ 统一接口规范 │ │
│ │ • Config() │ │
│ │ • Pay() │ │
│ │ • Respond() │ │
│ │ • Notify() │ │
│ └─────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────┘
│
┌───────────┼──────────────────────────────────────────────────────────┐
│ ▼ 第三方支付平台 │
├───────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │微信支付 │ │支付宝 │ │PayPal │ │其他平台 │ │
│ │平台 │ │平台 │ │平台 │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────┘1.3 核心组件关系
┌─────────────────────────────────────────────────────────────────┐
│ 核心组件依赖关系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ PaymentService │
│ │ │
│ ├──► PayLogService (支付日志管理) │
│ │ ├──► PayLog (支付日志主表) │
│ │ └──► PayLogValue (业务关联表) │
│ │ │
│ ├──► 支付扩展 (extend/payment/*.php) │
│ │ ├──► Config() (配置信息) │
│ │ ├──► Pay() (发起支付) │
│ │ ├──► Respond() (同步回调) │
│ │ └──► Notify() (异步通知) │
│ │ │
│ ├──► ResourcesService (附件服务) │
│ ├──► StoreService (应用市场服务) │
│ └──► SystemService (系统服务) │
│ │
└─────────────────────────────────────────────────────────────────┘1.4 数据库设计
支付日志表 (sxo_pay_log)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| log_no | varchar(64) | 支付日志单号 (唯一) |
| user_id | int | 用户ID |
| system_type | varchar(32) | 系统类型 |
| client_type | varchar(16) | 客户端类型 (pc/h5/ios/android/weixin...) |
| total_price | decimal(10,2) | 订单总金额 |
| business_type | varchar(64) | 业务类型 (order/wallet_recharge/...) |
| subject | varchar(255) | 订单名称/备注 |
| payment | varchar(64) | 支付方式标识 |
| payment_name | varchar(128) | 支付方式名称 |
| trade_no | varchar(128) | 第三方交易号 |
| buyer_user | varchar(128) | 支付方账号 |
| status | tinyint | 状态 (0待支付/1已支付/2已关闭) |
| pay_time | int | 支付成功时间 |
| add_time | int | 创建时间 |
| close_time | int | 关闭时间 |
业务关联表 (sxo_pay_log_value)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| pay_log_id | bigint | 支付日志ID |
| business_id | bigint | 业务订单ID |
| business_no | varchar(64) | 业务订单号 |
2. 核心设计与模式
2.1 统一抽象接口设计
支付系统采用策略模式 + 模板方法模式,通过统一抽象接口实现多支付方式的解耦:
// 支付插件必须实现的接口
interface PaymentInterface {
// 配置信息
public function Config(): array;
// 发起支付
public function Pay(array $params): array;
// 同步回调处理
public function Respond(array $params): array;
// 异步通知处理
public function Notify(array $params): array;
}设计原则
| 原则 | 实现方式 |
|---|---|
| 开闭原则 (OCP) | 新增支付方式无需修改核心代码,仅添加扩展文件 |
| 单一职责 (SRP) | PaymentService 负责管理,支付插件负责具体实现 |
| 依赖倒置 (DIP) | 依赖抽象接口而非具体支付实现 |
| 里氏替换 (LSP) | 所有支付插件可互相替换使用 |
2.2 配置驱动设计
支付插件配置结构
// 支付插件配置返回结构
[
'base' => [
'name' => '支付方式名称',
'version' => '版本号',
'apply_version' => '适用系统版本',
'apply_terminal' => ['pc', 'h5', 'ios', 'android', ...],
'desc' => '描述信息',
'author' => '开发者',
'author_url' => '开发者主页',
],
'element' => [
// 配置表单项(动态生成后台配置界面)
[
'element' => 'input|select|textarea',
'type' => 'text|password|number',
'name' => '配置项键名',
'title' => '配置项标题',
'placeholder' => '占位符',
'default' => '默认值',
'is_required' => 0|1,
'message' => '验证提示',
'element_data' => [...] // select选项数据
],
// ... 更多配置项
]
]配置存储
数据库表: sxo_payment
├── payment: 支付方式标识 (如 Weixin, Alipay)
├── name: 支付方式显示名称
├── logo: 支付方式图标
├── config: JSON格式的插件配置参数
├── apply_terminal: JSON格式的适用终端
├── element: JSON格式的配置表单定义
├── is_enable: 是否启用
└── is_open_user: 是否对用户开放2.3 多终端自适应设计
系统根据 APPLICATION_CLIENT_TYPE 常量自动选择合适的支付实现:
┌─────────────────────────────────────────────────────────────┐
│ 终端类型判断 │
├─────────────────────────────────────────────────────────────┤
│ │
│ APPLICATION_CLIENT_TYPE │
│ │ │
│ ├──► pc → PC Web支付 (扫码/跳转) │
│ ├──► h5 → 移动Web支付 (H5支付) │
│ ├──► ios → iOS APP支付 (SDK调起) │
│ ├──► android → Android APP支付 (SDK调起) │
│ ├──► weixin → 微信内支付 (JSAPI) │
│ ├──► alipay → 支付宝内支付 │
│ └──► ... → 其他终端 │
│ │
└─────────────────────────────────────────────────────────────┘2.4 钩子扩展机制
系统在关键节点预留钩子,支持业务扩展:
| 钩子名称 | 触发时机 | 用途 |
|---|---|---|
plugins_service_payment_all_list | 获取支付方式列表 | 插件自定义支付方式 |
plugins_service_payment_buy_list | 获取下单支付列表 | 过滤/增加支付选项 |
plugins_service_payment_data | 获取支付方式数据 | 动态修改支付配置 |
plugins_service_paylog_insert_success | 支付日志创建成功 | 关联业务处理 |
plugins_service_paylog_pages_list_data | 支付订单页面列表 | 自定义页面入口 |
3. 支付流程详解
3.1 发起支付流程
┌─────────────────────────────────────────────────────────────────────────┐
│ 发起支付时序图 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 用户/系统 Controller Service 支付插件 第三方 │
│ │ │ │ │ │
│ │ 1.选择支付方式 │ │ │ │
│ │─────────────────►│ │ │ │
│ │ │ │ │ │
│ │ │ 2.获取支付列表 │ │ │
│ │ │──────────────►│ │ │
│ │ │ │ │ │
│ │ │ 3.返回可用方式 │ │ │
│ │ │◄──────────────│ │ │
│ │ │ │ │ │
│ │ 4.确认支付 │ │ │ │
│ │─────────────────►│ │ │ │
│ │ │ │ │ │
│ │ │ 5.创建支付日志 │ │ │
│ │ │──────────────►│ │ │
│ │ │ │ │ │
│ │ │ 6.返回log_no │ │ │
│ │ │◄──────────────│ │ │
│ │ │ │ │ │
│ │ │ 7.调用Pay() │ │ │
│ │ │──────────────────────────────►│ │
│ │ │ │ │ │
│ │ │ │ │ 8.发起支付请求 │
│ │ │ │ │──────────────►│
│ │ │ │ │ │
│ │ │ │ │ 9.返回支付参数 │
│ │ │ │ │◄──────────────│
│ │ │ │ │ │
│ │ 10.返回支付结果 │ │ │ │
│ │◄─────────────────│ │ │ │
│ │ │ │ │ │
│ │ 11.调起支付/跳转 │ │ │ │
│ │─────────────────►│ │ │ │
│ │
└─────────────────────────────────────────────────────────────────────────┘关键步骤说明
- 支付方式筛选: 根据
apply_terminal配置过滤当前终端可用的支付方式 - 支付日志创建: 生成唯一
log_no,记录业务关联信息 - 构建支付参数: 支付插件根据终端类型构建对应支付参数
- 记录请求日志: 将支付请求参数记录到
request_params字段
3.2 支付回调处理
同步回调 (Respond)
┌─────────────────────────────────────────────────────────────────┐
│ 同步回调处理流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 第三方支付平台 入口文件 Controller 业务处理 │
│ │ │ │ │ │
│ │ 1.用户操作完成 │ │ │ │
│ │──────────────►│ │ │ │
│ │ │ │ │ │
│ │ │ 2.GET请求 │ │ │
│ │ │───────────────►│ │ │
│ │ │ │ │ │
│ │ │ │ 3.调用Respond()│ │
│ │ │ │──────────────►│ │
│ │ │ │ │ │
│ │ │ │ 4.验证签名 │ │
│ │ │ │──────────────►│ │
│ │ │ │ │ │
│ │ │ │ 5.查询支付状态│ │
│ │ │ │──────────────►│ │
│ │ │ │ │ │
│ │ │ │ 6.跳转结果页 │ │
│ │ │ │◄──────────────│ │
│ │ │ │ │ │
│ │ │ 7.展示结果 │ │ │
│ │ │◄───────────────│ │ │
│ │
└─────────────────────────────────────────────────────────────────┘特点:
- 用户可见的回调
- 用于前端展示支付结果
- 不作为最终支付确认依据
异步通知 (Notify) - 核心流程
┌─────────────────────────────────────────────────────────────────────────┐
│ 异步通知处理流程(核心) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 第三方支付平台 入口文件 Controller Service层 数据库 │
│ │ │ │ │ │ │
│ │ 1.支付成功 │ │ │ │ │
│ │─────────────►│ │ │ │ │
│ │ │ │ │ │ │
│ │ │ 2.POST请求 │ │ │ │
│ │ │──────────────►│ │ │ │
│ │ │ │ │ │ │
│ │ │ │ 3.记录请求日志 │ │ │
│ │ │ │──────────────►│ │ │
│ │ │ │ │ │ │
│ │ │ │ 4.调用Notify() │ │ │
│ │ │ │──────────────────────────────►│ │
│ │ │ │ │ │ │
│ │ │ │ │ 5.验证签名 │ │
│ │ │ │ │───────────────►│ │
│ │ │ │ │ │ │
│ │ │ │ │ 6.查询支付日志 │ │
│ │ │ │ │───────────────►│ │
│ │ │ │ │ │ │
│ │ │ │ │ 7.幂等性检查 │ │
│ │ │ │ │───────────────►│ │
│ │ │ │ │ │ │
│ │ │ │ │ 8.更新支付日志 │ │
│ │ │ │ │───────────────►│ │
│ │ │ │ │ │ │
│ │ │ │ │ 9.触发业务处理 │ │
│ │ │ │ │───┐ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │◄──┘ (订单/钱包等)│ │
│ │ │ │ │ │ │
│ │ │ │ 10.记录响应日志│ │ │
│ │ │ │◄──────────────│ │ │
│ │ │ │ │ │ │
│ │ │ 11.返回success│ │ │ │
│ │ │◄──────────────│ │ │ │
│ │ │ │ │ │ │
│ │ 12.确认收到 │ │ │ │ │
│ │◄─────────────│ │ │ │ │
│ │
└─────────────────────────────────────────────────────────────────────────┘异步通知特点:
- 服务器间通信
- 支付成功的唯一确认依据
- 需要验证签名防篡改
- 必须返回特定格式的成功响应
- 支持重试机制
3.3 入口文件生成机制
系统为每个支付方式在每个业务类型下生成独立的入口文件:
入口文件命名规则
payment_{system_type}_{business_type}_{payment}_{type}.php
示例:
├── payment_default_order_weixin_notify.php # 订单微信支付异步通知
├── payment_default_order_weixin_respond.php # 订单微信支付同步回调
├── payment_default_wallet_alipay_notify.php # 钱包支付宝支付异步通知
└── ...入口文件作用
- 支付方式标识: 通过
PAYMENT_TYPE常量标识 - 系统类型隔离: 支持多系统独立部署
- 路由映射: 将请求映射到统一控制器
- 安全隔离: 独立入口降低安全风险
3.4 状态流转
┌─────────────────────────────────────────────────────────────────┐
│ 支付日志状态流转图 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ │
│ │ 创建 │ log_no生成, 业务关联 │
│ │ status=0 │ ──────────────────────┐ │
│ └──────────┘ │ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ 用户取消/超时 │ │
│ │ │ status=2 │ │
│ │ │ (已关闭) │ │
│ │ └──────────────┘ │
│ │ │
│ │ 支付成功 │
│ ▼ │
│ ┌─────────────┐ │
│ │ 异步通知处理 │ │
│ │ (核心) │ │
│ └─────────────┘ │
│ │ │
│ │ 验证通过 │
│ ▼ │
│ ┌──────────┐ │
│ │ status=1│ 更新trade_no, buyer_user, pay_time │
│ │ (已支付) │ 触发业务处理(订单/钱包/会员) │
│ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘4. 扩展机制
4.1 插件化架构
支付系统完全插件化,新增支付方式无需修改核心代码:
插件开发步骤
- 创建插件文件:
extend/payment/XxxPayment.php - 实现标准接口: Config(), Pay(), Respond(), Notify()
- 后台上传安装: 通过ZIP包上传或直接放置文件
- 配置参数: 填写支付平台提供的配置参数
- 生成入口文件: 系统自动生成回调入口
插件合法性验证
// 验证流程
插件上传
↓
文件内容校验 (无eval等危险代码)
↓
接口完整性检查 (Config, Pay, Respond, Notify)
↓
配置信息获取
↓
应用市场授权验证 (可选)
↓
安装成功4.2 支付方式分类
按平台类型
| 类型 | 代表支付方式 | 特点 |
|---|---|---|
| 国内主流 | 微信、支付宝、QQ钱包 | 覆盖最广,接入复杂 |
| 银行渠道 | 建行、银联、各种银联通道 | 适合特定场景 |
| 国际支付 | PayPal、OceanPayment | 跨境支付 |
| 聚合支付 | 拉卡拉、通联、汇付 | 一码多付 |
| 线下支付 | 货到付款、线下转账 | 无需接口 |
按接入方式
| 接入方式 | 文件特征 | 适用场景 |
|---|---|---|
| SDK接入 | 包含证书文件、私钥 | APP支付、小程序支付 |
| API接入 | 纯代码实现 | PC网站、H5支付 |
| 跳转支付 | 仅返回跳转URL | 简单支付场景 |
| 扫码支付 | 返回二维码 | PC扫码支付 |
4.3 扩展点设计
当前支持的扩展点
| 扩展点 | 触发位置 | 扩展能力 |
|---|---|---|
| 支付方式列表 | 获取可用支付方式时 | 动态添加/过滤支付选项 |
| 支付配置 | 获取支付配置时 | 动态修改配置参数 |
| 支付日志 | 支付日志创建后 | 关联业务数据 |
| 支付完成 | 支付成功后 | 触发后续业务流程 |
| 入口文件 | 入口创建/删除时 | 自定义文件生成逻辑 |
扩展示例
// 通过钩子扩展支付方式
MyEventTrigger('plugins_service_payment_buy_list', [
'hook_name' => 'plugins_service_payment_buy_list',
'is_backend' => true,
'params' => $params,
'data' => &$payment_list, // 引用传递,可直接修改
]);4.4 热插拔支持
系统支持支付方式的热插拔操作:
┌─────────────────────────────────────────────────────────────┐
│ 支付方式生命周期 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 未安装 │
│ │ │
│ │ 上传插件文件 │
│ ▼ │
│ ┌──────────┐ │
│ │ 待安装 │ 读取插件Config信息 │
│ └──────────┘ │
│ │ │
│ │ 安装操作 │
│ ▼ │
│ ┌──────────┐ │
│ │ 已安装 │ 写入数据库配置 │
│ │ (禁用) │ 生成入口文件 │
│ └──────────┘ │
│ │ │
│ │ 启用操作 │
│ ▼ │
│ ┌──────────┐ │
│ │ 已启用 │ is_enable=1, is_open_user=1 │
│ │ (可用) │ 用户可见可选 │
│ └──────────┘ │
│ │ │
│ │ 卸载操作 │
│ ▼ │
│ ┌──────────┐ │
│ │ 卸载 │ 删除数据库记录 │
│ └──────────┘ 删除入口文件 │
│ │ │
│ ▼ │
│ 未安装 │
│ │
└─────────────────────────────────────────────────────────────┘5. 安全与幂等性
5.1 安全保障机制
签名验证
所有支付回调必须验证签名,防止数据篡改:
┌─────────────────────────────────────────────────────────────────┐
│ 签名验证流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 第三方平台回调 │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 获取回调数据 │ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 获取签名数据 │ (去除sign/sign_type字段) │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 按字典序排序 │ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 拼接成字符串 │ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 进行加密运算 │ (RSA/MD5/HMAC-SHA256等) │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 与传入签名 │ ──► 一致 ──► 验证通过 │
│ │ 对比验证 │ │ │
│ └─────────────┘ └──► 不一致 ──► 验证失败 │
│ │
└─────────────────────────────────────────────────────────────────┘请求日志记录
所有支付相关请求都会被记录,便于问题追踪:
| 日志类型 | 存储位置 | 记录内容 |
|---|---|---|
| 发起请求 | pay_log.request_params | 请求参数JSON |
| 异步通知 | pay_request_log | 完整通知数据 |
| 响应结果 | pay_request_log.response_data | 处理结果 |
5.2 幂等性保障
支付日志幂等性
通过数据库状态字段实现:
-- 更新支付状态时带条件,防止重复处理
UPDATE sxo_pay_log
SET status = 1,
trade_no = ?,
pay_time = ?
WHERE id = ? AND status = 0; -- 仅当状态为待支付时更新
-- 影响行数为0时表示已处理过业务订单幂等性
业务订单在支付成功前有唯一支付日志关联:
订单表 (sxo_order)
├── pay_log_id: 支付日志ID (唯一)
└── pay_status: 支付状态
支付成功更新时:
WHERE id = ? AND pay_status = 0防重令牌机制
发起支付时生成唯一令牌:
// 生成支付令牌
$pay_cashier_cache_key = 'payment_cashier_key_' . $log_no;
// 设置缓存,有效期30分钟
MyCache($pay_cashier_cache_key, $params, 1800);5.3 异常处理
支付超时处理
订单创建 → 设置自动关闭时间 → 超时未支付 → 自动关闭
│
▼
各支付方式不同超时时间
• 微信: 2小时
• 支付宝: 可配置 (默认90分钟)
• PayPal: 3天回调重试机制
第三方支付平台重试策略:
┌───────────────────────────────────────────────────────────┐
│ │
│ 首次通知失败 │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ 重试间隔 (各平台不同) │ │
│ ├──────────────────────────────────────────┤ │
│ │ 微信: 15s, 15s, 30s, 3m, 10m, 20m, ... │ │
│ │ 支付宝: 2m, 10m, 10m, ... (最多7次) │ │
│ │ PayPal: 持续重试,最多4天 │ │
│ └──────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 返回 success → 停止重试 │
│ 返回 error/超时 → 继续重试 │
│ │
└───────────────────────────────────────────────────────────┘记录异常日志
┌─────────────────────────────────────────────────────────────┐
│ 异常日志记录 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 日志文件: runtime/log/ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ error_YYYYMMDD.log │ │
│ │ ├── 支付插件调用失败 │ │
│ │ ├── 签名验证失败 │ │
│ │ ├── 支付日志查询失败 │ │
│ │ └── 业务处理异常 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ 支付请求日志: sxo_pay_request_log │
│ ├── request_data: 请求数据 │
│ ├── response_data: 响应数据 │
│ ├── status: 处理状态 │
│ └── add_time: 记录时间 │
│ │
└─────────────────────────────────────────────────────────────┘5.4 配置安全
敏感信息保护
// 配置项类型
支付插件配置:
├── 应用ID (appid) - 公开信息
├── 商户号 (mch_id) - 公开信息
├── 公钥 (rsa_public) - 公开信息
├── 私钥 (rsa_private) - 敏感信息,仅限配置
├── 密钥 (key) - 敏感信息,仅限配置
└── 证书文件 - 敏感信息,文件存储权限校验
支付操作权限矩阵:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 操作类型 用户 管理员 支付平台 │
│ ───────────────────────────────────────────────── │
│ 查看支付方式 ✓ ✓ ✗ │
│ 选择支付方式 ✓ ✗ ✗ │
│ 发起支付 ✓ ✗ ✗ │
│ 配置支付方式 ✗ ✓ ✗ │
│ 安装/卸载插件 ✗ ✓ ✗ │
│ 启用/禁用支付 ✗ ✓ ✗ │
│ 回调处理 ✗ ✗ ✓ │
│ │
└─────────────────────────────────────────────────────────────┘附录
A. 支持的支付方式列表
extend/payment/
├── Alipay.php # 支付宝 (PC/H5/APP)
├── AlipayCert.php # 支付宝证书版
├── Weixin.php # 微信支付 (公众号/PC/H5/APP)
├── QQ.php # QQ钱包
├── PayPal.php # PayPal国际支付
├── Toutiao.php # 抖音支付
├── BaiduMini.php # 百度小程序支付
├── Kuaishou.php # 快手支付
├── WalletPay.php # 钱包支付
├── Xendit.php # Xendit (东南亚)
├── UniPayment.php # 虚拟货币支付
├── OceanPayment.php # OceanPayment
└── ... (60+ 支付方式)B. 数据库表结构
sxo_payment (支付方式配置表)
CREATE TABLE `sxo_payment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`payment` varchar(64) NOT NULL COMMENT '支付方式标识',
`name` varchar(128) NOT NULL COMMENT '支付方式名称',
`logo` varchar(255) DEFAULT '' COMMENT '支付方式图标',
`config` text COMMENT '支付配置JSON',
`element` text COMMENT '配置表单JSON',
`apply_terminal` varchar(512) DEFAULT '' COMMENT '适用终端JSON',
`sort` int(11) DEFAULT '0' COMMENT '排序',
`is_enable` tinyint(1) DEFAULT '0' COMMENT '是否启用',
`is_open_user` tinyint(1) DEFAULT '0' COMMENT '是否对用户开放',
`add_time` int(11) DEFAULT NULL,
`upd_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `payment` (`payment`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;sxo_pay_log (支付日志表)
CREATE TABLE `sxo_pay_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`log_no` varchar(64) NOT NULL COMMENT '支付日志单号',
`user_id` int(11) DEFAULT '0',
`system_type` varchar(32) DEFAULT '',
`client_type` varchar(16) DEFAULT '',
`total_price` decimal(10,2) DEFAULT '0.00',
`business_type` varchar(64) DEFAULT '' COMMENT '业务类型',
`subject` varchar(255) DEFAULT '',
`payment` varchar(64) DEFAULT '',
`payment_name` varchar(128) DEFAULT '',
`trade_no` varchar(128) DEFAULT '' COMMENT '第三方交易号',
`buyer_user` varchar(128) DEFAULT '',
`status` tinyint(1) DEFAULT '0' COMMENT '0待支付/1已支付/2已关闭',
`pay_time` int(11) DEFAULT NULL,
`add_time` int(11) DEFAULT NULL,
`close_time` int(11) DEFAULT NULL,
`request_params` text COMMENT '支付请求参数JSON',
PRIMARY KEY (`id`),
UNIQUE KEY `log_no` (`log_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;sxo_pay_log_value (业务关联表)
CREATE TABLE `sxo_pay_log_value` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pay_log_id` bigint(20) NOT NULL,
`business_id` bigint(20) NOT NULL COMMENT '业务订单ID',
`business_no` varchar(64) DEFAULT '' COMMENT '业务订单号',
`add_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pay_log_id` (`pay_log_id`),
KEY `business_id` (`business_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;C. 关键常量定义
| 常量 | 说明 | 可能值 |
|---|---|---|
PAYMENT_TYPE | 当前支付方式标识 | Weixin, Alipay, ... |
SYSTEM_TYPE | 系统类型标识 | default, ... |
APPLICATION_CLIENT_TYPE | 客户端类型 | pc, h5, ios, android, weixin, alipay, ... |
D. 核心服务方法速查
PaymentService
| 方法 | 说明 | 返回值 |
|---|---|---|
PluginsPaymentList($type) | 获取支付插件列表 | 支付方式数组 |
PaymentList($params) | 获取已安装支付方式 | 支付方式数组 |
BuyPaymentList($params) | 获取可用支付方式 | 过滤后的支付列表 |
PaymentSave($params) | 保存支付配置 | 操作结果 |
Install($params) | 安装支付方式 | 操作结果 |
Uninstall($params) | 卸载支付方式 | 操作结果 |
Delete($params) | 删除支付插件 | 操作结果 |
PayLogService
| 方法 | 说明 | 返回值 |
|---|---|---|
PayLogInsert($params) | 创建支付日志 | 支付日志数据 |
PayLogSuccess($params) | 更新为支付成功 | 操作结果 |
PayLogClose($params) | 关闭支付日志 | 操作结果 |
PayLogData($log_no) | 获取支付日志 | 日志详情 |
BusinessOrderPayLogData($params) | 获取业务订单支付日志 | 关联日志 |
文档变更记录
| 版本 | 日期 | 修改内容 | 作者 |
|---|---|---|---|
| v1.0 | 2026-01-30 | 初始版本 | System |
文档结束
