224 lines
17 KiB
SQL
224 lines
17 KiB
SQL
-- =============================================================
|
||
-- 平台端支付模块相关表(平台向租户收取平台使用费)
|
||
-- yz_platform_payment_channel 渠道配置(一渠道一行,敏感参数加密后存 JSON)
|
||
-- yz_platform_payment_order 支付单
|
||
-- yz_platform_payment_order_log 支付单状态流转流水
|
||
-- yz_platform_payment_callback_log 渠道回调日志(幂等去重 + 问题排查)
|
||
-- yz_platform_payment_channel_bill 渠道账单明细(对账源数据)
|
||
-- yz_platform_payment_reconcile_diff 对账差异
|
||
-- yz_platform_payment_refund 手动原路退回记录(兜底能力)
|
||
--
|
||
-- 设计约定(与业务约定一致):
|
||
-- 1. 资金流向:租户付款直接进平台对公账户,不涉及分账;仅保留后台「手动原路退回」兜底;
|
||
-- 2. 金额一律用「分」为单位的 bigint 存储,前端展示时 /100 转元;
|
||
-- 3. 状态类字段用 varchar 存英文枚举,前端 StatusTag 直接映射,避免数字魔法值;
|
||
-- 4. 渠道密钥 / 私钥 / ClientSecret 不入库明文,只存 config_json(写入前由后端加密);
|
||
-- 证书本体存文件(object_key),库内只留元信息(cert_json);
|
||
-- 5. 表结构与项目其他表一致:软删除 delete_time、create_time/update_time 自动维护;
|
||
-- 6. 唯一键带上 delete_time 是本项目约定(软删除后可重新插入同键数据);
|
||
-- 注意 MySQL 唯一索引对 NULL 不去重,因此「支付幂等/回调去重」仍必须在业务层
|
||
-- 用「按 pay_no 查重 + 条件更新(WHERE status <> 'paid')」兜底,不能只依赖唯一键。
|
||
-- 7. 业务订单字段(业务订单状态、订单摘要等)由业务模块持有,本模块只冗余订单号与金额,
|
||
-- 详情接口聚合返回,不在此重复落库。
|
||
--
|
||
-- 可重复执行(CREATE TABLE IF NOT EXISTS)。
|
||
-- 运行:mysql --default-character-set=utf8mb4 -h<host> -P<port> -u<user> -p <db> < create_platform_payment.sql
|
||
-- =============================================================
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 1. 支付渠道配置表
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_channel` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识:wechat/alipay/unionpay/cloudpay/paypal',
|
||
`name` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道名称(展示用)',
|
||
`merchant_no` varchar(128) NOT NULL DEFAULT '' COMMENT '商户号(展示用,未配置时前端显示未配置)',
|
||
`config_json` text COMMENT '渠道参数JSON(含密钥/私钥/Secret,写入前加密;接口回显敏感字段时只回掩码)',
|
||
`cert_json` text COMMENT '证书元信息JSON:文件名、object_key、序列号、到期日(不含证书私钥内容)',
|
||
`callback_url` varchar(255) NOT NULL DEFAULT '' COMMENT '回调地址(只读):/api/payment/callback/{channel}',
|
||
`enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用:1启用/0停用(参数不完整时前端展示为未配置)',
|
||
`extra_json` text COMMENT '渠道扩展开关JSON:云闪付 show_logo/logo_positions、PayPal env 等',
|
||
`last_test_time` datetime DEFAULT NULL COMMENT '最近一次「测试连接」时间',
|
||
`last_test_result` varchar(255) NOT NULL DEFAULT '' COMMENT '最近一次测试连接结果说明',
|
||
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_channel` (`channel`,`delete_time`),
|
||
KEY `idx_enabled` (`enabled`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付渠道配置表';
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 2. 支付单表
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_order` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '支付单号(支付模块生成,形如 P202609150009)',
|
||
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务订单号(业务模块生成;同一订单可有多笔支付单)',
|
||
`order_type` varchar(32) NOT NULL DEFAULT 'platform_usage' COMMENT '订单类型:platform_usage平台使用费/module_shop模块购买/service_fee服务费',
|
||
`subject` varchar(255) NOT NULL DEFAULT '' COMMENT '订单标题(渠道侧展示文案)',
|
||
`tenant_id` varchar(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||
`tenant_name` varchar(128) NOT NULL DEFAULT '' COMMENT '租户名称(冗余,便于列表展示)',
|
||
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '实付金额(分)',
|
||
`order_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '业务订单金额(分)',
|
||
`currency` varchar(8) NOT NULL DEFAULT 'CNY' COMMENT '币种',
|
||
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '支付渠道标识',
|
||
`merchant_no` varchar(128) NOT NULL DEFAULT '' COMMENT '下单时商户号快照',
|
||
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号',
|
||
`status` varchar(20) NOT NULL DEFAULT 'created' COMMENT '状态:created/pending/paying/paid/failed/closed/refunding/refunded',
|
||
`refund_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '已退回金额(分),仅兜底手动退回时累加',
|
||
`client_ip` varchar(64) NOT NULL DEFAULT '' COMMENT '下单客户端IP',
|
||
`return_url` varchar(255) NOT NULL DEFAULT '' COMMENT '支付完成同步跳回地址(由下单参数带入)',
|
||
`notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '渠道回调地址快照',
|
||
`expire_at` datetime DEFAULT NULL COMMENT '支付超时时间(过期由补偿任务置为 closed)',
|
||
`paid_at` datetime DEFAULT NULL COMMENT '支付完成时间',
|
||
`closed_at` datetime DEFAULT NULL COMMENT '关闭时间',
|
||
`notify_at` datetime DEFAULT NULL COMMENT '最近一次成功回调时间',
|
||
`last_query_at` datetime DEFAULT NULL COMMENT '最近一次主动查询渠道状态时间',
|
||
`order_synced` tinyint(1) NOT NULL DEFAULT '0' COMMENT '业务订单状态是否已同步:1已同步/0待同步(补偿任务扫描用)',
|
||
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_pay_no` (`pay_no`,`delete_time`),
|
||
KEY `idx_out_trade_no` (`out_trade_no`),
|
||
KEY `idx_tenant` (`tenant_id`,`create_time`),
|
||
KEY `idx_status` (`status`,`create_time`),
|
||
KEY `idx_channel_trade` (`channel`,`channel_trade_no`),
|
||
KEY `idx_order_synced` (`order_synced`,`status`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付单表';
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 3. 支付单状态流转流水(详情页时间轴数据源)
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_order_log` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '支付单号(yz_platform_payment_order.pay_no)',
|
||
`from_status` varchar(20) NOT NULL DEFAULT '' COMMENT '变更前状态(创建时为空)',
|
||
`to_status` varchar(20) NOT NULL DEFAULT '' COMMENT '变更后状态',
|
||
`operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作来源:租户端下单页/渠道回调/平台管理员/定时补偿',
|
||
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '变更说明(如:支付成功,已同步业务订单为已支付)',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_pay_no` (`pay_no`,`create_time`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付单状态流转流水表';
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 4. 渠道回调日志表(幂等去重与排查)
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_callback_log` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
|
||
`event_type` varchar(64) NOT NULL DEFAULT '' COMMENT '事件类型:TRANSACTION.SUCCESS/trade.success/PAYMENT.CAPTURE.COMPLETED 等',
|
||
`event_id` varchar(128) NOT NULL DEFAULT '' COMMENT '渠道事件ID(微信 event id / 支付宝 notify_id / PayPal event id)',
|
||
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '关联支付单号',
|
||
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务订单号',
|
||
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号',
|
||
`trade_state` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道侧交易状态原文',
|
||
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '渠道通知金额(分)',
|
||
`verify_result` tinyint(1) NOT NULL DEFAULT '0' COMMENT '验签结果:1通过/0失败',
|
||
`is_duplicate` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否重复通知:1是(幂等命中,直接返回渠道要求的成功响应)/0否',
|
||
`handle_result` tinyint(1) NOT NULL DEFAULT '0' COMMENT '处理结果:1成功/0失败',
|
||
`handle_msg` varchar(255) NOT NULL DEFAULT '' COMMENT '处理说明或错误信息',
|
||
`raw_body` mediumtext COMMENT '渠道原始报文(脱敏后保留,详情页「渠道回调原文」数据源)',
|
||
`client_ip` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道来源IP',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_channel_event` (`channel`,`channel_trade_no`,`event_type`,`delete_time`),
|
||
KEY `idx_pay_no` (`pay_no`),
|
||
KEY `idx_event_id` (`event_id`),
|
||
KEY `idx_create_time` (`create_time`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付渠道回调日志表(幂等去重)';
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 5. 渠道账单明细表(对账源数据)
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_channel_bill` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
|
||
`bill_date` date NOT NULL COMMENT '账单日期(渠道账单自然日)',
|
||
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号',
|
||
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道侧商户订单号(对应业务订单号)',
|
||
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '渠道账单金额(分)',
|
||
`fee` bigint(20) NOT NULL DEFAULT '0' COMMENT '渠道手续费(分)',
|
||
`trade_state` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道侧交易状态',
|
||
`trade_time` datetime DEFAULT NULL COMMENT '渠道交易时间',
|
||
`is_matched` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已与本地支付单匹配:1是/0否',
|
||
`matched_pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '匹配到的本地支付单号',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_channel_trade` (`channel`,`channel_trade_no`,`delete_time`),
|
||
KEY `idx_bill_date` (`channel`,`bill_date`,`is_matched`),
|
||
KEY `idx_out_trade_no` (`out_trade_no`,`bill_date`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付渠道账单明细表(对账源数据)';
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 6. 对账差异表
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_reconcile_diff` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
|
||
`bill_date` date NOT NULL COMMENT '对账日期(同渠道账单日)',
|
||
`batch_no` varchar(40) NOT NULL DEFAULT '' COMMENT '对账批次号(同渠道同日一次对账一个批次,便于追溯与重跑)',
|
||
`local_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '本地支付单号(长款时为空串,不写 NULL 以便参与唯一键)',
|
||
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号(短款时为空串)',
|
||
`local_amount` bigint(20) DEFAULT NULL COMMENT '本地金额(分),无本地记录时为 NULL',
|
||
`channel_amount` bigint(20) DEFAULT NULL COMMENT '渠道金额(分),无渠道记录时为 NULL',
|
||
`diff_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '差额(分)= 渠道金额 - 本地金额,负数表示短款',
|
||
`diff_type` varchar(20) NOT NULL DEFAULT '' COMMENT '差异类型:long长款(渠道有本地无)/short短款(本地有渠道无)/status_mismatch状态不一致',
|
||
`handle_status` varchar(20) NOT NULL DEFAULT 'unhandled' COMMENT '处理状态:unhandled待处理/handling处理中/handled已处理/ignored已忽略',
|
||
`handle_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '处理人ID',
|
||
`handle_user_name` varchar(128) NOT NULL DEFAULT '' COMMENT '处理人姓名',
|
||
`handle_time` datetime DEFAULT NULL COMMENT '处理时间',
|
||
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '处理说明(人工填写,便于日后追溯)',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_diff` (`channel`,`bill_date`,`diff_type`,`channel_trade_no`,`local_trade_no`,`delete_time`),
|
||
KEY `idx_channel_date` (`channel`,`bill_date`),
|
||
KEY `idx_handle` (`handle_status`,`bill_date`),
|
||
KEY `idx_batch_no` (`batch_no`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付对账差异表';
|
||
|
||
-- -------------------------------------------------------------
|
||
-- 7. 手动原路退回记录表(兜底能力,业务上不提供退款入口)
|
||
-- -------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `yz_platform_payment_refund` (
|
||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||
`refund_no` varchar(40) NOT NULL DEFAULT '' COMMENT '退回单号(支付模块生成)',
|
||
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '关联支付单号',
|
||
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '关联业务订单号',
|
||
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
|
||
`channel_refund_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道退回流水号',
|
||
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '退回金额(分)',
|
||
`reason` varchar(500) NOT NULL DEFAULT '' COMMENT '退回原因(必填,人工填写,用于审计)',
|
||
`status` varchar(20) NOT NULL DEFAULT 'processing' COMMENT '退回状态:processing处理中/success成功/failed失败',
|
||
`fail_reason` varchar(500) NOT NULL DEFAULT '' COMMENT '失败原因',
|
||
`operator_id` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人ID(平台管理员)',
|
||
`operator_name` varchar(128) NOT NULL DEFAULT '' COMMENT '操作人姓名',
|
||
`finished_at` datetime DEFAULT NULL COMMENT '退回完成时间',
|
||
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_refund_no` (`refund_no`,`delete_time`),
|
||
KEY `idx_pay_no` (`pay_no`),
|
||
KEY `idx_status` (`status`,`create_time`),
|
||
KEY `idx_delete_time` (`delete_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付手动原路退回记录表(兜底能力)';
|