当前位置: 首页 > news >正文

支付系统架构设计

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


文章目录

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

目录

  • 一、支付系统概述
  • 二、架构设计
  • 三、核心功能实现
  • 四、安全设计
  • 总结

一、支付系统概述

1.1 支付流程

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

1.2 支付渠道

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

二、架构设计

2.1 系统架构

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

2.2 数据库设计

-- 支付单表CREATETABLEpayment(idBIGINTPRIMARYKEY,payment_noVARCHAR(50)NOTNULL,order_idBIGINTNOTNULL,user_idBIGINTNOTNULL,amountDECIMAL(10,2)NOTNULL,channelVARCHAR(20)NOTNULL,statusINTDEFAULT0,create_timeDATETIME,pay_timeDATETIME);-- 支付流水表CREATETABLEpayment_log(idBIGINTPRIMARYKEY,payment_idBIGINTNOTNULL,actionVARCHAR(50)NOTNULL,amountDECIMAL(10,2),statusINT,create_timeDATETIME);-- 退款表CREATETABLErefund(idBIGINTPRIMARYKEY,refund_noVARCHAR(50)NOTNULL,payment_idBIGINTNOTNULL,amountDECIMAL(10,2)NOTNULL,reasonVARCHAR(200),statusINTDEFAULT0,create_timeDATETIME);

三、核心功能实现

3.1 统一支付接口

// 支付策略接口publicinterfacePaymentStrategy{PaymentResultpay(PaymentRequestrequest);RefundResultrefund(RefundRequestrequest);PaymentResultquery(StringpaymentNo);}// 支付宝实现@ServicepublicclassAlipayStrategyimplementsPaymentStrategy{@OverridepublicPaymentResultpay(PaymentRequestrequest){AlipayClientclient=newDefaultAlipayClient(...);AlipayTradePagePayRequestpayRequest=newAlipayTradePagePayRequest();payRequest.setReturnUrl(returnUrl);payRequest.setNotifyUrl(notifyUrl);JSONObjectbizContent=newJSONObject();bizContent.put("out_trade_no",request.getPaymentNo());bizContent.put("total_amount",request.getAmount());bizContent.put("subject",request.getSubject());payRequest.setBizContent(bizContent.toString());Stringform=client.pageExecute(payRequest).getBody();returnnewPaymentResult(form);}}// 支付工厂@ComponentpublicclassPaymentFactory{@AutowiredprivateMap<String,PaymentStrategy>strategies;publicPaymentStrategygetStrategy(Stringchannel){returnstrategies.get(channel+"Strategy");}}

3.2 支付回调处理

