-- ============================================================= -- 平台端支付模块相关表(平台向租户收取平台使用费) -- 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 -P -u -p < 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='平台支付手动原路退回记录表(兜底能力)';