3DS 认证
3DS 认证
3D Secure 2 是一种身份验证协议,可为无卡 (CNP) 交易提供额外的验证。 我们建议您使用 3D Secure 2 在线上交易中进行消费者身份验证,并利用责任转移降低风险。
TIP
EVO Payment 支持您在授权(Payment)或者绑卡(PaymentMethod)流程中加入 3DS 认证。同时 EVO Payment 也支持您在已经获取到一笔交易的 3DS 认证结果后,仅通过 EVO Payment 发起授权。同时 EVO Payment 还支持您仅通过 EVO Payment 进行 3DS 认证获取 3DS 认证结果而不发起授权。
3DS 模式
符合 3D Secure 2 的交易可以触发平滑认证流程或需要进行额外的挑战认证流程,具体是否需要额外的挑战流程取决于发卡行的要求。
3DS 平滑模式
在平滑模式流程中,收单机构、发卡行和卡组织通过收集消费者的设备指纹信息进行交易风险判断,如果验证通过,则无需进一步与消费者交互。
3DS 挑战模式
如果在平滑模式认证流程中发卡行认为交易存在风险,发卡行会触发额外的认证流程,用户会被重定向到发卡行的页面进行额外的身份认证。发卡行可能通过生物识别、双因素身份验证、短信验证码或密码等对消费者的身份进行进一步的验证。
3DS 集成说明
EVO Payment 提供两种 3DS 集成模式供您选择,您可以根据自身需求选择合适您的方式集成 3DS 功能,下面为您介绍两种集成方式的区别,以及各自的集成流程。
| 集成模式 | authentication.authenticationType | 优缺点 |
|---|---|---|
| Redirect for 3D Secure 2 | threeDSPage | 优点:集成过程简单 缺点:跳转次数多用户体验一般 |
| Native for 3D Secure 2 | threeDS | 优点:用户体验好,平滑模式下用户无感 缺点:集成过程复杂 |
Redirect for 3D Secure 2 集成流程
在您调用 POST Payment 接口或 POST PaymentMethod 接口时均可以添加额外的参数在原始流程中触发 3DS 认证流程。
主要流程如下:
在调用
Payment接口或PaymentMethod接口时额外添加以下参数,字段详情参考 API 文档:authentication.authenticationOnly:用来表明是否仅进行 3DS 认证,当前场景默认填false,如果填trueEVO Payment 将只会进行 3DS 认证,不会发起后续的授权,并将 3DS 结果返回给您(本字段仅适用于Payment接口)。authentication.authenticationMethod:表明方式方式的字段,固定值CILAuth。authentication.authenticationType:表明认证模式的字段,固定值threeDSPage。authentication.returnUrl:认证结束后回调地址,根据您的业务需求设定。authentication.threeDS.deviceType:表明消费者设备类型的字段。
检查 EVO Payment 应答中的
payment.status或paymentMethod.status字段内容。如果字段的值为Verifying则表示交易创建成功,等待对消费者进行 3DS 认证。然后您需要查看result.action字段内容,然后根据result.action字段进行后续处理。TIP
result.action的处理说明:result.action 解释 RedirectShopper需要商户将前端页面重定向至 authentication.threeDS.redirectUrl字段返回的地址通常在 Redirect for 3D Secure 2 集成流程中,您收到的
result.action字段内容将会是RedirectShopper。此时您需要使用GET的方式将您的消费者重定向到authentication.threeDS.redirectUrl字段返回的地址。
Note
此时消费者将被重定向到 EVO Payment 的 3DS 认证页面,然后 EVO Payment 将与消费者和发卡行共同完成 3DS 认证的全部流程,在流程结束后 EVO Payment 将会把消费者重定向到 authentication.returnUrl。
消费者将在 10 分钟内被 EVO Payment 通过
GET的方式重定向到您的authentication.returnUrl,同时 EVO Payment 将会在您的重定向地址后以参数的形式添加以下两个字段。merchantTransID可以用来匹配您的初始请求status可以用来判断 3DS 流程是否结束
INFO
回调请求样例:
https://www.yourwebsite.com?merchantTransID=T12345678&status=finished如果
status的值为finished,需要您调用GET Payment或GET PaymentMethod来查询交易结果。如果 10 分钟内没有收到回调请求,或者
status的值不是finished,您可以认为 3DS 认证失败,您调同样可以调用GET Payment或GET PaymentMethod接口来查询失败详情。CAUTION
回调地址中的
status=finished不能表示最终的交易结果,status的作用仅供您处理前端流程时使用,最终的交易状态需要您通过查询或者异步通知获取。
Native for 3D Secure 2 集成流程
在您调用 POST Payment 接口或 POST PaymentMethod 接口时均可以添加额外的参数在原始流程中触发 3DS 认证流程。
主要流程如下:
收集消费者浏览器信息,并将其放入
browserInfo结构体,您需要收集的浏览器信息如下,字段详情参考 API 文档:acceptHeadercolorDepthjavaEnabledjavaScriptEnabledlanguagescreenHeightscreenWidthtimeZoneOffsetuserAgent
在调用
POST Payment接口或POST PaymentMethod接口时额外添加以下参数,字段详情参考 API 文档:authentication.authenticationOnly:用来表明是否仅进行 3DS 认证,当前场景默认填false,如果填trueEVO Payment 将只会进行 3DS 认证,不会发起后续的授权,并将 3DS 结果返回给您(本字段仅适用于Payment接口)。authentication.authenticationMethod:表明方式方式的字段,固定值CILAuth。authentication.authenticationType:表明认证模式的字段,固定值threeDS。authentication.returnUrl:接收发卡行返回的认证结果。authentication.threeDS.deviceType:表明消费者设备类型的字段。browserInfo:您在第一步中收集到的消费者浏览器信息。
检查 EVO Payment 应答中的
payment.status或paymentMethod.status字段内容。如果字段的值为Verifying则表示交易创建成功,等待对消费者进行 3DS 认证。然后您需要查看result.action字段内容,然后根据result.action字段进行后续处理。TIP
result.action的处理说明:result.action 解释 IdentifyShopper需要商户将前端页面重定向至 authentication.threeDS.redirectUrl字段返回的地址ChallengeShopper需要商户在前端页面通过 POST 的方式,将 authentication.threeDS.redirectData.creq参数发送至authentication.threeDS.redirectUrl字段返回的地址如果您收到的
result.action字段内容是IdentifyShopper,此时您需要执行 3D Secure 2 设备指纹识别。TIP
在这一步中如果您收到的
result.action字段内容是ChallengeShopper,请直接跳到第 5 步。a. 在 iframe 中发起用户浏览器指纹信息验证
在消费者的浏览器中渲染一个隐藏的 iframe,然后在 iframe 中使用
POST的方式访问authentication.threeDS.redirectUrl,同时在请求参数中添加authentication.threeDS.redirectData.threeDSMethodData。CAUTION
请保持 POST 请求中字段名称的字母大小写与 EVO Payment 响应返回的
authentication.threeDS.redirectData结构体中的参数名称一致。样例: 商户通过 form POST 向
authentication.threeDS.redirectUrl发送的threeDSMethodDataHTML<form method="POST" action="{authentication.threeDS.redirectUrl}" id="IdentifyShopper" target="NAME_OF_YOUR_IFRAME"> <input type="hidden" name="threeDSMethodData" value="eyJ0aHJlZURTTWV0aG9kTm90aWZpY2F0aW9uVVJMIjoiaHR0cHM6Ly9ZT1VSX0NPTVBBTlkuY29tL1JFVFVSTlVSTCIsInRocmVlRFNTZXJ2ZXJUcmFuc0lEIjoiN2MzOWJkOTYtOThlZS00N2IwLTgzYWYtNjMwNjE2NmE3MDE4In0=" /> </form>b. 等待指纹验证结果返回到
authentication.returnUrl发卡行将在从发起设备指纹验证请求起的 10 秒种内响应,您可以在
authentication.returnUrl中添加merchantTransID来匹配原始请求,然后将在后续的 PUT 请求中将threeDSComplnd设置为Y,然后进行后续处理。TIP
如果您在之前的 POST 请求中的
authentication.returnUrl中未指定merchantTransID,那么您也可以对 base64 编码的threeDSMethodData进行解码,获取并存储threeDSServerTransID以用于对发卡行应答的匹配。因为发卡行会在应答中添加threeDSMethodData,其中threeDSServerTransID与请求时一致。如果发卡行在 10 秒内没有得到任何响应,则可以将
threeDSComplnd设置为N,然后准备进行后续处理。样例: 发卡行向
authentication.returnUrl发送的threeDSMethodDataHTML<form method="POST" action="{authentication.returnUrl}" id="IdentifyShopper" target="NAME_OF_YOUR_IFRAME"> <input type="hidden" name="threeDSMethodData" value="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjdjMzliZDk2LTk4ZWUtNDdiMC04M2FmLTYzMDYxNjZhNzAxOCJ9" /> </form>c. 将指纹验证结果发送给 EVO Payment
您需要调用
PUT Payment接口或PUT PaymentMethod接口,然后在接口中添加以下字段authentication.threeDS.redirectData.threeDSComplnd:指纹验证的结果标识。
d. 处理 EVO Payment 返回的结果
如果在 EVO Payment 的应答中没有出现
result.action字段,那么需要您根据payment.status或paymentMethod.status字段的值来判断最终的交易结果。否则您将需要继续执行result.action中的内容来继续完成 3DS 认证。如果您收到的
result.action字段内容是ChallengeShopper,此时您需要将消费者重定向到发卡行的页面进行进一步的身份验证 。a. 在 iframe 中发起 CReq(ChallengeRequest)验证
在消费者的浏览器中渲染一个隐藏的 iframe,然后在 iframe 中使用
POST的方式访问authentication.threeDS.redirectUrl,同时在请求参数中添加authentication.threeDS.redirectData.creq。样例: 商户通过 form POST 向
authentication.threeDS.redirectUrl发送的 CReq 请求HTML<form method="POST" action="{authentication.threeDS.redirectUrl}" id="ChallengeShopper" target="NAME_OF_YOUR_IFRAME"> <input name="creq" value="eyJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiI3YzM5YmQ5Ni05OGVlLTQ3YjAtODNhZi02MzA2MTY2YTcwMTgiLCJhY3nUcmFuc0lEIjoiMTE4ZDNiNjEtYjU5Ny00Nzg2LTg1ZWMtNzA0Mzc3ZDhjMWU4IiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0=" /> </form>CAUTION
请保持 POST 请求中字段名称的字母大小写与 EVO Payment 响应返回的
authentication.threeDS.redirectData结构体中的参数名称一致。您也可以在 CReq 请求中添加
threeDSSessionData字段,如果您上送了本字段,发卡行在 Cres 中将原样返回。字段名称 长度/格式 threeDSSessionData 长度:最大 1024 字节
格式:字母数字 Base64url 编码。
b. 等待 Cres 验证结果返回到
authentication.returnUrl发卡行将在从发起 Creq 验证请求起的 10 分钟内响应,您可以使用您设置在
authentication.returnUrl中的merchantTransID来匹配原始请求,然后将threeDSFinished设置为Y,同时记录响应中的cres字段的值,然后准备进行后续处理。TIP
如果您在之前的 POST 请求中的
authentication.returnUrl中未指定merchantTransID,您也可以在 Creq 请求中添加threeDSSessionData用于对 Cres 应答的比配如果发卡行在 10 分钟内没有得到任何响应,或者在响应中没有找到
cres字段,则可以将threeDSFinished设置为N,然后准备进行后续处理。c. 将 Cres 验证结果发送给 EVO Payment
您需要调用
PUT Payment接口或PUT PaymentMethod接口,然后在接口中添加以下字段authentication.threeDS.redirectData.threeDSFinished:Cres 验证的结果标识。authentication.threeDS.redirectData.cres:Cres 验证的结果参数。
d. 处理 EVO Payment 返回的结果
如果在 EVO Payment 的应答中没有出现
result.action字段,那么需要您根据payment.status或paymentMethod.status字段的值来判断最终的交易结果。否则您将需要继续执行result.action中的内容来继续完成 3DS 认证。如果您没有收到来自 EVO Payment 的应答报文,则需要您调用
GET Payment或GET PaymentMethod来查询交易结果。当收到查询应答时,您同样也需要通过payment.status或paymentMethod.status字段内容来判断交易结果。如果交易失败,您需要通过payment.failureCode以及payment.failureReason来查看交易失败原因。
自有 3DS 结果进行支付
EVO Payment 支持您在已经获取到一笔交易的 3DS 认证结果后,仅通过 EVO Payment 发起授权。您可以在普通的授权交易中使用该功能,在 POST Payment 请求中额外添加以下参数:
authentication.authenticationOnly:固定值false。authentication.authenticationMethod:固定值SelfAuth。authentication.threeDS.mpiData:包含了 3DS 结果的结构体。
后续流程与普通的授权一致,详情参考授权章节。
仅进行 3DS 认证
EVO Payment 支持您仅通过 EVO Payment 进行 3DS 认证获取 3DS 认证结果而不发起授权。
主要流程如下:
您需要在一笔普通的授权请求(
POST Payment)中请求中额外添加以下参数:authentication.authenticationOnly:固定值true。authentication.authenticationMethod:固定值CILAuth。authentication:包含 3DS 认证相关信息的结构体,详情参考 3DS 章节。
检查 EVO Payment 的应答,如果应答中存在
result.action字段,则表示该笔交易需要继续进行 3DS 认证(请参考 3DS 章节)。如果应答中不存在
result.action字段,则需要根据payment.status字段内容判断 3DS 认证是否结束。如果字段的值为Verified则表示 3DS 验证结束,同时您可以从应答中的authentication.threeDS.mpiData结构体中找到 3DS 认证结果信息,否则就需要查看result.code以及result.message来查看交易失败原因。下面 3DS 结果列表,展示了 3DS 认证完成后有关 3DS 结果的详细信息:
| Card Scheme | ECI | Authentication status | Description |
|---|---|---|---|
| Mastercard | 02 | Y | 3DS 认证通过 |
| 01 | A | 已尝试认证。没有通过身份认证,但提供了尝试身份认证的证明。 | |
| 00 | N / U / R / C | N:未认证/帐户认证失败。交易应当被拒绝。 U:无法进行身份认证/帐户认证。技术或其他问题导致。 R:身份认证/帐户认证被拒绝。 发卡行拒绝身份认证,交易应当被拒绝。 C:需要挑战。如果您在上送 CRes 后收到此状态,则表示身份认证被拒绝。 | |
| Visa, JCB, AMEX, Diners/Discover, UPI | 05 | Y | 3DS 认证通过 |
| 06 | A | 已尝试认证。没有通过身份认证,但提供了尝试身份认证的证明。 | |
| 07 | N / U / R / C | N:未认证/帐户认证失败。交易应当被拒绝。 U:无法进行身份认证/帐户认证。技术或其他问题导致。 R:身份认证/帐户认证被拒绝。 发卡行拒绝身份认证,交易应当被拒绝。 C:需要挑战。如果您在上送 CRes 后收到此状态,则表示身份认证被拒绝。 |
如果您没有收到来自 EVO Payment 的应答报文,则需要您调用
GET Payment来查询 3DS 认证是否结束。当收到查询应答时,您同样也需要通过payment.status字段内容来判断 3DS 认证是否结束,判断方式与第 2 步一致。如果 3DS 认证终止,您需要通过payment.failureCode以及payment.failureReason来查看 3DS 认证终止原因。如果您在
POST Payment请求中上送了webhook并且交易的payment.status为Verified,您也可以通过异步通知来获取 3DS 认证结果,异步通知中的eventCode为Payment。同样也需要通过payment.status字段内容来判断 3DS 认证是否结束,判断方式与第 2 步一致。

