Administrator
发布于 2026-03-16 / 7 阅读
0
0

支付业务层架构设计与技术亮点

支付业务层架构设计与技术亮点

项目:优福系统统一支付中心 - 业务层 技术栈:Spring Boot + MyBatis Plus + Redis + 分布式锁 + 乐观锁 标签:#支付服务 #面试宝典 #JavaWeb

一、整体架构设计

1. 业务分层架构

┌─────────────────────────────────────┐
│      Controller 层 (Web 接口)          │
└─────────────────────────────────────┘
                ↓
┌─────────────────────────────────────┐
│        Biz 层 (业务逻辑层) ⭐          │
│  ┌──────────────────────────────┐   │
│  │ BaseOrderPayBiz (抽象基类)    │   │
│  │ - 核心流程框架                │   │
│  │ - 公共方法实现                │   │
│  │ - 模板方法模式                │   │
│  └──────────────────────────────┘   │
│  ┌──────────────────────────────┐   │
│  │ AuthConsultOrderPayBiz       │   │
│  │ AuthCourseOrderPayBiz        │   │
│  │ - 具体业务实现                │   │
│  └──────────────────────────────┘   │
└─────────────────────────────────────┘
                ↓
┌─────────────────────────────────────┐
│     Repository 层 (数据访问层)         │
└─────────────────────────────────────┘

2. 核心业务类结构

biz.trade
├── BaseOrderPayBiz.java           # 抽象基类(模板方法模式)
├── AuthConsultOrderPayBiz.java    # 咨询订单支付业务
├── AuthCourseOrderPayBiz.java     # 课程订单支付业务
├── AuthWalletBiz.java             # 钱包业务(带乐观锁)
├── OrderRedisLockBiz.java         # Redis 分布式锁
└── TradePayConfigBiz.java         # 支付配置与通道费计算

二、核心设计模式

1. 模板方法模式(⭐⭐⭐⭐⭐)

应用场景:定义订单支付标准化流程,子类实现具体业务细节,通用流程复用。

核心实现:BaseOrderPayBiz抽象基类定义8个抽象方法+固定核心流程;子类(咨询/课程订单)继承并实现抽象方法适配专属业务。

面试话术:我用模板方法模式设计统一支付流程,BaseOrderPayBiz定义抽象方法和固定流程,子类仅实现商品验证、价格计算等细节,通用逻辑复用率80%+,既保证流程标准化,又能快速扩展新订单类型。

亮点:流程标准化、代码复用率高、扩展性强、维护成本低。

2. 策略模式(⭐⭐⭐⭐)

应用场景:多种支付方式动态路由,业务层调用支付路由服务实现灵活切换。

// BaseOrderPayBiz.java
protected TradeOrderResp createThirdPartyPayment(
        Object req, TradeOrder orderInfo, PayTypeEnum payTypeEnum) {
    TradeOrderReq orderReq = buildTradeOrderReq(req, orderInfo, product, payTypeEnum);
    // 策略模式核心:支付方式动态路由
    return payRouterService.tradeOrder(payTypeEnum, orderReq);
}

3. 工厂模式(⭐⭐⭐)

应用场景:订单对象创建封装,通过MapStruct转换器统一创建订单及订单项,简化逻辑。

三、关键技术亮点

1. Redis 分布式锁防重复提交

核心实现:setIfAbsent原子加锁,锁Key为order:pay:lock:userId:productId,Value用UUID+时间戳保证唯一;释放锁先比对再删除,防误删。

// 加锁
if (!orderRedisLockBiz.tryLock(lockKey, lockValue, 30)) {
    return CommonResponse.error("操作过于频繁,请稍后重试");
}
// 最终释放锁
finally {
    if (lockKey != null && lockValue != null) {
        orderRedisLockBiz.releaseLock(lockKey, lockValue);
    }
}

面试话术:支付接口用Redis分布式锁防重复提交,锁Key设计为用户+商品粒度,Value用UUID+时间戳确保唯一,setIfAbsent原子加锁,释放前比对Value防误删,30秒过期避免死锁。

