quickstart.md 3.6 KB

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

$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

$headers = @{ token = '<USER_TOKEN>' }
$body = @{ orderId = '<SINGLE_STORE_DD_ID>' } | ConvertTo-Json
$response = Invoke-RestMethod -Method Post `
  -Uri 'https://<API_HOST>/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

在客户端当前页面创建 <form method="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 作业同时提交同一订单:

$uri = 'https://<API_HOST>/pay/omg/create'
$tokenValue = '<USER_TOKEN>'
$json = (@{ orderId = '<SINGLE_STORE_DD_ID>' } | 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。手动查询:

SELECT dd_id, COUNT(*) AS active_count
FROM pos_order_omg_attempt
WHERE active_dd_id = '<SINGLE_STORE_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 回调结果作为验收证据。