Методы 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: Hz5NkNC1IBXC+Uiy2WbsBVutzZAZNneShlcC88ZT8YooDV1Q9hSujHdptk2FkcJUCvN6oec0mVv5mGNOTgJxv80Oz4NfLnVQ/G6lISFmkOAQdpKufrBdU5dOp/eSagPqqOjiCxC1NMUzKzakeFVkGPRDbSiHAQGvDxSmC2+2j3NbKKFCjxjQixGczdAH4r+9XUreOxoO1X9opDE6rcSNho4UsSM/8wfx0CKGP+6PP1AaGn0Vw8Az8YblC2tvslGpr9+lt2K1fIZ8+q65sn19TesV8itVEmo+EbZkcXbIIKuRsixSLyN32Qt1IQC//JzHb3KQz37gFfnlWoODC0LtSA==
Content-Type: application/json
Host: payment.payhub.pro
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#72-1770570589220",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "3333330000",
"email" : "name@example.com",
"ip" : "127.0.0.1"
}
},
"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: 363
{
"operationId" : "1-1-a-656",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#72-1770570589220",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"card" : {
"pan" : "4000000000000002",
"bank" : {
"name" : "BBANK"
},
"receiver" : null
}
}
}
Банковский счет
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: FLcVIAAdJv/ITFFlYQPI8AnLu4QUfM4AupnzvUr3VqtakCXIDewpew5HKdTFWoA+cUaeEPJ606BqqwVmaVlVdze+ZAKjjLwXmAICan+04wfuEnfw/FKVMfba8djWAXOkZGs2svaISSSgH6R2JmrqETgKZiSjZCUMfHfX0JrJ0zpW12VqzIKXtE7aq6GuQ0nsMfxAMMUU58FPFX3vNkbXowt1g6qtJ/ppxZRZigS1h8DRI+mLEGq4vxHYLJLFgT2eCx3eJoEWbe23Vsd9Sfq3sy2S/yTyOedAO7PvGeXpbdzbHXV3JwaczBdJb+LFPvPuoCetToJvhFYIx9cjd90MLQ==
Content-Type: application/json
Host: payment.payhub.pro
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#81-1770570599572",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "4444440000",
"email" : "name@example.com",
"ip" : "127.0.0.1"
}
},
"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: 373
{
"operationId" : "1-1-a-665",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#81-1770570599572",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"account" : {
"number" : "20000000000000000004",
"bank" : {
"name" : "CBANK"
},
"receiver" : null
}
}
}
Номер телефона
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: RdEEWSrLFZRA8+KUpLyzqjBY0jkVbku9gMn46H5tcdKMf7NGbSGyWlair339+46Aw0UwCTF/RHcXiYeM3fVpQu6fNcQaqYsqN+mBunH7sIOAyjsV73881ByAhrbMxN+zF/loKZhMRlMzw1YsCF6u5wYyeLodk8/R1lyJu8mVulz87x7xXl+Q2etn16vqsizonuXAzzg/sPu5iUqfzz60ZBiBwRbRB3UfarH6hHwMX2AJX2EXvmzeJ70u0FpYdIUTyJiU9Ms1/YFUb0UdNxG33rbgsd+taQcCcP1bfIYHOxAj+By6PK5WnfYBl/exBZSGHJkVZQWpppglPD7Tgq5oCQ==
Content-Type: application/json
Host: payment.payhub.pro
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#73-1770570590901",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "1111110000",
"email" : "name@example.com",
"ip" : "127.0.0.1"
}
},
"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: 389
{
"operationId" : "1-1-a-657",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#73-1770570590901",
"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: FLcVIAAdJv/ITFFlYQPI8AnLu4QUfM4AupnzvUr3VqtakCXIDewpew5HKdTFWoA+cUaeEPJ606BqqwVmaVlVdze+ZAKjjLwXmAICan+04wfuEnfw/FKVMfba8djWAXOkZGs2svaISSSgH6R2JmrqETgKZiSjZCUMfHfX0JrJ0zpW12VqzIKXtE7aq6GuQ0nsMfxAMMUU58FPFX3vNkbXowt1g6qtJ/ppxZRZigS1h8DRI+mLEGq4vxHYLJLFgT2eCx3eJoEWbe23Vsd9Sfq3sy2S/yTyOedAO7PvGeXpbdzbHXV3JwaczBdJb+LFPvPuoCetToJvhFYIx9cjd90MLQ==
Content-Type: application/json
Host: payment.payhub.pro
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#81-1770570599572",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "4444440000",
"email" : "name@example.com",
"ip" : "127.0.0.1"
}
},
"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: 373
{
"operationId" : "1-1-a-665",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#81-1770570599572",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"account" : {
"number" : "20000000000000000004",
"bank" : {
"name" : "CBANK"
},
"receiver" : null
}
}
}
Проверка Captcha
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: lQ3X+TX/awvwpWpz6PBfjdql55kj5SaHcEAA07f167BFWNoA3R52jEr11fT2nSKXNWD6z2Dnt78AMo8ROL1AW5iO1B2f4SJ+Y6nJvfPRL9r8K+b6AIHfWkE0pHIePdt+i68/hxOouH2A5IAi+eqcVF+lIpCBT/WsbDQXhT+WEplWgijYH6MVbgXilM84+v4ZJQuSLSBPMkjhBjMIID94yHgDxKX1INN0oi457T37tN7NPocS7K8cR25yJux+Pz7bIRZr8wqATyDEETLHQ4YnSNm6H7EuejqRi6HBDuSmvbVLIMNUj/UeZmNE2Qneoztpu2JidnlSxVygu1C2yP2tig==
Content-Type: application/json
Host: payment.payhub.pro
Content-Length: 520
{
"notification" : {
"url" : "http://127.0.0.1:8080/test/callback/default/",
"version" : 1
},
"externalId" : "ext#75-1770570592986",
"amount" : {
"amount" : 10.55,
"currency" : "USD"
},
"payer" : {
"paymentMethod" : null,
"info" : {
"phone" : "3333331000",
"email" : "name@example.com",
"ip" : "127.0.0.1"
}
},
"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: 351
{
"operationId" : "1-1-a-660",
"status" : "WAITING_FOR_CONFIRMATION",
"type" : "P2P",
"externalId" : "ext#75-1770570592986",
"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-660/completep2p HTTP/1.1
W1-Signature: EkA7Li+s2pa7cIBodo4HmPpE0tfQuTDiiJhYWVUoFEogBU/Bazq3cEaD9/wOIdQ8uv7FBVpAeZx99A2Up2CaZtx/FFXqGGR3141mx4E0FWKtMHn2qyveNMJDlMaahPLWWF3Ao+AamRkO6vvM//oDV9UJdIfXjnlOtT5p3ohyLinEJ7SnOgNq1tdLwsZEuUl6c7YJ9vjoXwL/9TfW5XvePy5gF4R4CPq0XWpwzijWmR8olQVxpJFoypPmoYdpbkrTFVuRFsn9v0H/LTGB1TySSlz5PfNAs8arJB1lzKkPD2+r1XvWIcljHoeiYCfSCDcRGUBeyMRNTOkty8gJkqESsQ==
Content-Type: application/json
Host: payment.payhub.pro
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: 363
{
"operationId" : "1-1-a-660",
"status" : "WAITING_FOR_EXTERNAL_AUTH",
"type" : "P2P",
"externalId" : "ext#75-1770570592986",
"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);
})