2. 学习币混合支付设计

核心流程:冻结-扣减-解冻机制,全程用BigDecimal处理金额防精度误差。

1. 下单冻结可抵扣学习币;2. 现金支付成功后扣减冻结金额;3. 支付失败/取消自动解冻。

3. 继续支付优化

前置校验订单状态、所有权、过期时间;渠道未变则更新原记录+延长30分钟支付时间,渠道改变则删除原记录新建,保证数据一致。

4. 订单取消与退款

支持用户主动取消和系统超时取消,解冻学习币、更新订单状态,异步调用第三方关单接口不阻塞主流程。

5. 通道费与佣金计算

可配置费率(默认千分之6),支持最小/最大手续费,计算结果用于后续对账结算。

四、并发安全解决方案

1. 乐观锁机制

钱包余额更新用version版本号,更新时校验版本,不一致则重试(最多3次,间隔100ms),业务异常不重试。

2. 数据签名验签

钱包更新后,用用户ID、余额等关键字段生成签名;查询时验签,防止数据篡改。

五、面试常见问题预演

Q1: 如何保证订单支付接口的幂等性?

三层防护:1. Redis分布式锁(用户+商品粒度);2. 数据库订单号唯一索引;3. 业务状态校验(是否已购买/有待支付订单)。

Q2: 学习币冻结机制如何工作?

核心流程:下单冻结→支付成功扣减→支付失败解冻,防止学习币并发超支,保证资产安全。

Q3: 如何处理订单支付超时?

订单设30分钟过期,定时任务每分钟扫描超期待支付订单,自动取消并解冻学习币,异步关单不阻塞流程。

Q4: 继续支付为何判断支付渠道是否改变?

兼顾体验与数据一致:渠道未变更新原记录,减少脏数据;渠道改变删除原记录新建,避免支付失败。

Q5: 如何保证钱包更新的并发安全?

乐观锁+自动重试:version版本控制,更新失败最多重试3次,业务异常直接抛出,更新操作加事务保证原子性。

六、项目经验总结(简历+面试版)

1. 简历精简版

1. 基于模板方法模式设计统一支付流程,抽象基类复用80%+通用逻辑,新增订单类型开发效率提升60%;
2. 用Redis分布式锁防重复下单,并发冲突率降至0.01%以下;
3. 设计学习币混合支付方案,实现冻结-扣减-解冻机制,资产扣减零差错;
4. 乐观锁+重试解决钱包并发更新,结合签名验签保证数据防篡改;
5. 优化继续支付体验,动态处理支付渠道变更,减少脏数据;
6. 实现双模式订单取消,异步关单提升接口响应速度;
7. 开发可配置通道费模块,适配多支付渠道对账需求;
8. 三层防护实现支付

2. 面试口述版

面试官您好,我负责优福系统统一支付中心业务层架构设计与开发,技术栈为Spring Boot+MyBatis Plus+Redis等。核心用模板方法模式抽象BaseOrderPayBiz基类,统一支付流程,子类适配专属业务,通用逻辑复用率80%。重点解决三大问题:Redis分布式锁防重复下单、学习币冻结机制+乐观锁解决并发扣减、优化继续支付体验。还实现订单取消、通道费计算等功能,最终实现支付业务高复用、高并发、高可用,学习币扣减零差错。

七、核心总结

1. 设计模式运用

设计模式

应用场景

重要程度

模板方法模式

统一支付流程

⭐⭐⭐⭐⭐

策略模式

支付方式动态路由

⭐⭐⭐⭐

工厂模式

订单对象创建

⭐⭐⭐

2. 核心竞争力

架构设计(分层+模板方法)、并发处理(分布式锁+乐观锁)、业务建模(学习币机制)、问题解决(幂等性/超时处理)、工程化思维(可配置/日志追踪)。

面试重点:模板方法模式架构、Redis分布式锁与乐观锁的并发解决方案!


评论