如何在已实现的Cybersource Silent Order API中添加3D Secure功能?
我之前也踩过这个坑——Cybersource官方文档确实把3D Secure的大部分说明都放在了Simple Order API里,对Silent Order API的支持描述得非常零散,甚至有些地方直接没提。不过好在我折腾出来一套可行的方案,亲测在测试环境能正常跑,分享给你:
先确认账户权限
别上来就改代码!先联系Cybersource的商户支持团队,确认你的账户已经开通了Silent Order API的3D Secure功能。默认情况下这个权限是不开启的,很多人卡在这里都没意识到。修改请求参数,加入3D Secure字段
在你现有的Silent Order API请求体里,给paymentInformation节点添加threeDSecure子节点,关键参数如下:"paymentInformation": { "card": { // 你原本的卡信息字段 }, "threeDSecure": { "authenticationIndicator": "01", // 01=需要身份验证,02=尝试验证但不强制,按需选择 "challengeIndicator": "01" // 01=偏好触发挑战,02=无偏好,03=禁止挑战 } }另外一定要确保请求里包含完整的持卡人账单地址(姓名、地址、邮编、电话这些),3D Secure的风险评估依赖这些数据,缺了可能会导致验证失败。
处理3D Secure验证跳转
如果Cybersource判定需要3D Secure验证,返回的响应里会多出threeDSecure节点,包含acsUrl、pareq、md这三个核心参数。你需要把这些参数组装成一个自动提交的HTML表单,引导用户跳转到银行的验证页面:<form id="3ds-form" method="POST" action="【这里填acsUrl的值】"> <input type="hidden" name="PaReq" value="【这里填pareq的值】"> <input type="hidden" name="MD" value="【这里填md的值】"> <input type="hidden" name="TermUrl" value="【你的回调URL,提前在商户后台配置好】"> </form> <script>document.getElementById('3ds-form').submit();</script>验证结果并完成订单
用户完成3D Secure验证后,银行的ACS会把结果回调到你配置的TermUrl,回调参数里包含PaRes和MD。你需要拿着这两个参数,加上原订单的标识,再次调用Silent Order API的验证接口(具体端点可以咨询Cybersource支持,一般是/pts/v2/payments/validate-three-d-secure),确认验证通过后再继续完成后续的支付流程。
测试小技巧:用Cybersource提供的测试卡(比如4000000000000002)可以模拟不同的3D Secure场景,比如无需挑战、需要密码验证等,方便你测试各种分支流程。
内容的提问来源于stack exchange,提问作者Mark Waugh

