表结构设计:权益流水、平台账单、支付订单、订单退款


支付域新表设计(前缀:t_payx_

总体说明

  • 目的:替换旧支付域表,统一金额/币种精度、状态枚举、幂等键和审计字段。
  • 方案:只保留一张支付订单表 t_payx_order,用 product_type 区分一次性/订阅(旧的 t_subscripe_ordert_record_servicebag_ordert_storage_servicebag_order 直接淘汰,不再新建)。
  • 替代关系:
    • t_payx_interest_record ← 用户权益流水表(新增,用于权益变动记录和审计)
    • t_payx_bill ← 平台账单流水表(新增,用于对账和财务核算)
    • t_payx_ordert_user_order(并取代上述订阅/服务包旧表)
    • t_payx_refundt_user_order_refund(旧表淘汰)
    • t_payx_notify ← 回调/通知日志(t_pay_apply_notify_logt_pay_apply_notify_log_bkt_pay_google_notify_log 等)
    • t_payx_request ← 第三方请求日志(t_app_third_server_request_logt_app_request_log_apple 等)
  • 索引:暂不做性能索引,仅保留主键。
  • 金额:DECIMAL(18,6);币种:VARCHAR(16)(预留 ISO4217 + 数字货币/试运营代号);时间:DATETIME(3);表前缀统一 t_payx_

枚举建议(应用层)

  • channel: 0=WeChat, 1=Alipay, 2=Apple, 3=Google, 4=Stripe, 5=Other
  • pay_status: 0=INIT, 1=PAYING, 2=SUCCESS, 3=FAILED, 4=CLOSED, 5=REFUNDING, 6=REFUNDED
  • refund_status: 0=INIT, 1=PROCESSING, 2=SUCCESS, 3=FAILED
  • notify.status: 0=RECEIVED, 1=PROCESSED, 2=IGNORED, 3=FAILED
  • bill.txn_type: 0=新购, 1=续费, 2=退款
  • bill.income_type: 0=收入, 1=支出
  • bill.status: 0=INIT, 1=SUCCESS, 2=FAILED, 3=CANCELLED
  • interest_record.interest_type: 0=会员, 1=资源
  • interest_record.change_type: 0=发放, 1=消耗, 2=收回, 3=过期, 4=变更
  • interest_record.status: 0=待执行, 1=执行成功, 2=执行失败, 3=已冲正

DDL 草案(无二级索引,仅主键;订阅/服务包表不再创建)

可直接执行的 MySQL 8 建表 SQL:


-- -1) 用户权益流水表
-- 作用:记录用户权益变动流水,用于权益发放、消耗、收回、过期等操作的审计和追溯
-- 关键:支持冲正操作,关联业务单号,记录完整的权益变动历史
CREATE TABLE t_payx_interest_record (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
  reverse_record_id BIGINT NULL COMMENT '关联冲正流水ID(当流水状态为已冲正时,记录用于冲正的那条新流水ID)',
  interest_name VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权益名称',
  interest_type TINYINT NOT NULL COMMENT '权益类型:0=会员,1=资源',
  change_type TINYINT NOT NULL COMMENT '变动类型:0=发放,1=消耗,2=收回,3=过期,4=变更',
  interest_content VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '权益内容(如:会员(新购)、会员(续订)、会员(过期)、会员(收回))',
  status TINYINT NOT NULL DEFAULT 0 COMMENT '流水状态:0=待执行,1=执行成功,2=执行失败,3=已冲正',
  error_code VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '失败原因代码',
  error_msg VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '失败原因文本',
  business_no VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联业务单号(订单号/任务ID)',
  operator VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'system' COMMENT '操作人(system表示系统自动处理,其他为后台操作账号)',
  completed_at DATETIME(3) NULL COMMENT '完成时间(流水状态变为执行成功或执行失败的时间)',
  business_desc VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '业务描述(权益流程执行的动作描述)',
  remark VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除',
  version BIGINT NOT NULL DEFAULT 0 COMMENT '行版本号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户权益流水表';

-- 0) 平台账单表
-- 作用:记录平台账单流水,用于对账、统计和财务核算
-- 关键:账单流水号唯一,交易类型和收入类型区分,支持多平台对账
CREATE TABLE t_payx_bill (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  order_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '关联订单ID',
  user_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
  interest_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联权益ID',
  bill_no VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账单流水号',
  product_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商品/套餐ID',
  product_name VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商品名称',
  txn_type TINYINT NOT NULL COMMENT '交易类型:0=新购,1=续费,2=退款',
  income_type TINYINT NOT NULL COMMENT '收入类型:0=收入,1=支出',
  amt DECIMAL(18,6) NOT NULL COMMENT '应付金额',
  amt_paid DECIMAL(18,6) NOT NULL COMMENT '支付金额',
  amt_discount DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '优惠金额',
  currency VARCHAR(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '币种(ISO4217 或兼容代号)',
  pay_type TINYINT NOT NULL COMMENT '支付方式:0=WeChat,1=Alipay,2=Apple,3=Google,4=Stripe,5=Other',
  platform TINYINT NOT NULL DEFAULT 0 COMMENT '平台:0=iOS,1=Android,2=Web,3=微信小程序,4=其他',
  platform_txn_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '第三方交易单号',
  paid_at DATETIME(3) NULL COMMENT '支付时间',
  status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0=INIT,1=SUCCESS,2=FAILED,3=CANCELLED',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除',
  version BIGINT NOT NULL DEFAULT 0 COMMENT '行版本号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='平台账单表';

-- 1) 支付订单
-- 作用:替代 t_user_order,记录支付订单主数据与支付结果
-- 关键:order_no/平台交易号唯一,金额币种标准化,状态枚举化
CREATE TABLE t_payx_order (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  order_no VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '内部订单号',
  order_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '内部订单ID,唯一、幂等/对账主键',
  user_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
  interest_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '关联权益ID',
  product_type TINYINT NOT NULL DEFAULT 0 COMMENT '产品类型:0=一次性/消费,1=订阅',
  product_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商品/套餐ID',
  product_name VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商品名称',
  amt DECIMAL(18,6) NOT NULL COMMENT '应付金额',
  amt_paid DECIMAL(18,6) NULL COMMENT '实付金额',
  amt_discount DECIMAL(18,6) NOT NULL COMMENT '优惠金额',
  amt_refunded DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '累计退款金额',
  currency VARCHAR(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '币种(ISO4217 或兼容代号)',
  original_txn_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '原始交易号(微信/支付宝/苹果/谷歌/Stripe)',
  platform_txn_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '第三方交易号(微信/支付宝/苹果/谷歌/Stripe)',
  pay_type TINYINT NOT NULL COMMENT '支付方式:0=WeChat,1=Alipay,2=Apple,3=Google,4=Stripe,5=Other',
  platform TINYINT NOT NULL DEFAULT 0 COMMENT '渠道:ios、andriod、web、微信小程序',
  pay_status TINYINT NOT NULL COMMENT '支付状态:0=SUCCESS(成功),1=FAILED(支付失败),2=CLOSED(已取消),3=REFUNDING(退款中),4=REFUNDED(已退款)',
  grant_status TINYINT NOT NULL DEFAULT 0 COMMENT '发放状态:0=INIT,1=GRANTING,2=GRANTED,3=FAILED',
  subject VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '标题/摘要',
  description TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '描述/备注',
  is_aboard_flag VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '国内/海外标识,如 0/1',
  expired_at DATETIME(3) NULL COMMENT '支付超时',
  paid_at DATETIME(3) NULL COMMENT '支付成功时间',
  failed_at DATETIME(3) NULL COMMENT '失败时间',
  client_ip VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '客户端IP',
  country VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '国家/地区',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除',
  version BIGINT NOT NULL DEFAULT 0 COMMENT '行版本号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付订单表(兼容订阅/一次性)';

-- 2) 退款
-- 作用:替代 t_user_order_refund,记录退款请求与结果
CREATE TABLE t_payx_refund (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  refund_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '内部退款单号',
  order_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '关联订单号',
  user_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户ID',
  refund_amt DECIMAL(18,6) NOT NULL COMMENT '退款金额',
  currency VARCHAR(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '币种',
  platform_refund_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '第三方退款号',
  refund_status TINYINT NOT NULL COMMENT '退款状态:0=INIT,1=PROCESSING,2=SUCCESS,3=FAILED',
  reason VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '退款原因',
  requested_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '请求时间',
  completed_at DATETIME(3) NULL COMMENT '完成时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除',
  version BIGINT NOT NULL DEFAULT 0 COMMENT '行版本号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款表';

-- 3) 通知/回调日志
-- 作用:替代 t_pay_apply_notify_log / _bk / t_pay_google_notify_log 等回调日志,统一渠道与幂等键
CREATE TABLE t_payx_notify (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  notify_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ID',
  order_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联订单号',
  message_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通知ID/请求ID(幂等键)',
  channel TINYINT NOT NULL COMMENT '渠道:0=WeChat,1=Alipay,2=Apple,3=Google,4=Stripe,5=Other',
  platform_txn_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联第三方交易号',
  status TINYINT NOT NULL COMMENT '通知处理状态:0=RECEIVED,1=PROCESSED,2=IGNORED,3=FAILED',
  payload TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '通知内容',
  headers TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '通知头',
  error_msg VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '错误信息',
  received_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '收到时间',
  processed_at DATETIME(3) NULL COMMENT '处理完成时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付回调/通知日志';

-- 4) 第三方请求日志
-- 作用:替代 t_app_third_server_request_log / t_app_request_log_apple 等第三方请求日志
CREATE TABLE t_payx_request (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  request_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '本地请求ID(幂等/防重放)',
  channel TINYINT NOT NULL COMMENT '渠道',
  order_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联订单号',
  request_url VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求URL',
  req_body TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求报文',
  resp_body TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '响应报文',
  status TINYINT NOT NULL DEFAULT 0 COMMENT '请求状态:0=OK,1=ERROR',
  duration_ms INT NULL COMMENT '耗时ms',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付请求日志';

-- 5) 支付凭证表
CREATE TABLE `t_payx_receipt`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `receipt_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '凭证id',
  `order_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '订单id',
  `user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户 ID(用于审计)',
  `receipt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Apple/Google 交易凭证',
  `platform` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '支付平台(APPLE/GOOGLE)',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
  del_flag CHAR(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志:0=存在,2=删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '订单支付凭证表(Apple/Google)';


扫描二维码,在手机上阅读
收藏

前端面试

App用户缓存说明

评 论
请登录后再评论