如何在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
相关产品推荐
相关产品推荐

