Onerway
线上支付

API 直连接入

服务端直接调用创建直连交易接口提交卡信息或 token,自行处理 3DS 跳转,并通过 Webhook 确认支付、绑卡、订阅与预授权结果。

直连 API(Direct API)接入由商户自建支付页面并在服务端直接调用创建直连交易:卡信息或 token 由商户服务端提交,3DS 跳转由商户处理,最终结果通过 Webhook 确认。与收银台和 Web SDK 不同,卡数据会经过商户系统,因此本接入方式有 PCI DSS 合规门槛;换来的是完全自定义的支付体验,以及绑卡、token 支付、订阅续费和预授权等服务端场景的直接控制。Apple Pay、Google Pay 与本地支付方式在直连下的接入准备与专属流程见支付方式。

前提

开始前,先按接入准备获取 API 凭证,并将服务端的公网出口 IP 加入对应环境的白名单。每个请求都需按请求签名生成 sign。上线前,参考沙盒测试在沙盒环境验证集成中使用的全部场景。

API 直连接入另有 PCI DSS 合规门槛:在自建页面收集卡号、有效期和 CVC 并提交到 Onerway,商户必须持有有效的 PCI DSS 认证,通过 TLS 安全传输持卡人数据,不得存储 CVC 等敏感认证数据。不具备资质的商户请改用收银台接入或 Web SDK 接入,卡数据不会经过商户服务器。订阅续费和预授权请款不提交卡数据,不受此限制;卡 token 支付仍须提交 cardInfo.cvv,同样在 PCI DSS 范围内。

接入流程

在服务端创建交易

调用创建直连交易。交易模型由字段 productType、字段 subProductType 与字段 txnType 共同决定;商户自行采集卡信息的卡支付传 productType=CARD、subProductType=DIRECT、txnType=SALE,并在字段 cardInfo 中提交卡信息。

字段 txnOrderMsg 必须包含 returnUrl(3DS 等跳转流程的同步回跳地址)与 notifyUrl(Webhook 通知地址)。与收银台不同,直连接入由商户自行采集浏览器、设备与持卡人 IP 信息(如 transactionIp)并传入 txnOrderMsg;各子字段的必填条件见字段 txnOrderMsg 的字段树。

按响应状态处理跳转

Onerway 判定是否需要 3DS 认证,同步响应的字段 status 可能直接是终态:

响应处理
status=S支付成功,等待 Webhook 后完成订单。
status=R 且 actionType=RedirectURL将客户浏览器重定向到字段 redirectUrl 完成 3DS 认证或本地支付方式页面。
其他取值按 status 与 respCode 处理失败或处理中状态,完整取值见 API Reference。

原生 App 可在 WebView 中加载 redirectUrl,监听导航到 returnUrl 后关闭 WebView,再由服务端查询结果。

承接同步回跳

客户完成认证后经 returnUrl 返回商户页面。回跳只用于页面流转,不保证附带交易参数:建议在 returnUrl 上拼接商户订单号,客户返回时向其展示“处理中”,并由服务端通过查询交易记录核实,不要以回跳 URL 上的任何参数作为订单处理依据。

以 Webhook 确认结果

Onerway 将最终结果 POST 到 notifyUrl。确认支付结果一节说明验签、应答、重试与幂等处理。

绑卡与 token 支付

直连接入的保存支付方式(绑卡)流程是:服务端提交卡信息生成 token,随后用 tokenId 发起 token 支付,并按需查询或删除已保存记录。客户自选保存与服务端绑卡的选择、三类 token 的区分见保存支付方式。

  1. 生成卡 token:调用生成卡 token,提交卡信息与稳定的字段 merchantCustId,同时传入 notifyUrl 与 returnUrl。响应字段 status =R 时,将持卡人重定向到 redirectUrl 完成 3DS 认证。
  2. 确认保存结果:以保存支付方式结果通知(txnType=BIND_CARD)为最终依据,仅当 status=S 时保存 tokenId;回跳到 returnUrl 与同步响应都不代表绑卡成功。也可调用查询已保存 token核对。
  3. 发起 token 支付:调用创建直连交易,传入 subProductType=TOKEN 与字段 tokenInfo(tokenId 为已保存的卡 token,provider 不传),并在 cardInfo.cvv 提交客户本次输入的 CVC,同时传入绑卡时使用的 merchantCustId。token 支付同样可能返回 status=R 要求 3DS 认证,处理方式与接入流程一致。
  4. 管理已保存 token:查询已保存 token返回每条绑定记录的 id 与 tokenId;客户要求删除卡时调用删除卡 token,入参是绑定记录的 id,不是 tokenId。

API 直连接入需额外注意:生成卡 token 与 token 支付都经手卡数据(token 支付须提交 cardInfo.cvv),两步都要求 PCI DSS。不具备资质的商户应让保存卡与复购都在收银台或 Web SDK 页面上完成。

