Feature Branch: (待创建,暂未建分支/未提交)
Created: 2026-07-29
Status: Draft —— 关键决策已定(D1–D6,见「已定决策」)
Input: 接入台湾 OMG(歐買尬 / 金流引擎 FunPoint)AIO 幕前支付(https://developers.omg.com.tw/payment/aio/api/01_order.html)用于订单在线支付。替代已就绪未启用的蓝新 NewebPay(011,不再启用);OMG 独立实现、不复用蓝新代码,仅复用平台共享订单/推送链路。
https://payment-stage.funpoint.com.tw/Cashier/AioCheckOut/V5https://payment.funpoint.com.tw/Cashier/AioCheckOut/V5POST,application/x-www-form-urlencodedCheckMacValue(SHA256,EncryptType=1) 单字段签名;这与蓝新 NewebPay 的 TradeInfo(AES) + TradeSha(SHA256) 双层模型不同。结论:需独立的 OMG 签名工具,不能复用 NewebPayEncryptUtil。具体算法(参数排序、URI 编码、HashKey/HashIV 包夹、SHA256 大写)在文档附錄 07_appendices / 范例 06_check-value-sample,留待 plan/research 落地。ChoosePayment=Credit 内;同时传 UnionPay=2 隐藏银联,不使用 ALL。
CheckMacValue → POST 到 AioCheckOut/V5 → 消费者在 OMG 收银台支付 → OMG 服务端 POST 回 ReturnURL(商户须回 1|OK)→ 可选 OrderResultURL 客户端跳转(仅即时支付方式支持)。PaymentInfoURL、ClientRedirectURL 或延期支付返回接口。05_refund API;订单查询:04_order_query;付款结果通知:03_payment_notify。InvoiceMark 必须 N —— 电子发票仍走本项目 ezPay 链路(010/014),与支付解耦。MerchantTradeNo 全平台唯一;ReturnURL 与 OrderResultURL 不可相同。project-deprecated-code 记忆)。PosOrderShOprate/PosOrderQsOprate/UserOrderController/PosOrderController)、PayPush(iOS uni 云函数 msduser/msdrider/msdstore + PushEvent→push_message)、以及 sendAcceptRiderPush(迁移契机,见 CLAUDE.md「当前在用的订单操作入口」)。pos_store_omg。newebpay 依赖,不复用蓝新的 pos_store_newebpay / pos_order_payment;仅复用平台共享基础设施(订单状态机、推送、订单日志)。ChoosePayment=Credit、UnionPay=2,不开放 ATM、CVS、BarcodeATM、AFTEE 或银联。05_refund)。说明:OMG 文档可正常获取(与 015 的 iFlight 不同),无硬阻塞。决策已定,可直接进
/speckit-plan。
消费者下单后选择在线支付,选定方式(如信用卡/Apple Pay),跳转 OMG 收银台完成付款;付款成功后订单变为已支付并进入履约。
Why this priority:在线支付是订单交易闭环的核心,没有它订单无法在线收款。
Independent Test:从一笔待支付订单出发,能跳转 OMG、用测试卡完成支付,订单状态变为已支付。
Acceptance Scenarios:
OMG 服务端回调(ReturnURL)到达后,验签 + 幂等更新订单,并触发后续履约(状态流转、商家/骑手推送)。
Why this priority:支付成功必须可靠地驱动订单履约,否则「付了钱却没人接单」。
Independent Test:模拟 OMG 回调(合法/伪造/重复),合法回调能更新订单并触发推送,伪造被拒、重复不重复发货。
Acceptance Scenarios:
1|OK,履约链路(含 sendAcceptRiderPush 推送)被触发。当前仍在开发测试阶段,不保留 ATM、CVS、BarcodeATM、AFTEE 的创建、取号、返回或兼容处理。
Why removed:最终支付范围已经收敛为信用卡与 Apple Pay,且不存在生产历史订单。
Independent Test:新建表单不含延期支付参数,应用也不暴露延期支付返回接口。
Acceptance Scenarios:
PaymentInfoURL、ClientRedirectURL 或延期缴费期限参数。订单取消(用户取消/商家取消/超时退款)时,通过 OMG 退款 API(05_refund)原路退款,并同步状态。
Why this priority:售后资金闭环,依赖 D3 是否本期。
Independent Test:对一笔已支付订单发起取消,能调用 OMG 退款并同步为已退款。
Acceptance Scenarios:
商家或平台在后台维护 OMG 凭证(MerchantID/HashKey/HashIV),支持测试/生产切换与启用开关。
Why this priority:支付前提是凭证可用,属 P2 基础设施。
Independent Test:在后台录入门店 OMG 凭证,能用于发起支付与验签。
Acceptance Scenarios:
MerchantTradeNo 幂等,不重复发货/推送。MerchantTradeNo。MerchantTradeNo;查询超时、限流或结果不确定时必须保留原尝试。ChoosePayment=Credit 与 UnionPay=2;不得传 ALL,不得展示 ATM、CVS、BarcodeATM、AFTEE、银联或 LINE Pay。CheckMacValue(SHA256,EncryptType=1)对请求签名、对回调验签;签名工具独立于现有 NewebPay 工具。ReturnURL 回调时验签 + 按 MerchantTradeNo 幂等更新订单为已支付,并回 1|OK;订单核销的原子条件允许待接单 state=0 和堂食已自动接单 state=1,同时要求 pay_status=0,不得核销配送中、已完成或已取消订单。sendAcceptRiderPush)。05_refund)退款并同步状态(本期范围,D3);若取消先于 OMG 成功回调或主动补单到达,系统 MUST 记录真实付款、不触发履约,并通过持久化扫描自动退款,不能依赖单次回调线程完成退款。MerchantTradeNo、金额、方式、时间、回调原始报文、退款记录),并将脱敏后的后台回调内容写入共享 ipn_log,以 type=omg 区分支付渠道,支持排查与对账。InvoiceMark=N 下与 ezPay 电子发票链路解耦,支付不干涉开票。FR-016:系统 MUST 以公平、可恢复的方式调度 OMG queryTrade。未实际发出查询时不得消耗该订单的查询间隔;限流不得使固定排序后的后续订单长期饥饿。查询频率参数须标明其来源是官方契约或环境实测,不能把查询 TimeStamp 的 3 分钟有效期解释为支付尝试有效期。
FR-017:系统 MUST 自动补偿仍为 CREATED 的当前有效支付尝试。调度器按 next_query_time 取有限批次,并在真实查询前用条件更新预留该行;查询确认已付款或明确失败时必须复用主动查询的验签与同一状态机,未付款或暂时异常不得关闭支付尝试。
FR-018:系统 MUST 将新订单的 OrderResultURL 指向 /pay/omg/result,由后端返回禁止缓存的轻量 HTML。中转页 MUST 从匿名只读地址 /pay/omg/bridge.js 加载后端自托管的 uni.webview.1.5.8.js,在 UniAppJSBridgeReady 后确认处于 uni-app App 环境;iOS App-Plus 环境 MUST 优先让支付子 WebView 的父 uni-app 页面执行 uni.redirectTo,其他 App 环境调用 uni.webView.redirectTo,目标均为 /pages/OrderList/paySuccess/paySuccess?ddId={订单ddId}。Bridge 不可用、环境不是 App 或调用后未发生页面交接时,MUST 回退到 com.twanmsdyh.app://pages/OrderList/paySuccess/paySuccess?ddId={订单ddId},手动按钮也 MUST 保留同一 Scheme 兜底。不得生成 ClientBackURL。OrderResultURL 的全部实际回传字段(包括未知额外字段与空值)必须参加 CheckMacValue 验签;入口仅负责导航,不得直接改变付款状态。App 页面打开后必须调用 /pay/omg/query 确认最终状态。
FR-019:支付结果中转页 MUST 为 Bridge 就绪/环境/跳转、Scheme 兜底、自动唤起、手动点击、页面可见性/焦点变化和 JavaScript 异常输出统一前缀的浏览器诊断日志,并在自动尝试后输出分阶段观察结果;日志载荷 MUST 序列化为 JSON,避免 HBuilderX 只显示 [object Object]。日志只能包含浏览器环境、页面生命周期、固定 App 路由、目标 Scheme 的协议/主机/路径及脱敏订单号,不得包含 token、CheckMacValue、HashKey、HashIV 或 OMG 原始支付表单。App 端必须同步记录生命周期、启动参数、newintent、当前路由和支付 WebView 事件;Bridge 内部路由成功不要求出现 newintent。本期日志仅输出到本地调试控制台,不新增远程上报接口。
MerchantTradeNo(幂等键)、订单、金额、ChoosePayment、ReturnURL/NotifyURL、生成的 CheckMacValue。MerchantTradeNo、关联订单、金额、支付方式、状态(待付/已付/失败/退款)、OMG 交易号、回调原始报文、时间。PayPush 推送链路、用户体系,不为此功能重建。CheckMacValue 算法与 ECPay 同源(业界标准),具体实现留待 plan/research。InvoiceMark=N)。payment-stage.funpoint.com.tw 测试端点与测试凭证,生产环境与凭证后续切换。