跳转至

3DS支付验证

在信用卡支付中使用3DS支付验证

要使用3DS支付验证,你可能需要先集成供应商所提供的用于3DS的JavaScript库。 然后你需要在支付请求的card3dsInfo对象中,指定字段use3ds的值为true,并提供对应供应商所需的其他验证参数。

在收到3DS支付验证请求后,支付系统会返回一个带有验证信息的IN_PROGRESS状态的响应。 你需要根据这些验证信息,继续进行3DS的认证流程。当付款人完成认证后,支付成功,订单的状态将会转为SETTLED

在巴西,3DS支付验证的可用性如下:

供应商 是否已支持 版本 参考文档 JS库文件
Tuna - - -
Adiq 2.0 点击阅读 adiq-3ds-package-1.0.1-hml-min.js
adiq-3ds-package-1.0.1-min.js

集成Adiq的3DS支付验证

1) 初次使用,你必须先在浏览器页面中集成Adiq的JavaScript库文件。

2) 浏览器页面中必须包含一个输入卡号的文本框。把文本框的元素标识以及回调函数,传递给Adiq库的构造函数,以便让Adiq能够获取卡号和进行回调函数的注册。

3) 浏览器页面需要首先调用Adiq库的Authorization3ds()函数来完成初始化,再调用getThreeDsCode()函数生成一个code3ds编码。

4) 使用这个code3ds编码来创建一个信用卡的支付请求。请求和响应的例子如下:

创建带3DS支付验证的请求

POST /v1/payments/charges/card

Request Headers
{
    "Content-Type": "application/json",
    "Authorization": "Bearer {{access_token}}",
    "x-api-key": "{{api_key}}"
}
Request Body
{
    "idempotencyKey": "1ec983fa-1a37-679b-809b-067861d87ab0",
    "amount": 1000,
    "country": "BR",
    "currency": "BRL",
    "paymentMethod": "CREDIT_CARD",
    ...  # other basic request fields
    "card3dsInfo": {
        "use3ds": true,
        "code3ds": "a88e307cc7c0415494a1e306b4471d46",  // 由Adiq的JS库提供
        "merchantSite3ds": "estabelecimento.com.br"     // 商家的网站域名
    },
    "subMerchantId": "UUID",
    ...  # other basic request fields
}
Response
{
    "transferStatusCode": 200,
    "idempotencyKey": "1ec983fa-1a37-679b-809b-067861d87ab0",
    "referenceId": "1ec983fa-1a37-679b-809b-067861d87ab0",
    "paymentMethod": "CREDIT_CARD",
    "amount": 1000,
    "currency": "BRL",
    "finalAmount": 1000,
    "finalCurrency": "BRL",
    "country": "BR",
    "createTime": "2022-03-01 17:53:18 GMT-08:00",
    "scheduledTime": "2022-03-01 17:53:18 GMT-08:00",
    ...  # other basic response fields
    "transferDetails": {
        "card": {
            "cardInfo": {
                "cardHolderName": "card_holder_name",
                "expirationMonth": 9,
                "expirationYear": 2024,
                "brand": "VISA",
                "bin": "458124",
                "last4": "0000"
            },
            "cardId": "8736453a-dad0-4f26-85f0-95e8787d0237",
            "card3dsInfo": {
                "use3ds": true,
                "code3ds": "a88e307cc7c0415494a1e306b4471d46",
                "merchantSite3ds": "estabelecimento.com.br",
                "vendor3dsChallengeInfo": {
                    "adiq3dsChallengeInfo": {
                        "acsUrl": "https://emv3dsauth1.secureacs.com/acs2web/acs2nubankbr/authentication",
                        "pareq": "eyJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6",
                        "authenticationTransactionId": "mBNpR2zF2dkdFICP6NU1"
                    }
                }
            }
        }
    },
    "transferStatus": "IN_PROGRESS",
    "description": "this is a test pay",
    "subMerchantId": "UUID"
}

5) 从以上例子的响应中可以看到,当认证需要走3DS的挑战流程时,vendorDsChallengeInfo对象中将会返回所须的验证信息。

6) 使用vendorDsChallengeInfo对象返回的acsUrlpareqauthenticationTransactionId信息,调用浏览器页面的函数InitChallenge(acsUrl, pareq, authenticationTransactionId),之后浏览器会弹出一个发卡行的认证页面。

7) 当付款人完成认证后,弹出窗口将会消失。在第2步中注册的回调函数,将会收到一个包含JWT校验令牌和挑战状态的payments.validated事件。

8) 最后把第7步的校验令牌和code3ds编码,发送到端点/card/confirm/{idempotencyKey}。支付成功后,订单状态将会转为SETTLED。请求和响应的例子如下:

确认3DS支付验证

POST /v1/payments/charges/card/confirm/{{idempotencyKey}}

Request Headers
{
    "Content-Type": "application/json",
    "Authorization": "Bearer {{access_token}}",
    "x-api-key": "{{api_key}}"
}
Request Body
{
    "adiqValidationInfo": {
        "code3ds": "a88e307cc7c0415494a1e306b4471d46",
        "validateToken": "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI1ZjM2Y2"
    }
}
Response
{
    "transferStatusCode": 200,
    "idempotencyKey": "1ec983fa-1a37-679b-809b-067861d87ab0",
    "referenceId": "1ec983fa-1a37-679b-809b-067861d87ab0",
    "paymentMethod": "CREDIT_CARD",
    "amount": 1000,
    "currency": "BRL",
    "finalAmount": 1000,
    "finalCurrency": "BRL",
    "country": "BR",
    "createTime": "2022-03-01 17:53:18 GMT-08:00",
    "scheduledTime": "2022-03-01 17:53:18 GMT-08:00",
    ...  # other basic response fields
    "transferDetails": {
        "card": {
            "cardInfo": {
                "cardHolderName": "card_holder_name",
                "expirationMonth": 9,
                "expirationYear": 2024,
                "brand": "VISA",
                "bin": "458124",
                "last4": "0000"
            },
            "cardId": "8736453a-dad0-4f26-85f0-95e8787d0237",
            "card3dsInfo": {
                "use3ds": true,
                "code3ds": "a88e307cc7c0415494a1e306b4471d46",
                "merchantSite3ds": "estabelecimento.com.br",
                "vendor3dsChallengeInfo": {
                    "adiq3dsChallengeInfo": {
                        "acsUrl": "https://emv3dsauth1.secureacs.com/acs2web/acs2nubankbr/authentication",
                        "pareq": "eyJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6",
                        "authenticationTransactionId": "mBNpR2zF2dkdFICP6NU1"
                    }
                }
            }
        }
    },
    "transferStatus": "SETTLED",
    "description": "this is a test pay",
    "subMerchantId": "UUID"
}
回到页面顶部