聚合支付系统设计与实现概述

122 阅读6分钟

在当今数字化支付时代,企业需要对接多个支付渠道来满足用户不同的支付习惯。本文将详细介绍如何设计和实现一个完整的聚合支付系统,支持微信支付、支付宝、银联支付,并使用工厂模式、策略模式、模板方法模式等设计模式来保证系统的可扩展性和可维护性。

一、系统概述

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(支付回调记录表)记录所有回调日志,支持重试和追踪

四、支付流程设计

03_payment_flow.png

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消息队列的异步处理
✅ 外部应用接入和渠道配置

通过本系统,商户可以快速对接多种支付方式,用户可以自由选择喜欢的支付方式,实现了真正的一次接入,全网支付。