Input: spec.md, plan.md, research.md, data-model.md, contracts/api.md, quickstart.md
Tests: 本功能强制 TDD。每个生产任务先写失败测试并实际观察失败,再写最小实现。
Scope: 只完成测试环境创建支付订单;不实现回调、查询、补单、退款、关账或正式环境。
ruoyi-system/src/test/java/com/ruoyi/system/omgpay/service/OmgPaymentAttemptServiceTest.java 编写新尝试字段校验、CREATED 插入和生成列不由 Java 写入的失败测试ruoyi-system/src/test/java/com/ruoyi/system/omgpay/mapper/OmgPaymentAttemptMapperContractTest.java 编写 FOR UPDATE、新表名、唯一键及无旧表 SQL 的失败合约测试updatesql/sql.md 仅追加 pos_order_omg_attempt DDL,不执行数据库变更ruoyi-system/src/main/java/com/ruoyi/system/omgpay/domain/ 新建 OmgPaymentAttempt 和 OmgPaymentOrderSnapshotruoyi-system/src/main/java/com/ruoyi/system/omgpay/mapper/OmgPaymentAttemptMapper.java 与 ruoyi-system/src/main/resources/mapper/omgpay/OmgPaymentAttemptMapper.xml 实现锁定订单、活跃尝试、交易号查询和显式 INSERTruoyi-system/src/main/java/com/ruoyi/system/omgpay/service/ 实现 IOmgPaymentAttemptService 与校验严格的 OmgPaymentAttemptServiceImplOmgPaymentAttemptServiceTest,OmgPaymentAttemptMapperContractTest 并确认通过Checkpoint: 新表 DDL 已登记,system 模块可锁定订单并只写新尝试表。
OmgCheckMacSignerTest 写入官方期望值 AA5842FDA7E55ACEB7118D6353E9822CA6D6FF09A0D1FC129A879DD5CAF93266、额外字段、空值字段、输入不可变和非法字段失败测试com.ruoyi.app.omgpay.OmgCheckMacSigner 实现排序、HashKey/HashIV 包夹、官方 .NET URL encode、小写、SHA-256 和大写输出OmgCheckMacSignerTest,确认官方向量和字段完整性全部通过OmgMerchantTradeNoGeneratorTest 编写 20 位大写英数字与样本唯一性失败测试OmgPaymentFormFactoryTest 编写 Taipei 时间、stage URL、16 字段、固定字段、全部字段签名及不安全 ReturnURL 失败测试OmgPaymentProperties、OmgMerchantTradeNoGenerator、OmgPaymentForm 与 OmgPaymentFormFactoryapplication.yml 新增独立 omgpay.return-url,新代码不读取旧 omg.* 创建/回调配置Checkpoint: 可从服务端事实生成一份严格 stage-only、全字段签名的表单。
OmgPaymentCreateServiceTest 编写订单不存在/越权、非单店、非法状态、已支付、金额、payType、门店和凭证失败矩阵PAYMENT_ATTEMPT_EXISTS 且不调用生成器/表单/凭证的失败测试OmgPaymentErrorCode、OmgPaymentBusinessException、OmgPaymentCreateOutcome 和响应 DTO@Transactional OmgPaymentCreateService#create,保证锁订单和活跃查询发生在 MerchantTradeNo 生成前OmgPaymentCreateServiceTest 并检查新包对旧 OMG 类/Service 零引用Checkpoint: 首次请求创建,重复请求稳定拒绝;没有任何网关 HTTP 或旧支付表访问。
OmgPaymentControllerTest 编写 /pay/omg/create、token header、显式 DTO、无 Map 入参和请求字段白名单失败测试omg.pay.* key 集合OmgPaymentTokenUserResolver、请求/错误 DTO 与新 OmgPaymentControllerOmgPaymentControllerTest 和 i18n key 对齐检查Checkpoint: 新 Controller 独占 /pay/omg/create,响应与日志满足安全契约。
OmgLegacyRetirementTest 编写旧 Controller、旧任务、旧支付实体必须不存在及新 Controller 只有 create 路由的失败测试OmgPayController、专属 DTO、OmgReconcileTask、OmgQueryThrottle 和旧 Controller 测试pos_store_omg 全部可信实现UserOrderController 与 PosOrderShOprateController 取消链路移除旧 OMG 退款调用,不改变其他取消行为PosOrderController 移除旧 OMG 补单、退款、人工确认端点及注入/辅助方法OrderLifecycleService 移除旧表依赖和旧 OMG 补单/退款方法,保留 payType="2" 的支付前进门禁OrderLifecycleServiceTest,移除旧表测试/构造参数并保留已有 LINE 和订单生命周期测试OmgLegacyRetirementTest,OrderLifecycleServiceTest,并确认 main Java/XML 对旧支付/退款表及服务零匹配application.yml 的旧 omg 配置收敛为凭证验证所需 base-url,移除旧回调/查询/补单/退款配置并保留新 omgpay.return-urlCheckpoint: 旧表删除后没有可达运行链路访问它们;旧回调、查询、补单和退款接口全部不可达。
OrderLifecycleServiceTest,LinePayCancellationRaceTestmvn -pl ruoyi-admin -am -DskipTests packagegit diff --check、git status --short、git diff --stat 并确认无无关文件quickstart.md 验证首次创建、当前页 POST、重复、真实并发、负例和日志POST /pay/omg/create 首次返回可提交的 stage 表单。CREATED,后续请求为 PAYMENT_ATTEMPT_EXISTS。omgpay 包,不引用旧 OMG 支付实现。pos_store_omg 凭证实现未修改。