支付重构方案-实施检查清单-20251127


支付模块重构 - 实施检查清单

本文档为详细的实施步骤清单,执行时逐项勾选


阶段一:基础设施层搭建(第1-2天)

1.1 依赖更新

  • [ ] 1. pom.xml依赖更新

    • 位置: changfeng-pay/pom.xml
    • 动作: 添加以下依赖
      
      <!-- Redisson 分布式锁 -->
      <dependency>
      <groupId>org.redisson</groupId>
      <artifactId>redisson-spring-boot-starter</artifactId>
      <version>3.27.0</version>
      </dependency>
    org.springframework.retry spring-retry org.springframework spring-aspects org.springframework.boot spring-boot-starter-webflux org.springframework.boot spring-boot-starter-validation
    
    - 验证: `mvn compile` 无错误

1.2 目录创建

  • [ ] 2. 创建包目录结构
    • 位置: changfeng-pay/src/main/java/com/changfeng/pay/
    • 动作: 创建以下目录
      pay/
      ├── api/
      │   └── notify/
      ├── facade/
      ├── core/
      │   ├── service/
      │   │   └── impl/
      │   ├── processor/
      │   └── event/
      ├── gateway/
      │   ├── wechat/
      │   ├── alipay/
      │   ├── apple/
      │   ├── google/
      │   └── stripe/
      ├── model/
      │   ├── request/
      │   ├── response/
      │   ├── dto/
      │   └── enums/
      ├── handler/
      ├── infrastructure/
      │   ├── config/
      │   ├── lock/
      │   ├── http/
      │   ├── retry/
      │   ├── idempotent/
      │   └── async/
      ├── exception/
      ├── util/
      └── constant/
    • 验证: 目录结构与规划一致

