如何将 3D Secure 集成到 Payius payment system?
结论
不能仅凭文档中的 https:///merchant/mpi,就认定测试地址是 https://testpayments.payius.com/merchant/mpi。原地址缺少主机名,可能只是占位符或排版错误,也可能需要使用 Payius 为商户分配的环境地址。
/merchant/mpi 通常也不是可以直接在浏览器中打开的普通页面。它往往需要通过 POST 提交交易编号、金额、卡信息或 3DS 上下文。直接访问时,如果缺少必要参数、会话或商户权限,出现错误很正常。
正确的集成思路
如果接口采用传统的 3D Secure 1 流程,大致顺序如下:
- 商户服务端创建支付交易,取得 Payius 返回的交易标识。
- 判断该交易是否需要进行 3DS 验证。
- 将浏览器连同 Payius 要求的字段提交至 MPI 地址。
- 用户在发卡行页面完成身份验证。
- 浏览器返回商户自己的回调地址。
- 商户服务端校验返回结果,再继续授权或确认支付。
- 最终支付状态必须通过 Payius 的服务端查询或通知确认,不能只依据浏览器返回值。
不要把 Referer 请求头当作可靠的回调配置。浏览器、代理和安全策略都可能移除这个请求头,它也无法证明请求来自 Payius。如果旧文档确实依赖 referrer,需要向 Payius 确认商户后台是否还要配置固定的返回地址。
不要直接打开 MPI URL
下面这种访问通常没有意义:
GET https://testpayments.payius.com/merchant/mpi
该接口可能只接受包含完整参数的表单提交,例如:
<form method="post" action="PAYIUS_TEST_MPI_URL">
<input type="hidden" name="transactionId" value="TRANSACTION_ID">
<input type="hidden" name="returnUrl" value="https://merchant.example.com/payius/3ds-return">
<!-- 其他字段必须使用 Payius 文档规定的名称和值 -->
<button type="submit">继续验证</button>
</form>
这里的 PAYIUS_TEST_MPI_URL、transactionId 和 returnUrl 仅用于说明流程,并不代表 Payius 的真实参数名称。不要照着示例自行添加字段,应使用支付初始化响应及 Payius 商户配置中明确提供的地址和参数。
回调端不能只显示 “支付成功”,还要再次向支付平台核实状态:
<?php
$transactionId = $_REQUEST['transactionId'] ?? null;
if ($transactionId === null) {
http_response_code(400);
exit('Missing transaction identifier');
}
// 使用 Payius 提供的服务端查询接口核实:
// 1. 商户号是否匹配
// 2. 金额和币种是否匹配
// 3. 3DS 验证及支付状态是否成功
// 4. 该交易是否已处理,避免重复入账
出错时重点检查
常见原因有:
- 测试商户账户尚未开通 3DS 或 MPI 功能;
- 测试主机名或路径错误;
- 接口要求使用
POST,实际发送的却是GET请求; - 请求中缺少交易标识、签名、金额、币种或返回地址;
- 测试凭据与生产环境地址混用;
- 回调地址不是公网可访问的 HTTPS 地址;
- 回调地址未在 Payius 商户后台登记;
- 请求签名使用的字段顺序、编码或密钥不正确;
- 文档描述的是已经停用的 3DS1 流程,而当前账户要求使用 3DS2。
建议的处理方式
文档中的 URL 并不完整,仅靠这份信息无法可靠完成集成。需要向 Payius 或实际收单机构索取以下内容:
- 当前有效的 sandbox MPI endpoint;
- 账户使用的是 3DS1 还是 3DS2;
- MPI 请求方法和完整字段列表;
- 返回地址的配置方式;
- 测试卡、测试验证码及预期测试场景;
- 服务端支付状态查询接口;
- 具体错误码和错误日志说明。
你对 “需要进入 3DS 流程” 的总体理解没有问题。不过,将缺少主机名的 https:///merchant/mpi 直接补成测试域名,再通过浏览器访问,并不是完整、正确的集成方式。最终地址和请求参数必须以 Payius 为该商户账户提供的环境配置为准。
备注:内容仅供参考。
