3DS 支付验证
3DS 支付验证 (3DS) 旨在通过允许您在提交 AUTHORIZE 或 PAY 交易之前对付款人进行身份验证来保护在线购物,防范信用卡欺诈。 网关的 3DS 功能和 <<mobileSDK>> 内的身份验证仅限于 3DS2。 如果 3DS 不可用,则身份验证无法继续。 但是,如果网关建议您继续处理付款,您仍然可以继续。 有关网关 3DS 功能的详细信息,请参见 3DS 支付验证。
- 要对付款人进行身份验证:
- 使用您的服务器来更新会话中的所有相关详细信息,这些信息可以帮助身份验证更顺利地进行。
- 要求 SDK 执行身份验证。
- 解释 SDK 返回的结果。
更新会话中的身份验证详细信息
当您执行 <<mobileSDK>> 身份验证(在移动应用中验证持卡人的身份)时,<<mobileSDK>> 会收集设备指标来将其与您的交易信息一起发送到网关。
请尽可能多地提供有关付款人和交易的信息,以提高身份验证成功的可能性。 您可以使用 UPDATE SESSION 请求将下表中的字段添加到您的会话中。
可选 UPDATE SESSION 字段
字段 | 说明 |
---|---|
order.merchantCategoryCode | 商家类别代码。 仅当此值与您的商家配置文件中为收单行链接定义的代码不同时,才需要此值。 |
billing.address 对象 | 付款人的账单地址。 强烈建议您尽可能将其包含在您的请求中。 |
shipping.address 对象 | 此订单的发货地址。 强烈建议您尽可能将其包含在您的请求中。 |
customer 对象 | 与付款人账户相关的信息。 强烈建议您尽可能将其包含在您的请求中。 |
device
对象仅与基于浏览器的付款相关。 请勿将其用于基于移动的付款人身份验证。上述字段帮助系统确定如何或是否对持卡人进行身份验证。 在身份验证期间,用户将经历以下身份验证流之一:
- 无障碍流:
访问控制服务器 (ACS) 已收集了足够的有关持卡人的信息来对其进行身份验证。 用户无需执行其他操作。
- 质询流:
ACS 要求持卡人完成额外的身份验证步骤,即输入一次性密码、登录发卡银行,或类似操作。 嵌入的 <<mobileSDK>> 对为此质询显示本地设备界面的过程进行处理。 可以通过在初始化期间将 UI 自定义字段传递到 <<mobileSDK>> 来自定义这些屏幕的 UI。
有关详细信息,请参阅 3DS 身份验证流。
执行身份验证
付款人身份验证在网关中被视为一项特有交易,因此需要一个唯一的交易 ID。
如果您正在收取订单付款:
- 您可以通过对每笔交易使用相同的订单 ID(例如,UUID)来关联付款和身份验证交易。
- 每笔交易在 <<merchantUI>> 中会显示为单独的交易。
要在 SDK 中开始身份验证流程,调用 authenticate() 函数。
iOS 示例代码
let request = AuthenticationRequest (navController: navController, apiVersion: apiVersion, sessionId: sessionId, orderId: orderId, transactionId: authenticationTxnId) AuthenticationHandler.shared.authenticate(request) { (response) in // handle response }
authenticationTxnId
是此交易的唯一 ID,用于与同一订单中的任何其他交易进行区分。 当您发送实际的付款交易请求(如 PAY)时,网关会在您要求 SDK 对付款人进行身份验证时使用此 ID 查找存储的身份验证结果。 然后网关将身份验证结果随付款交易请求一起传递给收单行。Android 示例代码
AuthenticationHandler.authenticate(activityContext, session, "your-auth- transaction-id", callback)
your-auth-transaction-id
是此交易的唯一 ID,用于与同一订单中的任何其他交易进行区分。 当您发送实际的付款交易请求(如 PAY)时,网关会在您要求 SDK 对付款人进行身份验证时使用此 ID 查找存储的身份验证结果。 然后网关将身份验证结果随付款交易请求一起传递给收单行。解释响应
authenticate
函数返回一个 AuthenticationResponse
对象,其中包含:
- 关于结果的重要信息
- 操作期间执行的操作。
要检查的最重要的字段是 response.recommendation
。 它可以包含以下值:
- PROCEED: 您可以继续付款或授权。
- DO_NOT_PROCEED: 身份验证操作期间出现问题。 使用
AuthenticationError
对象来了解更多信息。
在 Gateway API 版本 70 及更高版本中,您可能会收到以下错误:
AuthenticationError.recommendation_ResubmitWithAlternativePaymentDetails
: 您必须向付款人询问备用付款详细信息(例如,新卡或另一个付款方式),然后使用新详细信息重新提交请求。AuthenticationError.recommendation_AbandonOrder
: 支付服务提供商 (PSP)、组织或发卡机构要求您放弃订单。AuthenticationError.recommendation_DoNotProceed
: 网关未能成功处理该请求,因此该交易无法成功。
如果身份验证失败,您还可以检查 response.error 以获取有关网关发送的任何其他错误的更多信息。
iOS 示例代码
AuthenticationHandler.shared.authenticate(request) { (response) in DispatchQueue.main.async { switch response.recommendation { case .doNotProceed: if let error = response.error { print ("SDK Error:\(error.localizedDescription)") if let authError = error as? AuthenticationError, authError == .recommendation_ResubmitWithAlternativePaymentDetails { //"Authentication not successful, re-enter card details" } } // "Authentication not successful" case .proceed: // Proceed to submit the payment, authorization etc } } }
Android 示例代码
AuthenticationHandler.authenticate(activityContext, session, "your-auth-transaction-id") { response -> when(response.recommendation) { AuthenticationRecommendation.PROCEED -> { // continue to payment/authorization } AuthenticationRecommendation.DO_NOT_PROCEED -> { if (response.error !=null) { if (response.error is AuthenticationError.RecommendationResubmitWithAlternativePaymentDetails) { // "Authentication not successful, re-enter card details } } else { // "Authentication not successful" } } } }