logo

肝”战聚合代扣:一周网关开发全记录

作者:carzy2025.09.26 12:04浏览量:1

简介:本文记录开发者一周内从零搭建聚合代扣支付网关的全过程,涵盖技术选型、支付通道对接、异常处理机制等核心环节,通过代码示例与架构图解构关键实现逻辑。

“肝”战聚合代扣:一周网关开发全记录

这一周,我带领团队完成了公司聚合代扣支付网关的从0到1搭建。这个项目涉及银行、第三方支付、清算机构等多方对接,既要保证支付成功率,又要满足风控合规要求。作为技术负责人,我全程参与了架构设计、核心模块开发和压力测试,以下是详细的技术复盘。

一、技术选型:微服务架构下的支付中台

项目初期,我们面临架构选型的关键决策。传统单体架构在支付场景下存在扩展性差、故障隔离难的问题,而微服务架构能更好地支持多支付通道的动态扩展。最终采用Spring Cloud Alibaba生态构建支付中台,核心组件包括:

  • 网关层:Spring Cloud Gateway实现路由、鉴权、限流
  • 业务层:聚合支付服务、通道管理服务、对账服务
  • 数据层:MySQL分库分表存储交易数据,Redis缓存通道状态
  • 监控层:Prometheus+Grafana实时监控交易指标
  1. // 网关路由配置示例
  2. routes:
  3. - id: payment_route
  4. uri: lb://payment-service
  5. predicates:
  6. - Path=/api/payment/**
  7. filters:
  8. - name: RequestRateLimiter
  9. args:
  10. redis-rate-limiter.replenishRate: 100
  11. redis-rate-limiter.burstCapacity: 200

这种架构使得新增支付通道时,只需实现通道适配器接口并注册到Nacos服务发现,无需修改核心业务代码。

二、核心模块开发:从协议适配到异常处理

1. 支付协议适配层

不同支付通道的协议差异是首要挑战。我们设计了统一的PaymentChannelAdapter接口:

  1. public interface PaymentChannelAdapter {
  2. // 预下单
  3. PreOrderResponse preOrder(PreOrderRequest request);
  4. // 扣款
  5. PayResponse pay(PayRequest request);
  6. // 查询
  7. QueryResponse query(String orderNo);
  8. // 退款
  9. RefundResponse refund(RefundRequest request);
  10. }

以微信支付为例,实现类需要处理XML协议转换、签名验证等细节:

  1. @Service("wechatPayAdapter")
  2. public class WechatPayAdapter implements PaymentChannelAdapter {
  3. @Override
  4. public PayResponse pay(PayRequest request) {
  5. // 1. 构建XML请求体
  6. String xmlReq = buildWechatPayXml(request);
  7. // 2. 发送HTTPS请求
  8. HttpResponse response = HttpClient.post(WECHAT_PAY_URL, xmlReq);
  9. // 3. 解析XML响应
  10. WechatPayResponse wechatResp = parseWechatResponse(response);
  11. // 4. 转换为统一响应
  12. return convertToPayResponse(wechatResp);
  13. }
  14. private String buildWechatPayXml(PayRequest request) {
  15. // 实现微信支付特定字段映射和签名
  16. // ...
  17. }
  18. }

2. 分布式事务处理

代扣场景涉及用户账户、支付通道、商户账户三方资金变动,必须保证最终一致性。我们采用TCC模式实现:

  • Try阶段:冻结用户余额,预留通道额度
  • Confirm阶段:执行实际扣款,更新账户
  • Cancel阶段:解冻余额,释放通道额度
  1. @Transactional
  2. public boolean executeTccPayment(PaymentOrder order) {
  3. // Try阶段
  4. boolean tryResult = accountService.freeze(order.getUserId(), order.getAmount())
  5. && channelService.reserveQuota(order.getChannelId(), order.getAmount());
  6. if (!tryResult) {
  7. throw new RuntimeException("Try阶段失败");
  8. }
  9. try {
  10. // Confirm阶段
  11. boolean confirmResult = channelService.pay(order)
  12. && accountService.deduct(order.getUserId(), order.getAmount());
  13. if (!confirmResult) {
  14. // 补偿操作
  15. accountService.unfreeze(order.getUserId(), order.getAmount());
  16. channelService.releaseQuota(order.getChannelId(), order.getAmount());
  17. return false;
  18. }
  19. return true;
  20. } catch (Exception e) {
  21. // 异常处理
  22. rollbackTcc(order);
  23. throw e;
  24. }
  25. }

3. 智能路由引擎

为提高支付成功率,设计了基于规则的路由引擎:

  1. public class PaymentRouter {
  2. private List<RoutingRule> rules;
  3. public PaymentChannel selectChannel(PaymentRequest request) {
  4. return rules.stream()
  5. .filter(rule -> rule.match(request))
  6. .findFirst()
  7. .map(rule -> rule.getChannel())
  8. .orElseThrow(() -> new RuntimeException("无可用支付通道"));
  9. }
  10. }
  11. // 路由规则示例
  12. public class AmountRangeRule implements RoutingRule {
  13. private BigDecimal minAmount;
  14. private BigDecimal maxAmount;
  15. private PaymentChannel channel;
  16. @Override
  17. public boolean match(PaymentRequest request) {
  18. return request.getAmount().compareTo(minAmount) >= 0
  19. && request.getAmount().compareTo(maxAmount) <= 0;
  20. }
  21. }

实际生产中,规则包括:

  • 金额区间路由
  • 通道成功率路由
  • 费用最优路由
  • 限额路由

三、测试与上线:全链路压测与监控

1. 全链路压测方案

使用JMeter模拟真实交易场景:

  • 并发用户数:从100逐步增加到1000
  • 交易类型:包含小额高频、大额低频等多种组合
  • 通道比例:按照生产环境真实比例分配

压测中发现MySQL连接池耗尽问题,优化方案:

  1. # 调整连接池配置
  2. spring.datasource.hikari.maximum-pool-size=50
  3. spring.datasource.hikari.connection-timeout=30000

2. 实时监控体系

构建三级监控体系:

  1. 交易监控:成功率、TPS、响应时间
  2. 通道监控:各通道可用性、限额状态
  3. 系统监控:JVM、数据库、中间件指标

关键告警规则:

  • 连续5分钟支付成功率<95% → 紧急告警
  • 单通道故障持续时间>10分钟 → 严重告警
  • 数据库连接数>80% → 警告

四、经验总结与优化方向

1. 关键经验

  1. 协议解耦:将支付通道协议与业务逻辑完全解耦,降低新增通道成本
  2. 异步化设计:对账、通知等非实时操作采用消息队列异步处理
  3. 灰度发布:通过Nacos权重配置实现新通道的渐进式上线

2. 待优化点

  1. 智能熔断:当前熔断策略较简单,计划引入Sentinel实现动态熔断
  2. 自动化测试:构建支付场景的自动化测试框架
  3. 可视化运维:开发支付通道管理后台,实现配置化运维

这一周的”肝”战让我深刻体会到,支付网关作为金融系统的核心组件,必须在稳定性、扩展性、合规性之间找到完美平衡点。后续我们将持续优化架构,向”零故障、高可用”的目标迈进。

相关文章推荐

发表评论

活动