支付模块重构 - 实施检查清单
本文档为详细的实施步骤清单,执行时逐项勾选
阶段一:基础设施层搭建(第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路径完全一致
- [ ] 请求参数完全兼容
- [ ] 响应格式完全一致
- [ ] 错误码完全兼容