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

微信支付 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_idVARCHAR(64)微信支付订单号transactionId
out_order_noVARCHAR(64)商户订单号outOrderNo
order_idVARCHAR(64)微信分账订单号orderId
total_amountDECIMAL(12,2)订单总金额-
statusVARCHAR(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

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值