微信支付 Java SDK 数据库设计:支付记录存储最佳实践

【免费下载链接】wechatpay-java 微信支付 APIv3 的官方 Java Library 【免费下载链接】wechatpay-java 项目地址: https://gitcode.com/GitHub_Trending/we/wechatpay-java

一、核心业务字段设计

支付记录存储需包含微信支付核心标识与业务状态,基于微信支付 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 状态码设计状态机:

mermaid

状态字段定义可参考 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);

五、数据安全设计

  1. 敏感信息加密:使用 SDK 内置加密工具 core/src/main/java/com/wechat/pay/java/core/cipher/AeadAesCipher.java 加密存储手机号等敏感信息
  2. 防重放设计:参考 core/src/main/java/com/wechat/pay/java/core/auth/WechatPay2Validator.java 实现请求防重放机制
  3. 日志审计:记录关键操作日志,包含 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 的订单查询接口实现。

七、最佳实践总结

  1. 幂等设计:使用 out_order_no 作为唯一键避免重复下单,参考 service/src/main/java/com/wechat/pay/java/service/ecommerceprofitsharing/model/QueryOrderRequest.java
  2. 异步更新:通过微信支付结果通知 core/src/main/java/com/wechat/pay/java/core/notification/NotificationParser.java 实现状态异步更新
  3. 数据归档:超过90天的历史订单归档至历史表,保留核心索引表提升查询性能

【免费下载链接】wechatpay-java 微信支付 APIv3 的官方 Java Library 【免费下载链接】wechatpay-java 项目地址: https://gitcode.com/GitHub_Trending/we/wechatpay-java

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