Feature: specs/016-omg-payment/spec.md Date: 2026-07-29
端到端验证 OMG 支付可用性的可运行场景。实现细节见 tasks.md(待生成),接口字段见 contracts/api.md,表结构见 data-model.md。
updatesql/sql.md 中 2026-07-29 的三张表 DDL(pos_store_omg / pos_order_omg_payment / pos_order_omg_refund)。application.yml)填入测试值:
omg.base-url=https://payment-stage.funpoint.com.twomg.return-url / omg.payment-info-url 指向公网可达的本服务地址(本地用 ngrok/frp 穿透到 8082)。MerchantID / HashKey / HashIV。OmgCheckMacValue.main,应 PASS(用官方示例值复算得 AA5842FD...CAF93266)。MerchantID/HashKey/HashIV)。QueryTradeInfo/V5 查虚构单号探测金钥。pos_store_omg.omg_status=2, is_enabled=1;金钥错误 → 拒绝、状态不变、last_verify_result 记失败原因。pos_order.pay_status=0)。POST /pay/omg/create?orderid=... → 返回 form 字段(gatewayUrl + MerchantID/MerchantTradeNo/.../CheckMacValue)。/pay/omg/notify。/pay/omg/notify 验签 CheckMacValue 通过、RtnCode=1、SimulatePaid=0 → 回 1|OK;pos_order_omg_payment.pay_status=1、trade_no 写入、pay_type=Credit;pos_order.pay_status=1(state 不变)、订单日志记录、用户/商家/骑手收到推送(含 sendAcceptRiderPush)。trade_no 再发一次 notify → 不重复更新订单、不重复推送,仍回 1|OK。TradeAmt ≠ 订单 amount → 拒绝核销、记日志。SimulatePaid=1 → 不核销发货、记日志。ChoosePayment=ALL 时消费者在 OMG 选 ATM 或超商。/pay/omg/paymentInfo 带虚帐/缴费码 → 平台展示(前端页)与期限。/pay/omg/notify(RtnCode=1)→ 同场景 B 核销。pay_type=ATM/CVS,超期未付订单可重试或失效。/CreditDetail/DoAction(Action 按状态,默认 R 退刷)→ 写 pos_order_omg_refund。pos_order_omg_payment.pay_status=3(已退款)、pos_order.pay_status=2、pos_order_omg_refund.rtn_code=1;失败 → 记 rtn_msg 可重试、不误标已退款。DoAction 不可用,退款须在正式环境做小额验证或 mock 测试。newebpay 依赖(grep 验证)。