Files
mpay_v2_webman/database/mvp_payment_tables.sql
2026-03-20 12:05:54 +08:00

251 lines
14 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================
-- 支付系统核心表结构(优化版)
-- ============================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =======================
-- 1. 商户表
-- =======================
DROP TABLE IF EXISTS `ma_merchant`;
CREATE TABLE `ma_merchant` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`merchant_no` varchar(32) NOT NULL DEFAULT '' COMMENT '商户号(唯一,对外标识)',
`merchant_name` varchar(100) NOT NULL DEFAULT '' COMMENT '商户名称',
`funds_mode` varchar(20) NOT NULL DEFAULT 'direct' COMMENT '资金模式direct-直连, wallet-归集, hybrid-混合',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用, 1-启用',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_merchant_no` (`merchant_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户表';
-- =======================
-- 2. 商户应用表
-- =======================
DROP TABLE IF EXISTS `ma_merchant_app`;
CREATE TABLE `ma_merchant_app` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
`api_type` varchar(32) NOT NULL DEFAULT 'default' COMMENT '接口类型openapi, epay, custom 等',
`app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '应用ID',
`app_secret` varchar(128) NOT NULL DEFAULT '' COMMENT '应用密钥',
`app_name` varchar(100) NOT NULL DEFAULT '' COMMENT '应用名称',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用, 1-启用',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_id` (`app_id`),
KEY `idx_merchant_id` (`merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户应用表';
-- =======================
-- 3. 支付方式字典表
-- =======================
DROP TABLE IF EXISTS `ma_pay_method`;
CREATE TABLE `ma_pay_method` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`method_code` varchar(32) NOT NULL DEFAULT '' COMMENT '支付方式编码,如 alipay,wechat',
`method_name` varchar(50) NOT NULL DEFAULT '' COMMENT '支付方式名称',
`icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用, 1-启用',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_method_code` (`method_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付方式字典表';
-- =======================
-- 4. 支付插件注册表
-- =======================
DROP TABLE IF EXISTS `ma_pay_plugin`;
CREATE TABLE `ma_pay_plugin` (
`code` varchar(32) NOT NULL DEFAULT '' COMMENT '插件编码(主键)',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '插件名称',
`class_name` varchar(255) NOT NULL DEFAULT '' COMMENT '插件类名(短类名)',
`config_schema` json DEFAULT NULL COMMENT '插件配置schema(JSON)',
`pay_types` json DEFAULT NULL COMMENT '插件支持支付类型(JSON)',
`transfer_types` json DEFAULT NULL COMMENT '插件支持转账类型(JSON)',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用, 1-启用',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付插件注册表';
-- =======================
-- 5. 支付通道表
-- =======================
DROP TABLE IF EXISTS `ma_pay_channel`;
CREATE TABLE `ma_pay_channel` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID冗余方便统计',
`merchant_app_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户应用ID关联 ma_merchant_app.id',
`chan_code` varchar(32) NOT NULL DEFAULT '' COMMENT '通道编码(唯一)',
`chan_name` varchar(100) NOT NULL DEFAULT '' COMMENT '通道显示名称',
`plugin_code` varchar(32) NOT NULL DEFAULT '' COMMENT '支付插件编码',
`method_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付方式ID关联 ma_pay_method.id',
`config_json` json DEFAULT NULL COMMENT '通道插件配置参数JSON对应插件配置包括 enabled_products 等)',
`split_ratio` decimal(5,2) NOT NULL DEFAULT 100.00 COMMENT '分成比例(%',
`chan_cost` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT '通道成本(%',
`chan_mode` varchar(50) NOT NULL DEFAULT 'wallet' COMMENT '通道模式wallet-入余额, direct-直连到商户',
`daily_limit` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '单日限额0表示不限制',
`daily_cnt` int(11) NOT NULL DEFAULT 0 COMMENT '单日限笔0表示不限制',
`min_amount` decimal(12,2) DEFAULT NULL COMMENT '单笔最小金额NULL表示不限制',
`max_amount` decimal(12,2) DEFAULT NULL COMMENT '单笔最大金额NULL表示不限制',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用, 1-启用',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序,越小优先级越高',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_chan_code` (`chan_code`),
KEY `idx_mch_app_method` (`merchant_id`,`merchant_app_id`,`method_id`,`status`,`sort`),
KEY `idx_plugin_method` (`plugin_code`,`method_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付通道表';
-- =======================
-- 6. 支付订单表
-- =======================
DROP TABLE IF EXISTS `ma_pay_order`;
CREATE TABLE `ma_pay_order` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_id` varchar(32) NOT NULL DEFAULT '' COMMENT '支付订单号(系统生成,唯一)',
`merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
`merchant_app_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户应用ID',
`mch_order_no` varchar(64) NOT NULL DEFAULT '' COMMENT '商户订单号(幂等)',
`method_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付方式ID关联 ma_pay_method.id',
`channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID关联 ma_pay_channel.id',
`amount` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '订单金额(元)',
`real_amount` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '实际支付金额(元,扣除手续费后)',
`fee` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '手续费(元,可选,用于对账)',
`currency` varchar(3) NOT NULL DEFAULT 'CNY' COMMENT '币种,如 CNY',
`subject` varchar(255) NOT NULL DEFAULT '' COMMENT '订单标题',
`body` varchar(500) NOT NULL DEFAULT '' COMMENT '订单描述',
`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '订单状态0-PENDING,1-SUCCESS,2-FAIL,3-CLOSED',
`chan_order_no` varchar(128) NOT NULL DEFAULT '' COMMENT '渠道订单号(渠道返回)',
`chan_trade_no` varchar(128) NOT NULL DEFAULT '' COMMENT '渠道交易号(部分渠道有)',
`pay_at` datetime DEFAULT NULL COMMENT '支付时间',
`expire_at` datetime DEFAULT NULL COMMENT '订单过期时间',
`client_ip` varchar(50) NOT NULL DEFAULT '' COMMENT '客户端IP',
`notify_stat` tinyint(1) NOT NULL DEFAULT 0 COMMENT '商户通知状态0-未通知,1-已通知成功',
`notify_cnt` int(11) NOT NULL DEFAULT 0 COMMENT '通知次数',
`extra` json DEFAULT NULL COMMENT '扩展字段JSON存储支付参数、退款信息等',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_id` (`order_id`),
UNIQUE KEY `uk_mch_order` (`merchant_id`,`merchant_app_id`,`mch_order_no`),
KEY `idx_mch_app_created` (`merchant_id`,`merchant_app_id`,`created_at`),
KEY `idx_method_id` (`method_id`),
KEY `idx_channel_id` (`channel_id`),
KEY `idx_status_created` (`status`,`created_at`),
KEY `idx_pay_at` (`pay_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付订单表';
-- =======================
-- 7. 支付回调日志表
-- =======================
DROP TABLE IF EXISTS `ma_pay_callback_log`;
CREATE TABLE `ma_pay_callback_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_id` varchar(32) NOT NULL DEFAULT '' COMMENT '支付订单号(系统订单号)',
`channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '通道ID关联 ma_pay_channel.id',
`callback_type` varchar(20) NOT NULL DEFAULT '' COMMENT '回调类型notify-异步通知, return-同步返回',
`request_data` text COMMENT '请求原始数据(完整回调参数)',
`verify_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '验签状态0-失败,1-成功',
`process_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '处理状态0-未处理,1-已处理',
`process_result` text COMMENT '处理结果JSON或文本',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_order_created` (`order_id`,`created_at`),
KEY `idx_channel_created` (`channel_id`,`created_at`),
KEY `idx_callback_type` (`callback_type`),
KEY `idx_verify_status` (`verify_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付回调日志表';
-- =======================
-- 8. 商户通知任务表
-- =======================
DROP TABLE IF EXISTS `ma_notify_task`;
CREATE TABLE `ma_notify_task` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_id` varchar(32) NOT NULL DEFAULT '' COMMENT '支付订单号(系统订单号)',
`merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
`merchant_app_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户应用ID',
`notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '通知地址',
`notify_data` text COMMENT '通知数据JSON格式',
`status` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '状态PENDING-待通知,SUCCESS-成功,FAIL-失败',
`retry_cnt` int(11) NOT NULL DEFAULT 0 COMMENT '重试次数',
`next_retry_at` datetime DEFAULT NULL COMMENT '下次重试时间',
`last_notify_at` datetime DEFAULT NULL COMMENT '最后通知时间',
`last_response` text COMMENT '最后响应内容',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_id` (`order_id`),
KEY `idx_status_retry` (`status`,`next_retry_at`),
KEY `idx_mch_app` (`merchant_id`,`merchant_app_id`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户通知任务表';
-- =======================
-- 9. 系统配置表
-- =======================
DROP TABLE IF EXISTS `ma_system_config`;
CREATE TABLE IF NOT EXISTS `ma_system_config` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`config_key` varchar(100) NOT NULL DEFAULT '' COMMENT '配置项键名(唯一标识,直接使用字段名)',
`config_value` text COMMENT '配置项值支持字符串、数字、JSON等',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_config_key` (`config_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';
-- =======================
-- 10. 初始化基础数据
-- =======================
-- 初始化支付方式字典
INSERT INTO `ma_pay_method` (`method_code`, `method_name`, `icon`, `sort`, `status`) VALUES
('alipay', '支付宝', '', 1, 1),
('wechat', '微信支付', '', 2, 1),
('unionpay','云闪付', '', 3, 1)
ON DUPLICATE KEY UPDATE
`method_name` = VALUES(`method_name`),
`icon` = VALUES(`icon`),
`sort` = VALUES(`sort`),
`status` = VALUES(`status`);
-- =======================
-- 11. 管理员用户表ma_admin
-- =======================
DROP TABLE IF EXISTS `ma_admin`;
CREATE TABLE `ma_admin` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名(登录账号,唯一)',
`password` varchar(255) DEFAULT NULL COMMENT '登录密码hashNULL 或空表示使用默认开发密码)',
`nick_name` varchar(50) NOT NULL DEFAULT '' COMMENT '昵称',
`avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '头像地址',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
`email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用, 1-启用',
`login_ip` varchar(45) NOT NULL DEFAULT '' COMMENT '最后登录IP',
`login_at` datetime DEFAULT NULL COMMENT '最后登录时间',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员用户表';
-- 初始化一个超级管理员账号(开发环境默认密码 123456对应 AuthService::validatePassword 逻辑)
INSERT INTO `ma_admin` (`user_name`, `password`, `nick_name`, `status`, `created_at`)
VALUES ('admin', NULL, '超级管理员', 1, NOW())
ON DUPLICATE KEY UPDATE
`nick_name` = VALUES(`nick_name`),
`status` = VALUES(`status`);
SET FOREIGN_KEY_CHECKS = 1;