Поддержка 3ds второй версии была включена в январе 2021 года. Изменился протокол взаимодействия с клиентами, не пользующимися нашей платежной страницей.
purchase
Появился новый параметр в запросе tds.notificationUrl (см. пример ниже). Это аналог termUrl в 3dsV1, но теперь он называется иначе. На этот адрес придет cres. Раньше не надо было передавать termUrl, потому что его передавали вместе с Pareq на acsUrl вы сами. Теперь notificationUrl нужен на этапе формирования creq.
Теперь, при запросе purchase клиенту могут вернуться ответы со статусами:
-
SUCCEEDED, если карта не участвует в программе 3ds
-
WAITING_FOR_CONFIRMATION, если карта поддерживает 3dsV1
-
WAITING_TDS_AUTH, если карта поддерживает 3dsV2
Вместе со статусом WAITING_TDS_AUTH приходят 2 параметра: threeDSMethodURL и threeDSServerTransID. threeDSMethodURL - адрес на который нужно обратиться из браузера в скрытом iframe, подробности читайте в официальной документации.
Особенности:
-
threeDSMethodURL может быть пустым, тогда фазу с iframe надо пропустить и переходить к complete3dsAuth
-
если обращение на threeDSMethodURL с помощью iframe закончилось ошибкой, то надо переходить к complete3dsAuth
-
при обращении на threeDSMethodURL передается threeDSMethodNotificationURL (адрес колбека по завершении iframe). На тестовом слое колбек не отсылается, надо переходить к complete3dsAuth
-
Для убыстрения прохождения операций переходить к complete3dsAuth рекомендуется сразу после получения стутуса WAITING_TDS_AUTH, а поход на iframe запустить параллельно, любые race-condition хорошо разруливаются платежными системами.
complete3dsAuth
После получения статуса WAITING_TDS_AUTH нужно по адресу: /card/{siteId}/operations/{operationId}/complete3dsAuth отправить (усеченный) "слепок" браузера (смотри пример ниже)
возможны ответы со статусами:
-
SUCCEEDED, если дальнейшая проверка платежа не требуется
-
WAITING_TDS_VALIDATION, если проверка требуется
Вместе со статусом WAITING_TDS_VALIDATION приходят creq. Дальнейшая процедура аналогична 3dsV1, только вместо paReq используется creq, а вместо paRes - cres. сres придет на адрес указанный в tds.notificationUrl
complete3dsValidate
Полученный cres надо отправить на адрес: /card/{siteId}/operations/{operationId}/complete3dsValidate После этого можно ожидать ответ SUCCEEDED
status
Если любой запрос в этой цепочке вызовов не завершился (timeout / вернулся IN_PROGRESS) , то запросить "утерянный" ответ, можно в методе проверки статуса GET /card/{siteId}/operations/status?externalId=123 Теперь этот метод может возвращать не только финальный статус операции, но и промежуточные. Полный список статусов тут
Последовательность операций
purchase
POST /card/1-1/operations/purchase HTTP/1.1
W1-Signature: Zni68WsRg5DY0MUHL6SyFU3xSoU76BvecNpMdjIu7/OwcLaW75p2XlVeAAUvZV1t56EI3Erf8um+SPiT6lIoMZcjAZNtBrPwtNzUyuXnkV1M4JllR7GYHny3i1ViYM2sf4ImIURVQgGhvXMB+CkmzxhN4VTuyMK41Z1NPQ/U1KB6NjmEfNZR7XoV/QSxmyr1ID30SML4tyS6W2adl4K17nwwm4ChOCVmrkfR/2SKH8+B7pQ/87M+oxYy1xSLB39SXO3Q2x/lMr3ojoePbGn7ZYEKg06O6eVV5k5/p36AH2fTxxkR/XYtoa2sOOxMYWjl5lgaB9vBTGuWDCIwmbwRpA==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 751
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#16",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : {
"entity" : {
"pan" : "2200700010001005",
"expMonth" : 5,
"expYear" : 2030,
"cvv" : "444"
},
"type" : "CARD"
},
"info" : {
"ip" : "127.0.0.1",
"phone" : "9001234567",
"email" : "no-reply@example.com"
}
},
"merchantParameters" : {
"param1" : "anything you want for callback",
"param2" : null,
"param3" : null
},
"registerRecurring" : false,
"tds" : {
"notificationUrl" : "http://tds.notification.url:6789"
}
}
ответ
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 309
{
"operationId" : "1-1-a-13",
"status" : "WAITING_TDS_AUTH",
"type" : "PURCHASE",
"externalId" : "ext#16",
"params" : {
"threeDSMethodURL" : "https://payment.flexo.systems/test",
"threeDSServerTransID" : "a3d2fc50-9944-34a6-8356-3185b8f946d5"
},
"actions" : {
"required" : [ ]
}
}
complete3dsAuth
POST /card/1-1/operations/1-1-a-13/complete3dsAuth HTTP/1.1
W1-Signature: DuZe1KdJxVRLJCk+4UfMBaSF1VyHSa5DSs+lohtnE/eKo3zVT9fbjwjNjKeL5qq4H/YwfezpoPDhhWDRhKO1lMBp2i6gC+738TWoM4zrurt3I9tn86dYePThjlRZMxpgOFD49n+GpyekILlc29peJfvtQS5UpvAO1jWdi3fUaD4JBLg7yvEjn8uESfMv7BpeqygHh+POtrwkobf22qNDvhWJ1F1B5O+hqHWvH3Ip58yNlpNJdj07e24WaHDnYO0AlzwrZzycLdgsW3R5m7TKwF2ym+LJFNTeouJ3HHvDDnhiZN6WlVvlyXEmbKy9p9dR8hNCedsni2lpJJS7bNF1/w==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 395
{
"threeDSServerTransID" : "a3d2fc50-9944-34a6-8356-3185b8f946d5",
"info" : {
"screenWidth" : "1920",
"screenHeight" : "1080",
"language" : "ru",
"javaEnabled" : "false",
"acceptHeader" : "application/json, text/plain, */*",
"ip" : "46.188.125.87",
"userAgent" : "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0)",
"colorDepth" : "24",
"tz" : "-180"
}
}
ответ
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 448
{
"operationId" : "1-1-a-13",
"status" : "WAITING_TDS_VALIDATION",
"type" : "PURCHASE",
"externalId" : "ext#16",
"params" : {
"acsUrl" : "http://testacs:9191/test/acs/3ds2",
"creq" : "eyJ0ZXJtVXJsIjoiaHR0cDovL3Rkcy5ub3RpZmljYXRpb24udXJsOjY3ODkifQ==",
"threeDSMethodURL" : "https://payment.flexo.systems/test",
"threeDSServerTransID" : "a3d2fc50-9944-34a6-8356-3185b8f946d5"
},
"actions" : {
"required" : [ ]
}
}
complete3dsValidate
POST /card/1-1/operations/1-1-a-13/complete3dsValidate HTTP/1.1
W1-Signature: XLS2aza0/Zhpe9neuU/VtAVPHTBLRovbcwLVHglXG5zDefzPzLlumt+oFRxoQbzf5bnDa7p7X9bNq6KyLYcVtKcqBMQrYQyNeVjX26YrI48/MQ7381SufqGCZ7g1jmb/q7qoezj+QmTDg7BDhS3TrGWBX5VRBicI1Dsm1NYl13nkXbvF90KHjoK9ZQ31VAOlzH0WwFB/K+nCGUWgA4jovhMH1CEXSCoGApiPlMXZAT5hU+R5LNVeS/7wnv6zUvRzYjbxEwQqHimY+20grdafshPys4xk0sLlDwKhavm5Di37cxplqfiSZOituAiqfHYJDE7i77LhNEUyUkTkBpb0Kg==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 25
{
"cres" : "verified"
}
ответ
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 168
{
"operationId" : "1-1-a-13",
"status" : "SUCCEEDED",
"type" : "PURCHASE",
"externalId" : "ext#16",
"params" : { },
"actions" : {
"required" : [ ]
}
}