# Quickstart: OMG AIO 创建支付订单验证 ## Prerequisites 1. 使用 JDK 21:`C:\Users\qmj\.jdks\graalvm-jdk-21.0.7`。 2. 开发者已手动执行 `updatesql/sql.md` 中 `pos_order_omg_attempt` DDL。 3. 测试门店在可信 `pos_store_omg` 中录入并启用 OMG stage 凭证。 4. 准备该用户自己的单门店订单:`dd_id = parent_dd_id`、`pay_type='2'`、`pay_status=0`、`state IN (0,1,2)`、`amount>0`。 5. `omgpay.return-url` 是受控 HTTPS 地址,路径精确为 `/pay/omg/notify`。 ## Automated verification ```powershell $env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7' $env:Path="$env:JAVA_HOME\bin;$env:Path" mvn -pl ruoyi-system -am -Dtest='OmgPaymentAttemptServiceTest' -Dsurefire.failIfNoSpecifiedTests=false test mvn -pl ruoyi-admin -am -Dtest='OmgCheckMacSignerTest,OmgPaymentFormFactoryTest,OmgPaymentCreateServiceTest,OmgPaymentControllerTest' -Dsurefire.failIfNoSpecifiedTests=false test mvn -pl ruoyi-admin -am -DskipTests package ``` ## Create request ```powershell $headers = @{ token = '' } $body = @{ orderId = '' } | ConvertTo-Json $response = Invoke-RestMethod -Method Post ` -Uri 'https:///pay/omg/create' ` -Headers $headers -ContentType 'application/json' -Body $body $response.data ``` Expected: - `status=CREATED`。 - `gatewayUrl` 精确等于 stage AioCheckOut V5 地址。 - `formFields` 包含规格规定的 16 个字段。 - `CheckMacValue` 是 64 位大写十六进制。 - 响应不含 HashKey 或 HashIV。 ## Current-page form POST 在客户端当前页面创建 `
`,action 设置为 `gatewayUrl`,逐一把 `formFields` 的键和值创建为 hidden input,然后调用 `form.submit()`。不要设置 iframe target,也不要 `window.open()`。 Expected: 浏览器进入 OMG stage 收银台,显示正确金额与门店可用的 `ALL` 渠道。 ## Duplicate request 对同一 `orderId` 再调用创建接口。 Expected: - 返回 `PAYMENT_ATTEMPT_EXISTS`。 - 没有 `formFields`。 - 数据库没有第二条该 `dd_id` 的 `CREATED` 行。 - 不生成或返回新的 MerchantTradeNo。 ## Concurrent request 用两个 PowerShell 作业同时提交同一订单: ```powershell $uri = 'https:///pay/omg/create' $tokenValue = '' $json = (@{ orderId = '' } | ConvertTo-Json -Compress) $jobs = 1..2 | ForEach-Object { Start-Job -ScriptBlock { param($u, $t, $b) Invoke-RestMethod -Method Post -Uri $u -Headers @{ token = $t } ` -ContentType 'application/json' -Body $b } -ArgumentList $uri, $tokenValue, $json } $jobs | Wait-Job | Receive-Job $jobs | Remove-Job ``` Expected: 一个请求成功,一个请求返回 `PAYMENT_ATTEMPT_EXISTS`。手动查询: ```sql SELECT dd_id, COUNT(*) AS active_count FROM pos_order_omg_attempt WHERE active_dd_id = '' GROUP BY dd_id; ``` `active_count` 必须为 1。 ## Negative cases 分别验证无效 token、他人订单、多门店子订单、state=3/4、pay_status 非 0、amount<=0、pay_type 非 2、无启用凭证。每项都必须: - 返回国际化业务错误与稳定 status; - 不写新尝试; - 不泄露其他订单或门店凭证详情。 ## Log review 确认日志可按 orderId 定位创建开始、校验、成功或拒绝,异常路径含服务端堆栈。全文搜索不得出现: - 请求 token; - HashKey / HashIV 的值; - 完整 CheckMacValue; - 完整 `formFields` 或凭证对象序列化内容。 ## Callback expectation 本阶段 `/pay/omg/notify` 没有处理器。即使在 stage 完成付款,也不得期待订单核销或回调成功;不得把旧 OMG 回调结果作为验收证据。