Методы 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: a/jI2BQ5/rWIa0KP58ghTjX3E21Y+LFYDBPbNWbiXCRE+TINNZ7zktCPZg6auOtj36b8iCVqrbsBOMYWmSAFB0JHVC3mZOOWMXqf1K/qmVkcJXsGbIE0bHV2D4VXkUPWHqqBhQ9v7/CsL++FdiBxZs0c3/Wu9UGBq5ZIpxRME06CKtCes08PvdTeDPYBebGD6OXVEvENNz2aIROc0ceSDX2pL2K8pqc80OPQ0U3GnjnpQ5+Ssoy+kgkEOGi8yIrYx5dEkHSh7EtqwbF6H5kO3SbbKqN6KyqzGhwagwt4PLgIq6yovJrnZFkQ1vkPS235bDGnzyA/BTW2LGssSfktwA==
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-1775227434533",
"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-1775227434533",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"card" : {
"pan" : "4000000000000002",
"bank" : {
"name" : "BBANK"
},
"receiver" : null
}
}
}
Банковский счет
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: KdToq9SocAShtoJqfq3yhD8Dv6pNSmvA+4mhkE040iB/4M724LIhRNJDIX/6irZYqzLBHF6I+LJSNdjMn2LEp54zOh6OIrXwPpU15LRrovhZvHkfzr7D70QVIgh9zV093v38kM1TKcKUebEiURyjzA3am2KchjXY+4GEvfezRM2jPMKV+CTutMcBGq6kl89Aw/tw8mwj2awX4RfPaXmIiAlz7cMfelfM13SLx+NjK4SnC5LfIFwpn0z0ORKfeCs3LoimJJ9ZrUatry3GT3MAFbAWZhqTrpxm7gzQPu8EZuS04kRjYF12PQgElcOZv1k1H62DXwH+FWliimvxKwSdLg==
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-1775227449470",
"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-1775227449470",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"account" : {
"number" : "20000000000000000004",
"bank" : {
"name" : "CBANK"
},
"receiver" : null
}
}
}
Номер телефона
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: NKpwHP6S+0g1U0U4tPfECWexgThcUYPyffRVkCV+tKylWTZZdpYCt9OdzDuWnar5C+kxk481okQR9qM/bijEv1sbLIcMRgApV4B/cEowG3C3lNSgFn19386eiqB6B4zk9slq9oV97CzYBFyo/Fzc7vQyllMgeQyJFVDPWn+L0BmntOkZhgnAornEFISH/XIdCpvJQ0vGL17sNuGYL7qZynR1+CXLtFqNgkFhE65yHl4ehZjZqtGHIG//mx7SS98M8X0x3V4u4cz6ss+Wl2Bvm/JKi5ateA6gWiGzn8JFHbKhvXDgh9LDSYfknLNkEm1Dx7KI3uw7lz8ptCWBMXmt5g==
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-1775227436754",
"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-1775227436754",
"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: KdToq9SocAShtoJqfq3yhD8Dv6pNSmvA+4mhkE040iB/4M724LIhRNJDIX/6irZYqzLBHF6I+LJSNdjMn2LEp54zOh6OIrXwPpU15LRrovhZvHkfzr7D70QVIgh9zV093v38kM1TKcKUebEiURyjzA3am2KchjXY+4GEvfezRM2jPMKV+CTutMcBGq6kl89Aw/tw8mwj2awX4RfPaXmIiAlz7cMfelfM13SLx+NjK4SnC5LfIFwpn0z0ORKfeCs3LoimJJ9ZrUatry3GT3MAFbAWZhqTrpxm7gzQPu8EZuS04kRjYF12PQgElcOZv1k1H62DXwH+FWliimvxKwSdLg==
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-1775227449470",
"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-1775227449470",
"params" : { },
"actions" : {
"required" : [ ]
},
"externalPaymentParameters" : {
"account" : {
"number" : "20000000000000000004",
"bank" : {
"name" : "CBANK"
},
"receiver" : null
}
}
}
Проверка Captcha
POST /card/1-1/operations/p2p HTTP/1.1
W1-Signature: THSR5F7Q5HLn3lyJihK93VArKZ5YQI/Pn3v0Q7Dxtk0hdOklQrXR8bYJhPByfR+Xd1bq+Zmv9y0+bfw5j7EAnACVZo5Dom2H5MdljbjMnWRJ4NfISpq1aRQqB06BJ8q/QsfYXIcK9WPBXaM0IGhiLr/xSos2ZIG2Y/5x+uouc46+HhpX27X/KMC7NnKrY8VSUbF3YXvjSa8UH1tzv5Q0qxJMTVzgq22pK7t9gFz4N3efIsH/chImdx2a7uP3dzYpeIL0Wy2Pxk3hWcBsifxFTLqqBxM2e6+JcolWA/YI4HDKS87ooQrNwW0rALFuVNTlRW0aysEN4NM6do80g5rqgg==
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-1775227439433",
"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-1775227439433",
"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-1775227439433",
"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);
})