You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在2C2P支付网关中处理OTP等身份验证?

2C2P支付网关OTP验证处理方案

场景说明

你当前的代码已识别出支付待完成状态(响应码PC-B050000/PC-B050001/PC-B050002),且检测到需要3DS验证(transStatus = C),接下来需按以下步骤处理OTP验证流程:

核心字段解析

响应中aresACSChallenge节点包含验证所需的关键信息:

  • ChallengeHtml:Base64编码的完整验证页面HTML,解码后可直接渲染给用户,包含银行的OTP输入表单与自动提交逻辑
  • acsURL:银行的3DS验证页面地址,若不使用现成的ChallengeHtml,可自行构造表单提交到该地址
  • CReq:验证请求参数,需随表单提交给银行
  • threeDSSessionData:会话标识,用于后续查询验证状态

具体处理步骤

1. 前端渲染验证界面

在你的代码逻辑中,将ChallengeHtml解码后输出到前端,让用户完成OTP输入:

if (isset($result->response->Data->paymentIncompleteResult->aresACSChallenge->transStatus) && 'C' === $result->response->Data->paymentIncompleteResult->aresACSChallenge->transStatus) {
    // 解码Base64格式的验证页面HTML
    $challengeHtml = base64_decode($result->response->Data->paymentIncompleteResult->aresACSChallenge->ChallengeHtml);
    // 直接输出HTML到前端,或传递给视图层渲染
    echo $challengeHtml;
    exit;
}

这段代码会直接展示银行的验证界面,用户输入OTP提交后,银行会自动回调你配置的通知地址。

2. 处理验证结果回调

银行验证完成后,会向你预先配置的通知URL发送回调请求,你需要在回调接口中:

  • 解析回调参数,获取验证结果
  • 调用2C2P的订单查询接口,确认最终支付状态
  • 更新本地订单的支付状态(成功/失败)

示例回调处理伪代码:

public function handle_payment_notification() {
    $notificationData = $_POST;
    // 验证回调签名(参考2C2P官方文档)
    if ($this->verify_notification_signature($notificationData)) {
        $orderNo = $notificationData['orderNo'];
        // 调用2C2P查询接口获取最终状态
        $paymentStatus = $this->request->query_order_status($orderNo);
        if ($paymentStatus === 'SUCCESS') {
            // 更新订单为支付成功
            $this->update_order_status($orderNo, 'completed');
        } else {
            // 更新订单为支付失败或待处理
            $this->update_order_status($orderNo, 'failed');
        }
    }
}

3. 超时与状态查询兜底

若用户未完成验证或回调未触发,需在订单生命周期内定时调用2C2P的订单查询接口,获取最新状态,避免订单状态不一致。

响应示例关键信息翻译

[05-Apr-2024 09:03:58 UTC] stdClass Object
(
    [response] => stdClass Object
        (
            [Data] => stdClass Object
                (
                    [paymentIncompleteResult] => stdClass Object
                        (
                            [aresACSChallenge] => stdClass Object
                                (
                                    [transStatus] => C // 需要进行OTP验证
                                    [acsURL] => 银行3DS验证页面地址
                                    [ChallengeHtml] => Base64编码的验证页面HTML
                                    [threeDSSessionData] => 3DS会话标识
                                )
                            [paymentExpiryDateTime] => 2024-04-05T09:48:40.0051453Z // 支付过期时间
                            [orderNo] => 297 // 本地订单号
                            [paymentStatusInfo] => stdClass Object
                                (
                                    [PaymentStatus] => I // 支付中状态
                                    [PaymentStep] => AC // 当前处于验证步骤
                                )
                        )
                    [ApiResponse] => stdClass Object
                        (
                            [ResponseCode] => PC-B050001 // 支付待完成状态码
                            [MarketingDescription] => 支付成功但未完成,请通过所选支付渠道完成后续操作。
                        )
                )
        )
)

内容的提问来源于stack exchange,提问作者Sanzeeb Aryal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:54:58