@RestControllerpublicclassPaymentCallbackController{@AutowiredprivatePaymentServicepaymentService;@PostMapping("/callback/alipay")publicStringalipayCallback(HttpServletRequestrequest){// 1. 验签booleansignVerified=AlipaySignature.rsaCheckV1(...);if(!signVerified){return"fail";}// 2. 获取参数StringpaymentNo=request.getParameter("out_trade_no");StringtradeNo=request.getParameter("trade_no");StringtradeStatus=request.getParameter("trade_status");// 3. 处理支付结果if("TRADE_SUCCESS".equals(tradeStatus)){paymentService.handlePaymentSuccess(paymentNo,tradeNo);}return"success";}}

3.3 幂等性处理

@ServicepublicclassPaymentService{@AutowiredprivateStringRedisTemplateredisTemplate;publicvoidhandlePaymentSuccess(StringpaymentNo,StringtradeNo){// 幂等性检查Stringkey="payment:callback:"+paymentNo;Booleansuccess=redisTemplate.opsForValue().setIfAbsent(key,"1",1,TimeUnit.HOURS);if(!Boolean.TRUE.equals(success)){log.info("支付回调已处理: {}",paymentNo);return;}// 更新支付状态Paymentpayment=paymentMapper.selectByPaymentNo(paymentNo);if(payment.getStatus()==PaymentStatus.SUCCESS){return;}payment.setStatus(PaymentStatus.SUCCESS);payment.setTradeNo(tradeNo);payment.setPayTime(newDate());paymentMapper.updateById(payment);// 发送消息通知订单服务mqProducer.send("payment.success",payment);}}

四、安全设计

4.1 签名验证

// 签名工具publicclassSignUtil{publicstaticStringsign(Map<String,String>params,Stringkey){StringsignStr=params.entrySet().stream().sorted(Map.Entry.comparingByKey()).map(e->e.getKey()+"="+e.getValue()).collect(Collectors.joining("&"));returnDigestUtils.md5Hex(signStr+"&key="+key);}publicstaticbooleanverify(Map<String,String>params,Stringsign,Stringkey){StringcalculatedSign=sign(params,key);returncalculatedSign.equals(sign);}}

4.2 敏感信息加密

// 敏感信息加密存储@EncryptprivateStringbankCardNo;@EncryptprivateStringidCard;

总结

支付系统概述:支付流程、支付渠道
架构设计:系统架构、数据库设计
核心功能实现:统一支付接口、回调处理、幂等性
安全设计:签名验证、敏感信息加密

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


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

http://www.jsqmd.com/news/694547/

相关文章:

  • 别再只改Backbone了!YOLOv5轻量化新思路:深度剖析C3模块,手把手教你用深度可分离卷积定制自己的轻量版
  • 一文读懂企业的“血液”:现金流 - 智慧园区
  • R语言metaprop函数详解:针对单组率数据,如何选择PRAW、PLOGIT等5种转换方法?
  • 04华夏之光永存:电磁弹射+一次性火箭航天入轨方案【第四篇:电磁弹射轨道长度、倾角、结构工程设计】
  • 别急着重装!Win10蓝屏报错volmgr 161,我靠加装一块固态硬盘彻底解决了
  • 秒杀系统架构设计
  • 在Windows上直接安装Android应用:告别模拟器的终极解决方案
  • 2026最新缅甸天然翡翠厂家/厂商推荐!国内优质权威榜单发布,广东佛山等地实力厂商口碑出众 - 十大品牌榜
  • Python自动化办公新利器:用undetected_chromedriver搞定那些需要登录的网站
  • python anext
  • Django React Boilerplate企业级最佳实践:Vinta Software经验总结
  • 2026最新中高端翡翠手镯供应商/批发推荐!广东佛山优质靠谱榜单发布,源头直供货真价实选品无忧 - 十大品牌榜
  • 2026 广东最新茶饮培训推荐!广州优质企业榜单发布,靠谱 - 十大品牌榜
  • 三步实现B站缓存视频永久保存:m4s转MP4完整解决方案
  • Flask》》 Flask-OpenID 认证、 OpenID Connect (OIDC)
  • 告别OpenHardwareMonitor:用C#的WMI手撸一个轻量级硬件监控工具(附完整源码)
  • Midscene.js完整教程:让AI成为你的浏览器操作员
  • 告别手动拖拽!用Qt的QHBoxLayout轻松搞定复杂工具栏布局(附完整代码)
  • 告别‘打包即膨胀’:用Python虚拟环境为你的Tkinter程序‘瘦身’,exe文件从95MB瘦到16MB
  • 国内2026 广东最新奶茶供应链推荐!广州优质公司榜单发布,靠谱 - 十大品牌榜
  • 2026年论文降AI后AI率又反弹?3款降AI工具的这个细节很多人忽视
  • 2026最新翡翠手镯定制批发/工厂推荐!广东优质权威榜单发布,实力靠谱佛山等地工厂精选 - 十大品牌榜
  • 【Eclipse】中文语言包离线安装
  • 超越ResNet:为什么HRNet的多分辨率并行结构在姿态估计和分割任务上更胜一筹?
  • Dynamic 3D Gaussians:革命性动态3D场景建模与跟踪技术详解
  • Genetic Drawing实战案例:从零开始制作个人专属艺术画作
  • 2026 广东珠三角最新燕窝推荐!广州优质厂家榜单发布,靠谱 - 十大品牌榜
  • 别再只盯着Linux了!从零到一,聊聊一个普通运维工程师的日常工具箱(含具体工具清单)
  • HackGen字体构建揭秘:从源代码到TTF的完整流程
  • ADSP21489的SPORT接口实战:手把手教你用CCES配置I2S音频传输(附SRU路由避坑点)