Методы P2P создают операцию и возвращают в ответе номер платежного средства для осуществления перевода денег клиентом. В некоторых случаях для получения платежного средства клиенту понадобится пройти дополнительную проверку. После совершения перевода денег будет отправлен стандартный callback.
В случае успешного завершения операции в ответ придет статус WAITING_FOR_EXTERNAL_AUTH с номером и типом платежного средства. При необходимости дополнительной проверки придет ответ WAITING_FOR_CONFIRMATION с параметрами для верификации. На данный момент поддерживается только тип CAPTCHA_ROTATIONS с 9 картинками (матрица 3x3), в формате base64.
Завершение P2P
Для завершения проверки клиента и получения номера платежного средства необходимо отправить запрос с количеством вращений каждой картинки.
Поддерживаемые платежные средства
-
банковская карта
-
номер телефона
-
номер счета
-
внешняя страница провайдера
Поддерживаемые методы проверки
-
rotation captcha
Тестовый банк
Моделирование различных сценариев возможно с помощью передачи различных номеров телефона плательщика во входящих параметрах.
| payer.phone | результат |
|---|---|
1111111111 |
перевод по номеру телефона |
2222222222 |
перевод на внешней странице |
3333333333 |
перевод по номеру карты |
1111111199 |
перевод по номеру телефона с предварительной верификацией |
2222222299 |
перевод на внешней странице с предварительной верификацией |
3333333399 |
перевод по номеру карты с предварительной верификацией |
прочие |
отказ |
Для успешного прохождения верификации необходимо передать 9 единиц в поле rotations.
Примеры запросов и ответов
Банковская карта
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: Hbj/wSpZAplY7UN9gEgJ1RhQDTMqrpX7g1Nbmrf5L53kupAlUuZb+f3ONUT7qLnvAPxfBLIvjmWVHNr1pkFEBCnP3zaw+GFm9a7rIuPLj6ALcEDtoFTWofdWGYz1xzgOdTUGww9zm3oOwH+k2ijFYcWJP7syPSkjfoLght4Ty4LMqewZ28BDwimBQ+FHLloVBV0hYGy04t1z+4wlMrCsQb3vOtqauoyaSMu/JAath2TLj6f+WIHsplTbXPopm3AhMs2MZyu673DywHASKCgoKQWbjvsDmJ0ZcbE0I4CYkKThMkDSgtyLfIo7HVXRyz3AiSR0dNfk3vNR4ljbIvV47A==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#72-1779575551630",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "3333330000",
"ip" : "127.0.0.1",
"email" : "name@example.com"
}
},
"merchantParameters" : {
"param1" : "anything you want for callback",
"param2" : null,
"param3" : null
},
"pageParameters" : null
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 362
{
"operationId" : "1-1-a-60",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#72-1779575551630",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"card" : {
"pan" : "4000000000000002",
"bank" : {
"name" : "BBANK"
},
"receiver" : null
}
}
}
Банковский счет
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: G3A5cnGOWSB8jyXmRXgGVyidnovYthqt60a6IbUGXiMamObRlOIVfhIQIKxm53PReKnYo645tHf+EtpzheFfhkhWrzUEgP23MTGch6fUTJCPiUiZLSBIRFFPRKVkcMv/JspkunPP3u9HUhGVgFU5TQUvZ9iHBni1pbCBAoUJ6nHJOMnDzajvy4z8akRZiQNA9gIhFHmGA1dZDGJjxQYxzrnkTn9xiUiQ723axUV8T1OriQdfeO7C+UGJnPztfi2zGmc/sTcGmWgiMdIGy3Dxp3zpipcIoWVzxHrtA2dL0jz+no6Rdv1EmamlVSKHOLJDm34Wa0IkJ6jhwXj0a64JZA==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#81-1779575565699",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "4444440000",
"ip" : "127.0.0.1",
"email" : "name@example.com"
}
},
"merchantParameters" : {
"param1" : "anything you want for callback",
"param2" : null,
"param3" : null
},
"pageParameters" : null
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 372
{
"operationId" : "1-1-a-69",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#81-1779575565699",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"account" : {
"number" : "20000000000000000004",
"bank" : {
"name" : "CBANK"
},
"receiver" : null
}
}
}
Номер телефона
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: ww3ZJT2K459jja6LDRGIjDWPpn2/bY27bSFKQQgMm/eYLKNu4x9rpkgiADlmYEKozV1pWQgIA8SJ9lfienfQrgQ7TmpcjTDa5NsoTra0rmuzKJQsptZURnqEWVat/90aOy2ZTmReOgonfXN7O5jT+1FkHjUzVHuX+0rlXL/iZS95oK2IKuWxHKpCQNpUOTPljMFtZcwHHhx/KvIQUUvk6Fi0sQeBeVU/a4xxSxxV5NZ+9KpaRpvscLvJj7L9wlrPGSJat3s4ReXFODIKjDM3uACtNTxe1gk8ZtmTnHSZvtsb0JCyFq0q5NV3wH6jT80rZCx12x0SfW4AUdeU8n0g3A==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#73-1779575553971",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "1111110000",
"ip" : "127.0.0.1",
"email" : "name@example.com"
}
},
"merchantParameters" : {
"param1" : "anything you want for callback",
"param2" : null,
"param3" : null
},
"pageParameters" : null
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 388
{
"operationId" : "1-1-a-61",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#73-1779575553971",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"phone" : {
"number" : "1231231",
"bank" : {
"name" : "ABANK"
},
"receiver" : {
"name" : "IVAN I"
}
}
}
}
Внешняя платежная страница
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: G3A5cnGOWSB8jyXmRXgGVyidnovYthqt60a6IbUGXiMamObRlOIVfhIQIKxm53PReKnYo645tHf+EtpzheFfhkhWrzUEgP23MTGch6fUTJCPiUiZLSBIRFFPRKVkcMv/JspkunPP3u9HUhGVgFU5TQUvZ9iHBni1pbCBAoUJ6nHJOMnDzajvy4z8akRZiQNA9gIhFHmGA1dZDGJjxQYxzrnkTn9xiUiQ723axUV8T1OriQdfeO7C+UGJnPztfi2zGmc/sTcGmWgiMdIGy3Dxp3zpipcIoWVzxHrtA2dL0jz+no6Rdv1EmamlVSKHOLJDm34Wa0IkJ6jhwXj0a64JZA==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#81-1779575565699",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "4444440000",
"ip" : "127.0.0.1",
"email" : "name@example.com"
}
},
"merchantParameters" : {
"param1" : "anything you want for callback",
"param2" : null,
"param3" : null
},
"pageParameters" : null
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 372
{
"operationId" : "1-1-a-69",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#81-1779575565699",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"account" : {
"number" : "20000000000000000004",
"bank" : {
"name" : "CBANK"
},
"receiver" : null
}
}
}
Проверка Captcha
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: IfU373iDVGfuD2Fy/7/l4QmWnjKmTdj2EfmsQbXtsFRtcTD+dvpp2wMHMdubSjE2i5GEhpte3CcEZ+v2kH4YZ0EJIfD+dYlrjNm9hvWDOCtMLsjliB+ItecqBu3o1DUGuRBAmR9TPcdOBOG0lPkfAieGu8wymT6GRwgOtGnGnR71yEFrwWcNloGqTxlMfIZiseOHOpLw5iIWbuBesUz+aMe5nvkM+Nk1ZxXaiP3FSRYGZL4Fjfk8ynhOH/RIE9rTpvaQJkmv/BfkRyoYX4EhoRgOns4bjCz5E5OY/NQfauGLsQRVtvb/kfE8ytO98hjFeK65OW/kxrUFcNz4xcJPSg==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#75-1779575556620",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "3333331000",
"ip" : "127.0.0.1",
"email" : "name@example.com"
}
},
"merchantParameters" : {
"param1" : "anything you want for callback",
"param2" : null,
"param3" : null
},
"pageParameters" : null
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 350
{
"operationId" : "1-1-a-64",
"status" : "WAITING_FOR_CONFIRMATION",
"type" : "P2P",
"externalId" : "ext#75-1779575556620",
"params" : { },
"actions" : {
"required" : [ ]
},
"verificationParameters" : {
"type" : "CAPTCHA_ROTATIONS",
"params" : {
"images" : [ "a", "b", "c", "d", "e", "f", "g", "h", "i" ]
}
}
}
POST /card/1-1/operations/1-1-a-64/completep2p HTTP/1.1
W1-Signature: ab2p4XFejcPai1CgsIxzerhN9XOJ4yD2zOSNt9hKq8ycDyOIS60RRw9QHXzzPF7ZeGR75s+Vdk/ediyfSv1KEm6TFJC9g1jmwcW+PUuQRMqViIcg9PQB7ZMJwMbApfG4aYMUI5bSXumi+lfpziPukNPRCPJkXArcYKjYci4s4hdO2shSupQJWBrCybQx3D1Oue25KvP19+ie+qj5L8+N12yXU6yM8LBISKPNPHJpGRpLiPJmFDS4cRs/WlT0t7D9KE5feUSrszZA3SQ24LJ74XKRubw+f/xJl5xSnQZ1zC6Bn/ipXnTgKv6QwLHMT4paDGF5PkO0sZGv8irBqXK5Rw==
Content-Type: application/json
Host: payment.flexo.systems
Content-Length: 102
{
"type" : "CAPTCHA_ROTATIONS",
"entity" : {
"rotations" : [ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
}
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 362
{
"operationId" : "1-1-a-64",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#75-1779575556620",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"card" : {
"pan" : "4000000000000002",
"bank" : {
"name" : "BBANK"
},
"receiver" : null
}
}
}
Пример кода для отображения Captcha
<table>
<tr>
<td><img src="data:image/png;base64, ${images[0]}" id="img0"/></td>
<td><img src="data:image/png;base64, ${images[1]}" id="img1"/></td>
<td><img src="data:image/png;base64, ${images[2]}" id="img2"/></td>
</tr>
<tr>
<td><img src="data:image/png;base64, ${images[3]}" id="img3"/></td>
<td><img src="data:image/png;base64, ${images[4]}" id="img4"/></td>
<td><img src="data:image/png;base64, ${images[5]}" id="img5"/></td>
</tr>
<tr>
<td><img src="data:image/png;base64, ${images[6]}" id="img6"/></td>
<td><img src="data:image/png;base64, ${images[7]}" id="img7"/></td>
<td><img src="data:image/png;base64, ${images[8]}" id="img8"/></td>
</tr>
</table>
<input type="text" id="result"/>
<button type="button" id="submit">done</button>
div1=document.createElement("div");
div1.innerHTML = `$html`;
document.body.appendChild(div1);
var rotations = {
'img0': 0,
'img1': 0,
'img2': 0,
'img3': 0,
'img4': 0,
'img5': 0,
'img6': 0,
'img7': 0,
'img8': 0,
}
var txtField = document.getElementById('result');
var imageNodes = document.getElementsByTagName('IMG');
for (var i=0; i<imageNodes.length; i++) {
imageNodes[i].addEventListener('click', e => {
var target = e.currentTarget
var angle = (rotations[target.id] + 90) % 360;
rotations[target.id] = angle;
target.style.transform = 'rotate(' + angle + 'deg)';
var value = "";
for (const [key, vl] of Object.entries(rotations)) {
value = value + (vl / 90);
}
txtField.value = value;
})
}
var btn = document.getElementById("submit")
btn.addEventListener('click', e => {
var result = document.createElement("input");
result.id = "finalResult";
result.type = "text";
result.value = txtField.value;
document.body.appendChild(result);
})