在当今数字化支付时代,企业需要对接多个支付渠道来满足用户不同的支付习惯。本文将详细介绍如何设计和实现一个完整的聚合支付系统,支持微信支付、支付宝、银联支付,并使用工厂模式、策略模式、模板方法模式等设计模式来保证系统的可扩展性和可维护性。
一、系统概述
1.1 什么是聚合支付?
聚合支付是指将多种支付方式(如微信支付、支付宝、银联支付等)整合到一个统一的平台上,商户只需要对接一次,就可以支持用户使用任何一种支付方式进行付款。
1.2 系统特点
✅ 统一接入:一次对接,支持多种支付方式
✅ 灵活配置:支持动态配置支付渠道和支付方式
✅ 高可用性:使用MQ消息队列实现异步处理
✅ 安全可靠:完善的签名验证机制和幂等性处理
✅ 易于扩展:使用设计模式,新增支付渠道非常方便
二、系统架构设计
2.1 架构分层
系统采用分层架构设计,从上到下分为:
1. 接入层Nginx + API Gateway,负责负载均衡和请求路由
2. 应用服务层提供支付接口、应用管理、配置管理等核心功能
3. 业务逻辑层使用设计模式实现支付策略、工厂、模板方法等
4. 支付渠道适配层适配微信、支付宝、银联等第三方支付接口
5. 数据存储层MySQL、Redis、MongoDB多级存储
6. 消息队列层RabbitMQ实现异步解耦
三、数据库设计
3.1 核心表结构
📊 app_info(外部应用表)存储接入的应用信息,包含应用ID、密钥、回调地址等
📊 pay_channel(支付渠道表)存储支付渠道配置,包含商户号、证书、优先级等
📊 pay_order(支付订单表)存储所有支付订单,记录订单状态、交易号等信息
📊 pay_notify_log(支付回调记录表)记录所有回调日志,支持重试和追踪
四、支付流程设计
4.1 支付流程详解
步骤1:商户发起支付请求提交订单信息、金额、支付方式等
步骤2:路由到支付工厂系统根据配置选择合适的支付渠道
步骤3:创建支付策略使用工厂模式创建对应的支付策略实例
步骤4:执行支付前处理验证签名、校验参数、检查订单状态
步骤5:调用第三方支付API根据不同渠道调用对应的支付接口
步骤6:返回支付结果统一返回格式(二维码URL、支付表单等)
步骤7:保存支付订单记录订单信息,状态为待支付
五、异步回调处理
5.1 回调处理流程
➊ 用户完成支付后,第三方支付平台发起异步回调
➋ 验证签名确保回调的真实性
➌ 更新订单状态为支付成功
➍ 发送MQ消息实现异步处理
➎ MQ消费者处理消息并通知商户
➏ 自动重试机制:失败后按指数退避策略重试
5.2 重试策略
第1次:1分钟后
第2次:5分钟后
第3次:30分钟后
第4次:2小时后
第5次:10小时后
六、设计模式应用
6.1 工厂模式(Factory Pattern)
@Component
public class PaymentFactory {
public PaymentStrategy createPayment(String channelCode) {
switch (channelCode) {
case "WECHAT":
return weChatPaymentStrategy;
case "ALIPAY":
return aliPayPaymentStrategy;
case "UNIONPAY":
return unionPayPaymentStrategy;
default:
throw new IllegalArgumentException("不支持的支付渠道");
}
}
}
作用:根据渠道编码动态创建支付策略,隐藏创建逻辑。
6.2 策略模式(Strategy Pattern)
public interface PaymentStrategy {
PayResponse pay(PayRequest request);
PayResponse query(String orderId);
PayResponse refund(String orderId, Double amount);
boolean verifyNotify(String data);
String getChannelCode();
}
作用:定义支付算法族,各个渠道独立实现,可以互相替换。
6.3 模板方法模式(Template Method Pattern)
public abstract class AbstractPaymentTemplate
implements PaymentStrategy {
public final PayResponse pay(PayRequest request) {
// 1. 验证请求参数
if (!validateRequest(request))
return failResponse();
// 2. 构建支付参数
Map<String, Object> params = buildPayParams(request);
// 3. 调用第三方API
Map<String, Object> apiResult =
callThirdPartyAPI(params);
// 4. 处理响应
PayResponse response =
processResponse(apiResult, request);
// 5. 保存订单
saveOrder(request, response);
return response;
}
protected abstract boolean validateRequest(
PayRequest request);
protected abstract Map<String, Object> buildPayParams(
PayRequest request);
protected abstract Map<String, Object> callThirdPartyAPI(
Map<String, Object> params);
protected abstract PayResponse processResponse(
Map<String, Object> apiResult, PayRequest request);
}
作用:定义支付流程骨架,子类实现具体步骤,保证流程统一且灵活。
七、外部应用接入流程
7.1 接入步骤
Step 1:注册应用填写应用基本信息
Step 2:生成密钥系统分配app_id和app_secret
Step 3:配置回调设置异步通知URL
Step 4:选择渠道勾选可用的支付渠道
Step 5:配置支付方式设置支持的支付类型
Step 6:签名验证完成接口对接测试
Step 7:审核开通平台审核后正式启用
7.2 安全机制
🔐 MD5/RSA双重签名验证
🔐 请求时间戳校验
🔐 防重放攻击
🔐 敏感信息加密
🔐 IP白名单限制
八、支付渠道配置
8.1 配置流程
1️⃣ 选择支付渠道(微信/支付宝/银联)
2️⃣ 填写基础配置(商户号、应用ID、密钥)
3️⃣ 上传证书文件
4️⃣ 配置支付方式(扫码、H5、APP、小程序)
5️⃣ 设置费率和优先级
6️⃣ 测试配置
7️⃣ 保存并启用
8.2 渠道特性对比
| 特性 | 微信支付 | 支付宝 | 银联支付 |
|---|---|---|---|
| 覆盖用户 | 社交用户 | 淘宝用户 | 银行卡用户 |
| 支持小程序 | ✅ | ❌ | ❌ |
| 支持花呗 | ❌ | ✅ | ❌ |
| 覆盖面 | 广 | 广 | 最广 |
| 费率 | 0.6% | 0.6% | 0.5%-1% |
九、MQ消息推送
9.1 MQ的作用
⚡ 异步解耦:支付成功后异步处理后续业务
⚡ 削峰填谷:应对高并发场景
⚡ 消息持久化:保证消息不丢失
⚡ 失败重试:自动重试机制
⚡ 消息追踪:完整的消息流转记录
9.2 消息队列设计
使用RabbitMQ实现多个业务队列:
payment.success.queue:支付成功通知
payment.failed.queue:支付失败通知
payment.refund.queue:退款处理
十、核心代码示例
10.1 支付请求示例
PayRequest request = new PayRequest();
request.setAppId("APP2025123000001");
request.setChannelCode("WECHAT");
request.setPayType("NATIVE");
request.setAmount(new BigDecimal("100.00"));
request.setBody("测试商品");
request.setOutTradeNo("ORD" + System.currentTimeMillis());
PayResponse response = paymentService.createPayOrder(request);
10.2 前端调用示例
// 创建支付订单
async handleCreatePayOrder() {
const res = await api.post('/payment/create', {
appId: 'APP2025123000001',
channelCode: 'WECHAT',
payType: 'NATIVE',
amount: 100.00,
body: '测试商品',
outTradeNo: 'ORD' + Date.now()
});
if (res.code === 'SUCCESS') {
// 获取二维码
console.log(res.qrCode);
}
}
十一、总结
本文详细介绍了一个完整的聚合支付系统的设计与实现,涵盖了:
✅ 完整的系统架构设计
✅ 数据库ER图设计
✅ 支付流程和回调流程
✅ 工厂模式、策略模式、模板方法模式的应用
✅ 微信、支付宝、银联三大支付渠道的接入
✅ MQ消息队列的异步处理
✅ 外部应用接入和渠道配置
通过本系统,商户可以快速对接多种支付方式,用户可以自由选择喜欢的支付方式,实现了真正的一次接入,全网支付。