1.3 配置类

  • [ ] 3. 线程池配置

    • 位置: infrastructure/config/PaymentThreadPoolConfig.java
    • 内容:

      @Configuration
      public class PaymentThreadPoolConfig {
      
      @Bean("paymentExecutor")
      public ThreadPoolExecutor paymentExecutor() {
        return new ThreadPoolExecutor(
            10,                      // 核心线程数
            50,                      // 最大线程数
            60L, TimeUnit.SECONDS,   // 空闲时间
            new LinkedBlockingQueue<>(1000),  // 队列容量
            new ThreadFactoryBuilder()
                .setNameFormat("payment-pool-%d")
                .build(),
            new ThreadPoolExecutor.CallerRunsPolicy()  // 拒绝策略
        );
      }
      
      @Bean("notifyExecutor")
      public ThreadPoolExecutor notifyExecutor() {
        return new ThreadPoolExecutor(
            5, 20, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(500),
            new ThreadFactoryBuilder()
                .setNameFormat("notify-pool-%d")
                .build(),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
      }
      }
    • 验证: Spring启动成功,Bean注入正常
  • [ ] 4. WebClient配置

    • 位置: infrastructure/config/WebClientConfig.java
    • 内容:

      @Configuration
      public class WebClientConfig {
      
      @Bean
      public WebClient paymentWebClient() {
        HttpClient httpClient = HttpClient.create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
            .responseTimeout(Duration.ofSeconds(30))
            .doOnConnected(conn -> conn
                .addHandlerLast(new ReadTimeoutHandler(30))
                .addHandlerLast(new WriteTimeoutHandler(10)));
      
        return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .codecs(configurer -> configurer
                .defaultCodecs()
                .maxInMemorySize(16 * 1024 * 1024))
            .build();
      }
      }
    • 验证: HTTP请求测试正常
  • [ ] 5. Redisson配置

    • 位置: infrastructure/config/RedissonConfig.java
    • 内容:

      @Configuration
      public class RedissonConfig {
      
      @Value("${spring.redis.host:localhost}")
      private String host;
      
      @Value("${spring.redis.port:6379}")
      private int port;
      
      @Value("${spring.redis.password:}")
      private String password;
      
      @Value("${spring.redis.database:0}")
      private int database;
      
      @Bean(destroyMethod = "shutdown")
      public RedissonClient redissonClient() {
        Config config = new Config();
        String address = "redis://" + host + ":" + port;
        config.useSingleServer()
            .setAddress(address)
            .setPassword(StringUtils.hasText(password) ? password : null)
            .setDatabase(database)
            .setConnectionPoolSize(64)
            .setConnectionMinimumIdleSize(10)
            .setConnectTimeout(10000)
            .setTimeout(3000)
            .setRetryAttempts(3)
            .setRetryInterval(1500);
        return Redisson.create(config);
      }
      }
    • 验证: RedissonClient注入成功
  • [ ] 6. 重试配置

    • 位置: infrastructure/config/RetryConfig.java
    • 内容:

      @Configuration
      @EnableRetry
      public class RetryConfig {
      
      @Bean
      public RetryTemplate paymentRetryTemplate() {
        RetryTemplate retryTemplate = new RetryTemplate();
      
        // 指数退避策略
        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
        backOffPolicy.setInitialInterval(1000);  // 初始间隔1秒
        backOffPolicy.setMultiplier(2.0);        // 倍数
        backOffPolicy.setMaxInterval(30000);     // 最大间隔30秒
        retryTemplate.setBackOffPolicy(backOffPolicy);
      
        // 重试策略
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(3);
        retryTemplate.setRetryPolicy(retryPolicy);
      
        return retryTemplate;
      }
      }
    • 验证: @Retryable注解生效

1.4 基础设施组件

  • [ ] 7. 分布式锁接口

    • 位置: infrastructure/lock/DistributedLock.java
    • 验证: 接口定义完整
  • [ ] 8. 分布式锁实现

    • 位置: infrastructure/lock/DistributedLockImpl.java
    • 内容:

      @Slf4j
      @Component
      public class DistributedLockImpl implements DistributedLock {
      
      @Autowired
      private RedissonClient redissonClient;
      
      private static final String LOCK_PREFIX = "payment:lock:";
      
      // ThreadLocal存储当前线程持有的锁
      private final ThreadLocal<Map<String, RLock>> lockHolder = 
        ThreadLocal.withInitial(HashMap::new);
      
      @Override
      public boolean tryLock(String key, long timeout, TimeUnit unit) {
        String lockKey = LOCK_PREFIX + key;
        RLock lock = redissonClient.getLock(lockKey);
        try {
            boolean acquired = lock.tryLock(timeout, unit);
            if (acquired) {
                lockHolder.get().put(key, lock);
                log.debug("获取分布式锁成功: {}", lockKey);
            } else {
                log.warn("获取分布式锁失败: {}", lockKey);
            }
            return acquired;
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            log.error("获取分布式锁被中断: {}", lockKey, e);
            return false;
        }
      }
      
      @Override
      public void unlock(String key) {
        RLock lock = lockHolder.get().get(key);
        if (lock != null && lock.isHeldByCurrentThread()) {
            lock.unlock();
            lockHolder.get().remove(key);
            log.debug("释放分布式锁成功: {}", LOCK_PREFIX + key);
        }
      }
      
      @Override
      public boolean isLocked(String key) {
        String lockKey = LOCK_PREFIX + key;
        RLock lock = redissonClient.getLock(lockKey);
        return lock.isLocked();
      }
      }
    • 验证: 并发测试锁互斥正常
  • [ ] 9. 幂等检查器

    • 位置: infrastructure/idempotent/IdempotentChecker.java (接口)
    • 位置: infrastructure/idempotent/RedisIdempotentChecker.java (实现)
    • 内容:

      @Slf4j
      @Component
      public class RedisIdempotentChecker implements IdempotentChecker {
      
      @Autowired
      private RedisCache redisCache;
      
      private static final String IDEMPOTENT_PREFIX = "payment:idempotent:";
      private static final long DEFAULT_EXPIRE_SECONDS = 86400; // 24小时
      
      @Override
      public boolean isDuplicate(String type, String key) {
        String cacheKey = buildKey(type, key);
        return redisCache.hasKey(cacheKey);
      }
      
      @Override
      public void markProcessed(String type, String key) {
        markProcessed(type, key, DEFAULT_EXPIRE_SECONDS);
      }
      
      @Override
      public void markProcessed(String type, String key, long expireSeconds) {
        String cacheKey = buildKey(type, key);
        redisCache.setCacheObject(cacheKey, "1", (int) expireSeconds, TimeUnit.SECONDS);
        log.debug("标记幂等键: {}", cacheKey);
      }
      
      private String buildKey(String type, String key) {
        return IDEMPOTENT_PREFIX + type + ":" + key;
      }
      }
    • 验证: 重复请求被正确拦截
  • [ ] 10. 异步执行器

    • 位置: infrastructure/async/PaymentAsyncExecutor.java (接口)
    • 位置: infrastructure/async/PaymentAsyncExecutorImpl.java (实现)
    • 内容:

      @Slf4j
      @Component
      public class PaymentAsyncExecutorImpl implements PaymentAsyncExecutor {
      
      @Autowired
      @Qualifier("paymentExecutor")
      private ThreadPoolExecutor executor;
      
      @Override
      public void execute(Runnable task) {
        executor.execute(() -> {
            try {
                task.run();
            } catch (Exception e) {
                log.error("异步任务执行异常", e);
            }
        });
      }
      
      @Override
      public <T> void execute(Callable<T> task, Consumer<T> callback) {
        executor.execute(() -> {
            try {
                T result = task.call();
                if (callback != null) {
                    callback.accept(result);
                }
            } catch (Exception e) {
                log.error("异步任务执行异常", e);
            }
        });
      }
      
      @Override
      public <T> Future<T> submit(Callable<T> task) {
        return executor.submit(task);
      }
      
      @Override
      public <T> void executeWithTimeout(Callable<T> task, long timeoutMs, 
                                       Consumer<Throwable> fallback) {
        Future<T> future = executor.submit(task);
        executor.execute(() -> {
            try {
                future.get(timeoutMs, TimeUnit.MILLISECONDS);
            } catch (TimeoutException e) {
                future.cancel(true);
                log.warn("异步任务超时");
                if (fallback != null) {
                    fallback.accept(e);
                }
            } catch (Exception e) {
                log.error("异步任务执行异常", e);
                if (fallback != null) {
                    fallback.accept(e);
                }
            }
        });
      }
      }
    • 验证: 异步任务执行正常

阶段二:统一模型层(第2天)

  • [ ] 11. PaymentPlatform枚举

    • 位置: model/enums/PaymentPlatform.java
    • 验证: 编译通过
  • [ ] 12. PaymentStatus枚举

    • 位置: model/enums/PaymentStatus.java
    • 验证: 编译通过
  • [ ] 13. ProductType枚举

    • 位置: model/enums/ProductType.java
    • 验证: 与原有枚举code值兼容
  • [ ] 14. CreateOrderRequest

    • 位置: model/request/CreateOrderRequest.java
    • 验证: 包含所有渠道需要的字段
  • [ ] 15. CreateOrderResponse

    • 位置: model/response/CreateOrderResponse.java
    • 验证: 能承载所有渠道的返回数据
  • [ ] 16. VerifyOrderRequest

    • 位置: model/request/VerifyOrderRequest.java
    • 验证: 包含所有渠道需要的字段
  • [ ] 17. VerifyOrderResponse

    • 位置: model/response/VerifyOrderResponse.java
    • 验证: 能承载所有渠道的验证结果
  • [ ] 18. PaymentResult DTO

    • 位置: model/dto/PaymentResult.java
    • 验证: 统一支付结果对象完整
  • [ ] 19. PaymentOrder DTO

    • 位置: model/dto/PaymentOrder.java
    • 验证: 统一订单对象完整
  • [ ] 20. NotifyMessage DTO

    • 位置: model/dto/NotifyMessage.java
    • 验证: 统一通知消息对象完整
  • [ ] 21. Money值对象

    • 位置: model/dto/Money.java
    • 验证: 支持多币种

阶段三:异常体系(第2天)

  • [ ] 22. PaymentException基类

    • 位置: exception/PaymentException.java
    • 内容:

      @Getter
      public class PaymentException extends RuntimeException {
      private final String errorCode;
      private final String errorMsg;
      
      public PaymentException(String errorMsg) {
        super(errorMsg);
        this.errorCode = "PAYMENT_ERROR";
        this.errorMsg = errorMsg;
      }
      
      public PaymentException(String errorCode, String errorMsg) {
        super(errorMsg);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
      }
      
      public PaymentException(String errorCode, String errorMsg, Throwable cause) {
        super(errorMsg, cause);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
      }
      }
    • 验证: 编译通过
  • [ ] 23. PaymentGatewayException

    • 位置: exception/PaymentGatewayException.java
    • 验证: 包含平台信息
  • [ ] 24. SignatureVerifyException

    • 位置: exception/SignatureVerifyException.java
  • [ ] 25. OrderNotFoundException

    • 位置: exception/OrderNotFoundException.java
  • [ ] 26. DuplicateOrderException

    • 位置: exception/DuplicateOrderException.java
  • [ ] 27. IdempotentException

    • 位置: exception/IdempotentException.java
  • [ ] 28. PaymentExceptionHandler

    • 位置: exception/PaymentExceptionHandler.java
    • 内容:

      @Slf4j
      @RestControllerAdvice(basePackages = "com.changfeng.pay")
      public class PaymentExceptionHandler {
      
      @ExceptionHandler(PaymentException.class)
      public AjaxAppResult handlePaymentException(PaymentException e) {
        log.error("支付异常: code={}, msg={}", e.getErrorCode(), e.getErrorMsg());
        return AjaxAppResult.error(e.getErrorCode(), e.getErrorMsg());
      }
      
      @ExceptionHandler(DuplicateOrderException.class)
      public AjaxAppResult handleDuplicateOrder(DuplicateOrderException e) {
        log.warn("重复订单: {}", e.getMessage());
        return AjaxAppResult.error("79", e.getMessage());
      }
      
      @ExceptionHandler(OrderNotFoundException.class)
      public AjaxAppResult handleOrderNotFound(OrderNotFoundException e) {
        log.warn("订单不存在: {}", e.getMessage());
        return AjaxAppResult.error("70", e.getMessage());
      }
      
      @ExceptionHandler(Exception.class)
      public AjaxAppResult handleException(Exception e) {
        log.error("系统异常", e);
        return AjaxAppResult.error("500", "系统繁忙,请稍后重试");
      }
      }
    • 验证: 异常能被正确捕获

阶段四:网关层实现(第3-5天)

4.1 网关核心

  • [ ] 29. PaymentGateway接口

    • 位置: gateway/PaymentGateway.java
    • 验证: 接口方法完整
  • [ ] 30. AbstractPaymentGateway抽象类

    • 位置: gateway/AbstractPaymentGateway.java
    • 验证: 模板方法流程正确
  • [ ] 31. PaymentGatewayFactory工厂

    • 位置: gateway/PaymentGatewayFactory.java
    • 验证: 能正确获取对应网关

4.2 微信支付网关

  • [ ] 32. WechatPayConfig配置类

    • 位置: gateway/wechat/WechatPayConfig.java
    • 验证: 配置注入正常
  • [ ] 33. WechatSignatureUtil签名工具

    • 位置: gateway/wechat/WechatSignatureUtil.java
    • 验证: 签名生成和验证正确
  • [ ] 34. WechatPaymentAdapter适配器

    • 位置: gateway/wechat/WechatPaymentAdapter.java
    • 验证: SDK响应适配正确
  • [ ] 35. WechatPaymentGateway网关实现

    • 位置: gateway/wechat/WechatPaymentGateway.java
    • 验证: 创建订单、验证订单功能正常

4.3 支付宝网关

  • [ ] 36. AlipayConfig配置类

    • 位置: gateway/alipay/AlipayConfig.java
  • [ ] 37. AlipaySignatureUtil签名工具

    • 位置: gateway/alipay/AlipaySignatureUtil.java
  • [ ] 38. AlipayPaymentAdapter适配器

    • 位置: gateway/alipay/AlipayPaymentAdapter.java
  • [ ] 39. AlipayPaymentGateway网关实现

    • 位置: gateway/alipay/AlipayPaymentGateway.java
    • 验证: 创建订单、验证订单功能正常

4.4 苹果支付网关

  • [ ] 40. ApplePayConfig配置类

    • 位置: gateway/apple/ApplePayConfig.java
  • [ ] 41. AppleReceiptVerifier收据验证器

    • 位置: gateway/apple/AppleReceiptVerifier.java
  • [ ] 42. AppleStoreKitClient客户端

    • 位置: gateway/apple/AppleStoreKitClient.java
  • [ ] 43. ApplePaymentAdapter适配器

    • 位置: gateway/apple/ApplePaymentAdapter.java
  • [ ] 44. ApplePaymentGateway网关实现

    • 位置: gateway/apple/ApplePaymentGateway.java
    • 验证: 验证receipt功能正常

4.5 谷歌支付网关

  • [ ] 45. GooglePayConfig配置类

    • 位置: gateway/google/GooglePayConfig.java
  • [ ] 46. GooglePlayClient客户端

    • 位置: gateway/google/GooglePlayClient.java
  • [ ] 47. GooglePaymentAdapter适配器

    • 位置: gateway/google/GooglePaymentAdapter.java
  • [ ] 48. GooglePaymentGateway网关实现

    • 位置: gateway/google/GooglePaymentGateway.java
    • 验证: 订阅验证、一次性购买验证功能正常

4.6 Stripe支付网关

  • [ ] 49. StripeConfig配置类

    • 位置: gateway/stripe/StripeConfig.java
  • [ ] 50. StripePaymentAdapter适配器

    • 位置: gateway/stripe/StripePaymentAdapter.java
  • [ ] 51. StripePaymentGateway网关实现

    • 位置: gateway/stripe/StripePaymentGateway.java
    • 验证: 创建订阅、一次性支付功能正常

阶段五:核心服务层(第5-6天)

  • [ ] 52. OrderService接口

    • 位置: core/service/OrderService.java
  • [ ] 53. OrderServiceImpl实现

    • 位置: core/service/impl/OrderServiceImpl.java
    • 验证: 订单CRUD正常
  • [ ] 54. PermissionService接口

    • 位置: core/service/PermissionService.java
  • [ ] 55. PermissionServiceImpl实现

    • 位置: core/service/impl/PermissionServiceImpl.java
    • 验证: 权限下发正常(调用原有MemberServiceUtil)
  • [ ] 56. ProductService服务

    • 位置: core/service/ProductService.java
    • 验证: 产品查询正常
  • [ ] 57. PaymentEvent事件基类

    • 位置: core/event/PaymentEvent.java
  • [ ] 58. PaymentSuccessEvent成功事件

    • 位置: core/event/PaymentSuccessEvent.java
  • [ ] 59. PaymentFailedEvent失败事件

    • 位置: core/event/PaymentFailedEvent.java
  • [ ] 60. PaymentEventPublisher发布器

    • 位置: core/event/PaymentEventPublisher.java
    • 验证: 事件能被正确发布
  • [ ] 61. SubscriptionProcessor订阅处理器

    • 位置: core/processor/SubscriptionProcessor.java
    • 验证: 监听事件,执行订阅权限下发
  • [ ] 62. PurchaseProcessor购买处理器

    • 位置: core/processor/PurchaseProcessor.java
    • 验证: 监听事件,执行一次性购买权限下发

阶段六:门面层(第6天)

  • [ ] 63. PaymentFacade接口

    • 位置: facade/PaymentFacade.java
  • [ ] 64. PaymentFacadeImpl实现

    • 位置: facade/PaymentFacadeImpl.java
    • 验证: 完整流程跑通
  • [ ] 65. NotifyFacade接口

    • 位置: facade/NotifyFacade.java
  • [ ] 66. NotifyFacadeImpl实现

    • 位置: facade/NotifyFacadeImpl.java
    • 验证: 通知处理流程正常

阶段七:责任链处理器(第6-7天)

  • [ ] 67. NotifyHandler接口

    • 位置: handler/NotifyHandler.java
  • [ ] 68. NotifyContext上下文

    • 位置: handler/NotifyContext.java
  • [ ] 69. NotifyHandlerChain处理器链

    • 位置: handler/NotifyHandlerChain.java
  • [ ] 70. SignatureVerifyHandler签名验证

    • 位置: handler/SignatureVerifyHandler.java
    • 验证: 各渠道签名验证正确
  • [ ] 71. IdempotentHandler幂等处理

    • 位置: handler/IdempotentHandler.java
    • 验证: 重复通知被拦截
  • [ ] 72. DecryptHandler解密处理

    • 位置: handler/DecryptHandler.java
    • 验证: 通知解密正确
  • [ ] 73. BusinessHandler业务处理

    • 位置: handler/BusinessHandler.java
    • 验证: 业务逻辑执行正常

阶段八:Controller层适配(第7-8天)

8.1 重构现有Controller

  • [ ] 74. ApplePayController重构

    • 位置: api/ApplePayController.java
    • 关键: 保持@RequestMapping("/pay/apply/iap")不变
    • 验证: /creatOrder, /verifyOrder 接口行为一致
  • [ ] 75. AlipayController重构

    • 位置: api/AlipayController.java
    • 关键: 保持原有路径映射
    • 验证: 接口行为一致
  • [ ] 76. GooglePayController重构

    • 位置: api/GooglePayController.java
    • 关键: 保持@RequestMapping("/pay/google/iap")不变
    • 验证: 接口行为一致
  • [ ] 77. WechatPayController重构

    • 位置: api/WechatPayController.java
    • 关键: 保持@RequestMapping("/pay/wechatpay")不变
    • 验证: 接口行为一致
  • [ ] 78. StripePayController重构

    • 位置: api/StripePayController.java
    • 验证: 接口行为一致

8.2 回调Controller重构

  • [ ] 79. AppleNotifyController重构

    • 位置: api/notify/AppleNotifyController.java
    • 验证: 回调处理正常
  • [ ] 80. AlipayNotifyController重构

    • 位置: api/notify/AlipayNotifyController.java
    • 验证: 回调处理正常
  • [ ] 81. GoogleNotifyController重构

    • 位置: api/notify/GoogleNotifyController.java
    • 验证: 回调处理正常
  • [ ] 82. WechatNotifyController重构

    • 位置: api/notify/WechatNotifyController.java
    • 验证: 回调处理正常
  • [ ] 83. StripeWebhookController重构

    • 位置: api/notify/StripeWebhookController.java
    • 验证: Webhook处理正常

阶段九:工具类与常量(第8天)

  • [ ] 84. PaymentIdGenerator订单号生成器

    • 位置: util/PaymentIdGenerator.java
    • 验证: 高并发下不重复
  • [ ] 85. MoneyUtils金额工具

    • 位置: util/MoneyUtils.java
    • 验证: 精度正确
  • [ ] 86. SignatureUtils签名工具

    • 位置: util/SignatureUtils.java
  • [ ] 87. JsonUtils JSON工具

    • 位置: util/JsonUtils.java
  • [ ] 88. PaymentConstants常量

    • 位置: constant/PaymentConstants.java
  • [ ] 89. CacheKeyConstants缓存Key常量

    • 位置: constant/CacheKeyConstants.java

阶段十:配置与测试(第8-9天)

10.1 配置整理

  • [ ] 90. application.yml配置整理
    • 位置: changfeng-admin/src/main/resources/application*.yml
    • 动作:
    • 添加线程池配置
    • 添加Redisson配置
    • 整理支付相关配置前缀

10.2 测试

  • [ ] 91. 网关层单元测试

    • 位置: changfeng-pay/src/test/java/com/changfeng/pay/gateway/
  • [ ] 92. 门面层单元测试

    • 位置: changfeng-pay/src/test/java/com/changfeng/pay/facade/
  • [ ] 93. 基础设施单元测试

    • 位置: changfeng-pay/src/test/java/com/changfeng/pay/infrastructure/
  • [ ] 94. 集成测试

    • 动作: 各渠道完整支付流程测试

10.3 清理与回归

  • [ ] 95. 删除旧代码

    • 位置: changfeng-pay/src/main/java/com/changfeng/domain/
    • 前提: 确认新代码完全工作
    • 动作: 删除旧的Controller、Service、Util
  • [ ] 96. 回归测试

    • 动作: 使用Postman/APP测试所有接口
    • 验证: 接口行为与重构前完全一致

阶段十一:预留扩展(文档)

  • [ ] 97. ReconciliationFacade对账门面(预留)

    • 位置: facade/ReconciliationFacade.java
    • 状态: 空接口,待后续实现
  • [ ] 98. ErrorHandlingService差错处理(预留)

    • 位置: core/service/ErrorHandlingService.java
    • 状态: 空接口,待后续实现

验收标准

功能验收

  • [ ] 苹果支付: 创建订单、验证订单、回调通知
  • [ ] 谷歌支付: 创建订单、验证订阅、验证一次性购买、回调通知
  • [ ] 微信支付: 创建订单、查询订单、回调通知
  • [ ] 支付宝: 创建订单、查询订单、回调通知
  • [ ] Stripe: 创建订阅、创建一次性支付、Webhook

非功能验收

  • [ ] 所有接口响应时间 < 3秒
  • [ ] 幂等性: 重复请求被正确拦截
  • [ ] 并发安全: 分布式锁保护关键操作
  • [ ] 重试机制: 失败自动重试,指数退避
  • [ ] 日志规范: 关键节点有日志,包含订单号等关键信息

兼容性验收

  • [ ] API路径完全一致
  • [ ] 请求参数完全兼容
  • [ ] 响应格式完全一致
  • [ ] 错误码完全兼容


扫描二维码,在手机上阅读
收藏

支付模块重构-251128

支付重构方案-各层详细设计-20251127

评 论
请登录后再评论