支付系统架构设计

系列导读:本篇将深入讲解支付系统的架构设计与核心实现。


文章目录

    • 目录
    • 一、支付系统概述
      • [1.1 支付流程](#1.1 支付流程)
      • [1.2 支付渠道](#1.2 支付渠道)
    • 二、架构设计
      • [2.1 系统架构](#2.1 系统架构)
      • [2.2 数据库设计](#2.2 数据库设计)
    • 三、核心功能实现
      • [3.1 统一支付接口](#3.1 统一支付接口)
      • [3.2 支付回调处理](#3.2 支付回调处理)
      • [3.3 幂等性处理](#3.3 幂等性处理)
    • 四、安全设计
      • [4.1 签名验证](#4.1 签名验证)
      • [4.2 敏感信息加密](#4.2 敏感信息加密)
    • 总结

目录


一、支付系统概述

1.1 支付流程

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    支付流程                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  用户下单 ──► 创建支付单 ──► 调用支付渠道 ──► 用户支付     │
│                                              │              │
│                                              ▼              │
│  订单完成 ◄── 更新订单状态 ◄── 支付回调 ◄── 支付成功       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 支付渠道

渠道 说明
支付宝 国内主流
微信支付 国内主流
银联 银行卡支付
PayPal 国际支付

二、架构设计

2.1 系统架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    支付系统架构                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    支付网关                         │   │
│  │              统一支付入口、路由                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│         ┌─────────────────┼─────────────────┐              │
│         ▼                 ▼                 ▼              │
│  ┌─────────────┐   ┌─────────────┐   ┌─────────────┐      │
│  │ 支付宝适配器 │   │ 微信适配器  │   │ 银联适配器  │      │
│  └─────────────┘   └─────────────┘   └─────────────┘      │
│                           │                                 │
│                           ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    核心服务                         │   │
│  │     支付单管理 │ 对账 │ 退款 │ 清算                 │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2.2 数据库设计

sql 复制代码
-- 支付单表
CREATE TABLE payment (
    id BIGINT PRIMARY KEY,
    payment_no VARCHAR(50) NOT NULL,
    order_id BIGINT NOT NULL,
    user_id BIGINT NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    channel VARCHAR(20) NOT NULL,
    status INT DEFAULT 0,
    create_time DATETIME,
    pay_time DATETIME
);

-- 支付流水表
CREATE TABLE payment_log (
    id BIGINT PRIMARY KEY,
    payment_id BIGINT NOT NULL,
    action VARCHAR(50) NOT NULL,
    amount DECIMAL(10,2),
    status INT,
    create_time DATETIME
);

-- 退款表
CREATE TABLE refund (
    id BIGINT PRIMARY KEY,
    refund_no VARCHAR(50) NOT NULL,
    payment_id BIGINT NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    reason VARCHAR(200),
    status INT DEFAULT 0,
    create_time DATETIME
);

三、核心功能实现

3.1 统一支付接口

java 复制代码
// 支付策略接口
public interface PaymentStrategy {
    PaymentResult pay(PaymentRequest request);
    RefundResult refund(RefundRequest request);
    PaymentResult query(String paymentNo);
}

// 支付宝实现
@Service
public class AlipayStrategy implements PaymentStrategy {
    
    @Override
    public PaymentResult pay(PaymentRequest request) {
        AlipayClient client = new DefaultAlipayClient(...);
        AlipayTradePagePayRequest payRequest = new AlipayTradePagePayRequest();
        payRequest.setReturnUrl(returnUrl);
        payRequest.setNotifyUrl(notifyUrl);
        
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", request.getPaymentNo());
        bizContent.put("total_amount", request.getAmount());
        bizContent.put("subject", request.getSubject());
        payRequest.setBizContent(bizContent.toString());
        
        String form = client.pageExecute(payRequest).getBody();
        return new PaymentResult(form);
    }
}

// 支付工厂
@Component
public class PaymentFactory {
    
    @Autowired
    private Map<String, PaymentStrategy> strategies;
    
    public PaymentStrategy getStrategy(String channel) {
        return strategies.get(channel + "Strategy");
    }
}

3.2 支付回调处理

java 复制代码
@RestController
public class PaymentCallbackController {
    
    @Autowired
    private PaymentService paymentService;
    
    @PostMapping("/callback/alipay")
    public String alipayCallback(HttpServletRequest request) {
        // 1. 验签
        boolean signVerified = AlipaySignature.rsaCheckV1(...);
        if (!signVerified) {
            return "fail";
        }
        
        // 2. 获取参数
        String paymentNo = request.getParameter("out_trade_no");
        String tradeNo = request.getParameter("trade_no");
        String tradeStatus = request.getParameter("trade_status");
        
        // 3. 处理支付结果
        if ("TRADE_SUCCESS".equals(tradeStatus)) {
            paymentService.handlePaymentSuccess(paymentNo, tradeNo);
        }
        
        return "success";
    }
}

3.3 幂等性处理

java 复制代码
@Service
public class PaymentService {
    
    @Autowired
    private StringRedisTemplate redisTemplate;
    
    public void handlePaymentSuccess(String paymentNo, String tradeNo) {
        // 幂等性检查
        String key = "payment:callback:" + paymentNo;
        Boolean success = redisTemplate.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.HOURS);
        if (!Boolean.TRUE.equals(success)) {
            log.info("支付回调已处理: {}", paymentNo);
            return;
        }
        
        // 更新支付状态
        Payment payment = paymentMapper.selectByPaymentNo(paymentNo);
        if (payment.getStatus() == PaymentStatus.SUCCESS) {
            return;
        }
        
        payment.setStatus(PaymentStatus.SUCCESS);
        payment.setTradeNo(tradeNo);
        payment.setPayTime(new Date());
        paymentMapper.updateById(payment);
        
        // 发送消息通知订单服务
        mqProducer.send("payment.success", payment);
    }
}

四、安全设计

4.1 签名验证

java 复制代码
// 签名工具
public class SignUtil {
    
    public static String sign(Map<String, String> params, String key) {
        String signStr = params.entrySet().stream()
            .sorted(Map.Entry.comparingByKey())
            .map(e -> e.getKey() + "=" + e.getValue())
            .collect(Collectors.joining("&"));
        
        return DigestUtils.md5Hex(signStr + "&key=" + key);
    }
    
    public static boolean verify(Map<String, String> params, String sign, String key) {
        String calculatedSign = sign(params, key);
        return calculatedSign.equals(sign);
    }
}

4.2 敏感信息加密

java 复制代码
// 敏感信息加密存储
@Encrypt
private String bankCardNo;

@Encrypt
private String idCard;

总结

支付系统概述 :支付流程、支付渠道

架构设计 :系统架构、数据库设计

核心功能实现 :统一支付接口、回调处理、幂等性

安全设计:签名验证、敏感信息加密

下篇预告日志平台架构设计


作者 :刘~浪地球
系列 :技术选型与实战(四)
更新时间:2026-04-24

相关推荐
Sam_Deep_Thinking8 小时前
用Java 17从0到1写一个mini版RPC,理解远程调用的本质
java·面试·rpc·程序员·系统架构
youngerwang1 天前
【系统架构案例分析每日深耕 Day 5】解释器/规则引擎架构在风控系统中的应用
系统架构·解释器模式·案例分析·风控系统
BerrySen1781 天前
基于Python的高性能多智能体协同RAG(检索增强生成)系统架构与生产级实现指南
人工智能·python·系统架构
粟悟饭&龟波功1 天前
【一】软件工程核心概念层级地图与项目落地全流程
系统架构·软件工程
Alex Gram2 天前
双机热备软件哪个好
java·系统架构·c#·keepalived·高可用·双机热备·双机热备软件
Sam_Deep_Thinking3 天前
一个靠谱的C端网关服务应该包含什么内容
java·程序员·系统架构
phltxy3 天前
多智能体系统架构设计:从单体代理到协作网络
python·langchain·系统架构
微三云 - 廖会灵 (私域系统开发)3 天前
消费返物业费平台搭建:美家时代商业模式拆解与系统开发选型指南
小程序·系统架构
回眸不遇4 天前
详谈 QT 布局 QLayout::SizeConstraint 和 QSizePolicy 对 QWidget 尺寸的影响
数据库·qt·系统架构
书签12364 天前
产教融合的技术解法:AI数字孪生驱动的校企协同育人系统架构与实践
人工智能·系统架构