微信支付 Java SDK 数据库设计:支付记录存储最佳实践
一、核心业务字段设计
支付记录存储需包含微信支付核心标识与业务状态,基于微信支付 APIv3 规范,关键字段参考 service/src/main/java/com/wechat/pay/java/service/ecommerceprofitsharing/model/QueryOrderResponse.java 设计如下:
| 字段名 | 类型 | 说明 | 关联SDK定义 |
|---|---|---|---|
| transaction_id | VARCHAR(64) | 微信支付订单号 | transactionId |
| out_order_no | VARCHAR(64) | 商户订单号 | outOrderNo |
| order_id | VARCHAR(64) | 微信分账订单号 | orderId |
| total_amount | DECIMAL(12,2) | 订单总金额 | - |
| status | VARCHAR(32) | 支付状态 | 交易状态描述 |
二、状态流转设计
支付状态需覆盖从创建到完成的全生命周期,参考微信支付 API 状态码设计状态机:
状态字段定义可参考 service/src/main/java/com/wechat/pay/java/service/wexinpayscoreparking/model/Transaction.java 中的交易状态描述机制。
三、分账场景扩展设计
涉及分账业务时需扩展分账明细子表,关联字段参考 service/src/main/java/com/wechat/pay/java/service/ecommerceprofitsharing/EcommerceProfitSharingService.java 的分账订单接口设计:
CREATE TABLE profit_sharing_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
transaction_id VARCHAR(64) NOT NULL,
receiver_account VARCHAR(64) NOT NULL COMMENT '分账接收方账号',
amount DECIMAL(12,2) NOT NULL COMMENT '分账金额',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (transaction_id) REFERENCES payment_record(transaction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
四、索引优化策略
针对高频查询场景,建立复合索引如下:
-- 支付结果查询优化
CREATE INDEX idx_transaction_id ON payment_record(transaction_id);
-- 商户订单查询优化
CREATE INDEX idx_out_order_no ON payment_record(out_order_no);
-- 状态+时间范围查询优化
CREATE INDEX idx_status_create_time ON payment_record(status, create_time);
五、数据安全设计
- 敏感信息加密:使用 SDK 内置加密工具 core/src/main/java/com/wechat/pay/java/core/cipher/AeadAesCipher.java 加密存储手机号等敏感信息
- 防重放设计:参考 core/src/main/java/com/wechat/pay/java/core/auth/WechatPay2Validator.java 实现请求防重放机制
- 日志审计:记录关键操作日志,包含 core/src/main/java/com/wechat/pay/java/core/http/HttpRequest.java 中的请求参数
六、SDK 集成示例
使用微信支付 Java SDK 实现支付记录持久化:
// 1. 获取支付结果
QueryOrderResponse response = profitSharingService.queryOrder(request);
// 2. 构建支付记录实体
PaymentRecord record = new PaymentRecord();
record.setTransactionId(response.getTransactionId());
record.setOutOrderNo(response.getOutOrderNo());
record.setOrderId(response.getOrderId());
record.setStatus("SUCCESS");
record.setCreateTime(new Date());
// 3. 保存数据库
paymentRecordMapper.insert(record);
代码示例参考 service/src/main/java/com/wechat/pay/java/service/ecommerceprofitsharing/EcommerceProfitSharingService.java 的订单查询接口实现。
七、最佳实践总结
- 幂等设计:使用
out_order_no作为唯一键避免重复下单,参考 service/src/main/java/com/wechat/pay/java/service/ecommerceprofitsharing/model/QueryOrderRequest.java - 异步更新:通过微信支付结果通知 core/src/main/java/com/wechat/pay/java/core/notification/NotificationParser.java 实现状态异步更新
- 数据归档:超过90天的历史订单归档至历史表,保留核心索引表提升查询性能
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



