# OMG 支付 iOS WebView 返回 App 交接设计 ## 最终决策(2026-08-17) 本方案只约定后端结果页与用户端 App 支付页之间的交接方式。支付状态查询、轮询、提示文案和最终业务页面跳转由前端继续实现,不属于本次后端修改范围。 - 用户端实际支付页是 `pages/OrderList/buy/omgCheckout`。 - 该页面通过 renderjs 创建并提交 HTML Form,OMG 收银台会加载到当前页面 WebView,而不是 `` 子组件。 - iOS 主返回流程由 `omgCheckout` 获取当前页面 `WebviewObject`,监听原生 `loaded` 事件并读取当前 URL。 - 当前 URL 精确进入 `https://foodieapi.waimai-paotui.com/pay/omg/result` 时,视为收到 `OMG_RETURNED` 交接信号。 - `/pay/omg/result` 继续返回 HTML 页面。现有提示内容、“返回 App”按钮和 App Scheme 可以保留,作为外部浏览器、Android 或监听失效时的兼容兜底。 - iOS 主流程不依赖返回页中的 `uni.webView.redirectTo`、`uni.postMessage`、`plus.webview.currentWebview`、`parent.evalJS` 或 App Scheme。 - 返回页到达只表示浏览器流程已经返回,不表示支付成功。前端不得仅凭该信号展示支付成功。 - `omgCheckout` 是 OMG 专用页面,不需要额外增加 `payChannel=omg`。 后续如与 2026-08-14 的旧示例或旧描述存在差异,以本节和本文当前内容为准。 ## 1. 问题与根因 OMG 信用卡付款完成后,iOS 会停留在后端返回的“正在返回 App”页面,自动返回和手动按钮都可能没有效果。 真机日志已经确认: ```text [OMG-RETURN] ios_parent_redirect_exception ReferenceError: Can't find variable: sync [OMG-RETURN] bridge_redirect_exception ReferenceError: Can't find variable: sync ``` 同一个 App Scheme 可以从 iOS 外部浏览器打开 App,说明 Scheme 注册和目标路由有效。失败边界位于 App 内 OMG WKWebView 的 Bridge 或同 App Scheme 交接。 因此,iOS 主流程不能继续依赖远程结果页主动控制 App 路由。可靠的交接点是 App 原生 WebView 自身的 `loaded` 事件。 ## 2. 实际页面结构 `pages/OrderList/buy/omgCheckout` 不是承载 `` 子组件的普通宿主页。它在 renderjs 中执行: ```text 接收 omgCheckoutPayload ↓ 创建 HTML Form ↓ POST 到 payload.gatewayUrl ↓ 当前页面 WebView 被 OMG 收银台内容替换 ``` 所以前端需要监听: ```js this.$scope.$getAppWebview() ``` 而不是: ```js this.$scope.$getAppWebview().children()[0] ``` renderjs 只负责提交 OMG Form。URL 监听和 App 路由接管必须放在普通 `