订阅

托管订阅与自主管理订阅的选择、合约凭证与生命周期通知见订阅支付。本节说明选定方案后在直连侧如何调用。三类请求都使用创建直连交易,传入 subProductType=SUBSCRIBE 与字段 subscription,并以字段 subscription.requestType 区分:

requestType用途关键输入
0初始订阅,建立合约cardInfo 或 tokenInfo、merchantCustId、selfExecute、计费周期与期数
1自主管理订阅的本期扣款contractId、tokenId、merchantCustId、本期金额
2托管订阅升级或降级contractId、tokenId、changeMode、prorationMode

初始订阅成功后,保存订阅扣款通知中的 contractId 与 tokenId。初始订阅也可以在收银台或 Web SDK 完成,后续扣款与更新仍走直连接口。

自主管理订阅续费(requestType=1)传入 contractId、tokenId、merchantCustId 与本期金额,不传卡信息,因此续费环节没有 PCI DSS 要求。

托管订阅升降级(requestType=2)使用已存储的 contractId 与 tokenId 发起,生效时机由字段 subscription.changeMode 决定,差价由 prorationMode 决定按剩余天数自动计算还是由商户通过 proration 提交。

API 直连接入需额外注意:托管卡订阅同时传入 subscription.bindCard=true 时,会收到保存支付方式结果通知与订阅扣款通知两条 transactionId 不同的通知,应各自幂等处理。

预授权

预授权先冻结持卡人卡上的订单金额、暂不扣款。直连侧的 txnType=AUTH 适用于自行采集卡信息的卡支付和 token 支付(subProductType=DIRECT 或 TOKEN),不适用于本地支付方式、订阅或分期。

调用创建直连交易并传入 txnType=AUTH,其余参数与自行采集卡信息的卡支付或 token 支付相同;需要 3DS 时同样按 status=R 处理跳转。保存响应中的 transactionId 与 paymentId,后续请款或撤销调用预授权请款或撤销。

授权到请款或撤销的生命周期、通知、边界与状态判断见预授权与请款。

本地支付

本地支付方式与卡支付共用创建直连交易接口,差别只在参数组合与流程形态:传入 productType=LPMS 与字段 lpmsInfo(lpmsType 指定支付方式,其余子字段按方式条件必填),subProductType 一次性扣款传 DIRECT、订阅传 SUBSCRIBE;本地支付方式不支持 txnType=AUTH。方式清单与可用性查询、跳转与延迟到账的处理、方式专属参数与订阅形态见本地支付方式。

API 直连接入需额外注意:productType=ALL 属于收银台的聚合展示概念,直连接口不支持,商户需自建支付方式列表,并自行处理 status=R 下的客户侧动作与回跳承接。

分账

分账是平台模式下的能力:平台商户以收款子商户的 merchantNo 创建支付,并传入字段 paymentMethodOptions 在其中的 share 设置 profitShare=true,该笔支付才可参与分账;其余参数与普通交易相同。同时设置 profitShareRate 时,SALE 或 CAPTURE 成功后由 Onerway 自动分账;不设置时由服务端通过 API 发起分账。需要接收自动分账及自动分账回退通知时,同时设置 profitShareNotifyUrl。paymentMethodOptions 按接口要求以 JSON 字符串提交。

自动分账与通过 API 发起分账的选择、结果通知、查询与分账回退见分账。

确认支付结果

API 直连接入的最终结果以 Webhook 为准,按场景分别见支付结果通知、保存支付方式结果通知、订阅扣款通知与预授权、请款与撤销通知。验签、应答与重试、幂等去重、状态判断与查询补偿的通用规则见 Webhook 通知。

API 直连接入需额外注意:本接入方式同时使用四类通知,Webhook 端点必须能接收所用场景涉及的全部通知类型;绑卡、订阅并绑卡、预授权及后续请款或撤销会产生多笔 transactionId 各不相同的关联通知,用 paymentId、contractId 关联。同步响应可能直接返回终态 status=S,仍应等待 Webhook 后再完成订单;客户已回跳但未收到 Webhook 时,用查询交易记录补偿。

上线前检查

  • 持有有效的 PCI DSS 认证,支付页面通过 TLS 传输且不存储 CVC。
  • 已处理 status=R 跳转与 returnUrl 回跳,回跳后由服务端查询而非信任 URL 参数。
  • Webhook 端点已按 Webhook 通知完成上线前检查,且能接收绑卡、订阅、预授权等所用场景的全部通知类型。
  • 已保存的 tokenId、contractId 与 paymentId 以字符串存储并与客户或订单关联。
  • 沙盒验证已覆盖 3DS Challenge、3DS Frictionless 以及所用的绑卡、订阅、预授权与本地支付场景。