1.1 Платежный виджет
1.1.1 Подключение
Для подключения платежного виджета используется скрипт:
https://paymo.ru/paymentgate/iframe/checkout.js
1.1.2 Вызов платежного виджета
Ниже приведен пример для метода
set()иopen():
<script src="https://paymo.ru/paymentgate/iframe/checkout.js"></script>
<script>
PaymoFrame.set({
parent_id: "iframe_parent",
api_key: "e5ebc0d4-f90b-409b-874c-c729987001da",
tx_id: "123",
description: "Тестовый платеж",
amount: 1000,
signature: "0cm9ri03f303ed09mf3",
success_redirect: "http://yoursite.ru/success_redirect",
fail_redirect: "http://yoursite.ru/success_redirect",
auto_return: 1,
rebill: {},
extra:{
some_key: "some_value",
some_key2: "some_value2"
},
phone: "79991234567",
email: "email@mail.com",
send_post_message: false,
version: "2.0.0"
})
</script>
<div id="iframe_parent"></div>
Существует объект PaymoFrame и его два метода для вызова платежного виджета: set() и open().
При использовании метода open() виджет будет отображаться по центру экрана,
тогда как при методе set() добавление виджета будет произведен в тот элемент, который
передается в параметре parent_id.
Демо-магазин можно посмотреть: Вариант 1 и Вариант 2.
Описание параметров
| Название | Обязательно | Описание |
|---|---|---|
parent_id |
Да | Элемент, в который будет произведено добавление iframe. |
api_key |
Да | Ключ магазина, который генерируется автоматически при создании магазина. Доступен на вкладке "Магазины" личного кабинета. |
tx_id |
Да | Номер транзакции в магазине. Может быть любым набором символов. Должен быть уникален в пределах выбранного магазина. |
description |
Нет | Назначение (описание) платежа. |
amount |
Да | Сумма платежа в копейках. |
signature |
Да | Формирование подписи. По умолчанию подпись формируется с помощью алгоритма SHA256: sha256("api_key"+"tx_id"+"amount"+"secret_key"). Пример на php: $signature = hash('sha256', $api_key.$tx_id.$amount.$secret_key); secret_key задается в Личном кабинете, раздел Магазины => Настройки => Технические настройки |
success_redirect |
Нет | URL для возврата при успешном платеже. |
fail_redirect |
Нет | URL для возврата при неуспешном платеже (fail и success URL могут быть одинаковыми). |
auto_return |
Нет | Автоматический редирект на success_redirect (или fail_redirect) после оплаты. Задается в секундах, например при: auto_return: 1, редирект произойдет через 1 секунду. |
rebill |
Нет | При использовании рекуррентных платежей (см. Рекурректные платежи). |
extra |
Нет | Дополнительные параметры платежа (см. Дополнительные параметры платежа). |
phone |
Нет | Номер телефона пользователя. |
email |
Нет | Email пользователя. |
send_post_message |
Нет | Метод postMessage() отправляет сообщение от iframe на сайт мерчанта. При инициализации виджета отправляется сообщение paymo-widget-init. При успешном платеже отправляется сообщение paymo-payment-success, а при неуспешном платеже отправляется сообщение paymo-payment-unsuccess. Уведомления при ошибке инициализации: paymo-init-error-api_key, paymo-init-error-invalid_parameters, paymo-init-error-payment_module, paymo-init-error-invalid_transaction, paymo-init-error-invalid_data, paymo-init-error-amount, paymo-init-error |
version |
Нет | Версия платежного виджета. Доступны две версии: 1.0.0 и 2.0.0 |
1.2 Страница UNIFORM
Пример кода для вставки:
<div>
<form action="https://checkout.paymo.ru/uniform/" method="POST">
<input type="hidden" name="api_key" value="e5ebc0d4-f90b-409b-874c-c729987001da">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="tx_id" value="2484984984984">
<input type="hidden" name="description" value="Назначение (описание) платежа">
<input type="hidden" name="signature" value="0cm9ri03f303ed09mf3">
<input type="hidden" name="email" value="client@e-mail.ru">
<input type="hidden" name="phone" value="79991234567">
<input type="hidden" name="success_redirect" value="http://yoursite.com/success">
<input type="hidden" name="fail_redirect" value="http://yoursite.com/fail">
<input type="hidden" name="auto_return" value="10">
<input type="hidden" name="extra_key1" value="value1">
<input type="hidden" name="extra_key2" value="value2">
<input type="submit" value="Оплатить">
</form>
</div>
Оплата с переходом на платёжную страницу, разработанная сервисом оплаты PAYMO. После завершения оплаты клиент будет направлен обратно на страницу интернет-магазина.
Демо-магазин можно посмотреть здесь.
Описание параметров
| Название | Обязательно | Описание |
|---|---|---|
api_key |
Да | Ключ магазина, который генерируется автоматически при создании магазина. Доступен на вкладке "Магазины" личного кабинета. |
tx_id |
Да | Номер транзакции в магазине. Может быть любым набором символов. Должен быть уникален в пределах выбранного магазина. |
description |
Нет | Назначение (описание) платежа. |
amount |
Да | Сумма платежа в копейках. |
signature |
Да | Формирование подписи. По умолчанию подпись формируется с помощью алгоритма SHA256: sha256("api_key"+"tx_id"+"amount"+"secret_key"). Пример на php: $signature = hash('sha256', $api_key.$tx_id.$amount.$secret_key); secret_key задается в Личном кабинете, раздел Магазины => Настройки => Технические настройки |
success_redirect |
Нет | URL для возврата при успешном платеже. |
fail_redirect |
Нет | URL для возврата при неуспешном платеже (fail и success URL могут быть одинаковыми). |
auto_return |
Нет | Время (в секундах) для авторедиректа на success или fail URL |
phone |
Нет | Номер телефона пользователя. |
email |
Нет | Email пользователя. |
extra_<key> |
Нет | Дополнительные параметры платежа. В форме может быть несколько дополнительных параметров платежа, которые передаются в виде: "extra_"+"название параметра". |
1.3 Выставление счетов
1.3.1 Создание счетов
Пример запроса:
curl -X POST \
"https://paymo.ru/rest/merchant/invoice/" \
-H 'content-type: application/json' \
-d '{
"api_key": "26785c66-10a0-4485-ab67-7e1558cbfdc6",
"contact": "7**********",
"price": "1.05",
"description": "Тестовый счет",
"order": "23"
}'
var request = require("request");
var options = {
method: 'POST',
url: 'https://paymo.ru/rest/merchant/invoice/',
headers: {
'content-type': 'application/json'
},
body: {
api_key: '26785c66-10a0-4485-ab67-7e1558cbfdc6',
contact: '7**********',
price: '1.05',
description: 'Тестовый счет',
order: '22'
},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
response = requests.post('https://paymo.ru/rest/merchant/invoice/', json={
'api_key': '26785c66-10a0-4485-ab67-7e1558cbfdc6',
'contact': '7**********',
'price': '1.05',
'description': 'Тестовый счет',
'order': '22'
})
response.json()
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://paymo.ru/rest/merchant/invoice/', [
'json' => [
'api_key' => '26785c66-10a0-4485-ab67-7e1558cbfdc6',
'contact' => '7**********',
'price' => '1.05',
'description' => 'Тестовый счет',
'order' => '22'
]
]);
$result = json_decode((string)$response->getBody(), true);
Пример ответа:
{
"result_sms": "success",
"message_sms": "Счет отправлен на указанный телефон.",
"url": "https://checkout.paymo.ru/invoice/?invoice=64ab820b365c508f",
"qr_code_url": "https://paymo.ru/qr/invoice_qr/64ab820b365c508f/"
}
Рассмотрим пример выставления счета на E-mail или по SMS ваших клиентов.
HTTP Request
POST https://paymo.ru/rest/merchant/invoice/
Параметры запроса
| Название | Обязательно | Описание |
|---|---|---|
api_key |
Да | Ключ магазина, который генерируется автоматически при создании магазина. Доступен на вкладке "Магазины" личного кабинета. |
contact |
Нет | Номер телефона пользователя (7**********). |
contact_email |
Нет | Email пользователя. |
price |
Да | Сумма счета в рублях. |
description |
Да | Описание счета. |
order |
Да | Номер счета в системе магазина. |
life_time |
Нет | Дата окончания действия счета, после чего он будет отменен. Формат даты: %d.%m.%Y %H:%M. Временная зона: Москва. Например: 15.10.2015 10:45. |
departure_type |
Нет | Тип уведомления покупателя. Сущестует четыре типа уведомления: url, sms-email, sms или email. По умолчанию тип, в завивимости от переданных данных, определяется автоматически. |
extra |
Нет | Дополнительные параметры платежа (см. Дополнительные параметры платежа). |
Параметры ответа
| Название | Обязательно | Описание |
|---|---|---|
result |
Нет | Результат выполнения операции success / fail. |
message |
Нет | Сообщение с информацией о результате выполнения операции. |
result_sms |
Нет | Результат выполнения операции success / fail. |
message_sms |
Нет | Сообщение с информацией о результате отправки ссылки на счет на указанный номер телефона. |
result_email |
Нет | Результат выполнения операции success / fail. |
message_email |
Нет | Сообщение с информацией о результате отправки ссылки на счет на указанный email. |
url |
Нет | Ссылка на счет. |
qr_code_url |
Нет | Ссылка на qr код, в котором закодирован url на счет. |
1.3.2 Получение статуса счета
Пример запроса:
curl -X POST \
"https://paymo.ru/rest/merchant/invoice/status/" \
-H 'content-type: application/json' \
-d '{
"api_key": "26785c66-10a0-4485-ab67-7e1558cbfdc6",
"order": "23"
}'
var request = require("request");
var options = {
method: 'POST',
url: 'https://paymo.ru/rest/merchant/invoice/status/',
headers: {
'content-type': 'application/json'
},
body: {
api_key: '26785c66-10a0-4485-ab67-7e1558cbfdc6',
order: "23"
},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
response = requests.post('https://paymo.ru/rest/merchant/invoice/status/', json={
'api_key': '26785c66-10a0-4485-ab67-7e1558cbfdc6',
'order': '23'
})
response.json()
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://paymo.ru/rest/merchant/invoice/status/', [
'json' => [
'api_key' => '26785c66-10a0-4485-ab67-7e1558cbfdc6',
'order' => '23'
]
]);
$result = json_decode((string)$response->getBody(), true);
Пример ответа:
{
"result": "success",
"message": "Счет найден.",
"status": "processing",
"url": "https://checkout.paymo.ru/invoice/?invoice=64ab820b365c508f",
"qr_code_url": "https://paymo.ru/qr/invoice_qr/64ab820b365c508f/"
}
HTTP Request
POST https://paymo.ru/rest/merchant/invoice/status/
Параметры запроса
| Название | Обязательно | Описание |
|---|---|---|
api_key |
Да | Ключ магазина, который генерируется автоматически при создании магазина. Доступен на вкладке "Магазины" личного кабинета. |
order |
Да | Номер счета в системе магазина. |
Параметры ответа
| Название | Обязательно | Описание |
|---|---|---|
result |
Да | Результат выполнения операции success / fail. |
message |
Да | Сообщение с информацией о результате выполнения операции. |
status |
Да | Статус счета. (см. Возможные статусы счета) |
url |
Нет | Ссылка на счет. |
qr_code_url |
Нет | Ссылка на qr код, в котором закодирован url на счет. |
1.3.3 Start и Finish CallBacks
Такие же, как и в п. 1.7 Start и Finish CallBacks
Отличия есть только в Finish CallBack. Дополнительно передаются следующие параметры:
| Название | Описание |
|---|---|
order_id |
Номер счета. |
invoice_status |
Статус счета. (см. Возможные статусы счета) |
1.3.4 Возможные статусы счета
| Название | Описание |
|---|---|
save |
Сохранен |
processing |
Не оплачен. |
deposited |
Оплачен. |
declined |
Отменен. |
inactive |
Не активен. |
1.4 Статус платежа
1.4.1 Получение статуса платежа
Пример запроса:
curl -X POST \
"https://paymo.ru/rest/merchant/transaction/status/get/" \
-H 'content-type: application/json' \
-d '{
"hash_sum": "6fad00e9f8b62749e51edd1a6843a4cd2f568418289440f8e6d26a5b212016de",
"transaction": "5bfa60f6-10db-43b0-7d37-c34bef543147",
"api_key": "26785c66-10a0-4485-ab67-7e1558cbfdc6"
}'
var request = require("request");
var sha256 = require("sha256");
var api_key = '26785c66-10a0-4485-ab67-7e1558cbfdc6';
var transaction = '5bfa60f6-10db-43b0-7d37-c34bef543147';
var amount = 3.99;
var secret_key = 'your_secret_key';
var params = [api_key, transaction, parseInt(amount * 100).toString(), secret_key];
var hash_sum = sha256(params.join(''));
var options = {
method: 'POST',
url: 'https://paymo.ru/rest/merchant/transaction/status/get/',
headers: {
'content-type': 'application/json'
},
body:
{
hash_sum: hash_sum,
transaction: transaction,
api_key: api_key
},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
from Crypto.Hash import SHA256
api_key = '26785c66-10a0-4485-ab67-7e1558cbfdc6'
transaction = '5bfa60f6-10db-43b0-7d37-c34bef543147'
amount = 3.99
secret_key = 'your_secret_key'
params = [api_key, transaction, str(int(amount * 100)), secret_key]
hash_sum = SHA256.new(''.join(params).encode()).hexdigest()
response = requests.post('https://paymo.ru/rest/merchant/transaction/status/get/', json={
'hash_sum': hash_sum,
'transaction': transaction,
'api_key': api_key
})
response.json()
<?php
$api_key = '26785c66-10a0-4485-ab67-7e1558cbfdc6';
$transaction = '5bfa60f6-10db-43b0-7d37-c34bef543147';
$amount = 3.99;
$secret_key = 'your_secret_key';
$params = [$api_key, $transaction, (string) $amount * 100, $secret_key];
$hash_sum = hash('sha256', implode('', $params));
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://paymo.ru/rest/merchant/transaction/status/get/', [
'json' => [
'hash_sum' => $hash_sum,
'transaction' => $transaction,
'api_key' => $api_key
]
]);
$result = json_decode((string)$response->getBody(), true);
Пример ответа:
{
"result": "success",
"message": "Transaction find",
"status": "deposited",
"id": 508,
"time": "2014-11-26T09:34:11.686600+00:00",
"sum": "3.99",
"commission": "0"
}
Метод используется для получения статуса конкретного платежа.
HTTP Request
POST https://paymo.ru/rest/merchant/transaction/status/get/
Параметры запроса
| Название | Обязательно | Описание |
|---|---|---|
api_key |
Да | Ключ магазина, который генерируется автоматически при создании магазина. Доступен на вкладке "Магазины" личного кабинета. |
transaction |
Да | Идентификатор транзакции. |
hash_sum |
Да | Формирование подписи: sha256("api_key"+"transaction"+"amount"+"secret_key"). Пример на php: $signature = hash('sha256', $api_key.$transaction.$amount.$secret_key);secret_key задается в разделе Магазины => Настройки => Технические настройкиamount сумма платежа в копейках. |
Параметры ответа
| Название | Обязательно | Описание |
|---|---|---|
result |
Да | Результат выполнения платежа success / fail. |
message |
Да | Сообщение с информацией о результате выполнения платежа. |
status |
Да | Статус транзакции. |
1.4.2 Возможные статусы платежа
| Название | Описание |
|---|---|
processing |
Платеж в обработке. |
deposited |
Транзакция совершена успешно. |
declined |
Транзакция неуспешна. |
wait_external |
Ожидается подтверждение от внешней платежной системы. |
refunded |
Осуществлен полный возврат денежных средств. |
approved |
Денежные средства захолдированы, ожидается подтверждение платежа. |
part_deposited |
Произведено частичное списание захолдированных средств. |
part_refunded |
Произведен частичный возврат денежных средств. |
1.5 Возврат платежа
Пример запроса:
curl -X POST \
"https://paymo.ru/rest/v2/payment/refund/" \
-H 'content-type: application/json' \
-d '{
"api_key": "ef592cb4-90fc-4b45-bc40-0a656fb9e613",
"tx_id": "6315",
"refund_amount": 124.83,
"signature": "bd91c62c1f1b55edd427d09bcb6b726d"
}'
var request = require("request");
var sha256 = require("sha256");
var api_key = '26785c66-10a0-4485-ab67-7e1558cbfdc6';
var tx_id = '6315';
var refund_amount = 124.83;
var secret_key = 'your_secret_key';
var signature = sha256(api_key + tx_id + secret_key);
var options = {
method: 'POST',
url: 'https://paymo.ru/rest/v2/payment/refund/',
headers: {
'content-type': 'application/json'
},
body: {
api_key: api_key,
tx_id: tx_id,
refund_amount: refund_amount,
signature: signature
},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
from Crypto.Hash import SHA256
api_key = '26785c66-10a0-4485-ab67-7e1558cbfdc6'
tx_id = '6315'
refund_amount = 124.83
secret_key = 'your_secret_key'
params = [api_key, tx_id, secret_key]
signature = SHA256.new(''.join(params).encode()).hexdigest()
response = requests.post('https://paymo.ru/rest/v2/payment/refund/', json={
'api_key': api_key,
'tx_id': tx_id,
'refund_amount': refund_amount,
'signature': signature
})
response.json()
<?php
$api_key = '26785c66-10a0-4485-ab67-7e1558cbfdc6';
$tx_id = '6315';
$refund_amount = 124.83;
$secret_key = 'your_secret_key';
$signature = hash('sha256', $api_key . $tx_id . $secret_key);
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://paymo.ru/rest/v2/payment/refund/', [
'json' => [
'api_key' => $api_key,
'tx_id' => $tx_id,
'refund_amount' => $refund_amount,
'signature' => $signature
]
]);
$result = json_decode((string)$response->getBody(), true);
Пример ответа:
{
"result": true,
"refund_amount": "124.83"
}
При выполнении данного метода вызывается Finish callback, согласно механизму модулей и
отправляется письмо мерчанту "Отчет об успешном возврате средств".
HTTP Request
POST https://paymo.ru/rest/v2/payment/refund/
Параметры запроса
| Название | Обязательно | Описание |
|---|---|---|
api_key |
Да | Ключ магазина, который генерируется автоматически при создании магазина. Доступен на вкладке "Магазины" личного кабинета. |
tx_id |
Да | Идентификатор транзакции. |
signature |
Да | Формирование подписи: sha256("api_key"+"tx_id"+"secret_key"). Пример на php: $signature = hash('sha256', $api_key.$tx_id.$secret_key);secret_key задается в разделе Магазины => Настройки => Технические настройки |
refund_amount |
Нет | Сумма частичного возврата, в рублях. Указывается, если сумма возвращается не полностью. Если сумма не указана или равняется нулю, то платеж возвращается полностью. |
refund_amount_kop |
Нет | Сумма частичного возврата в копейках. Приоритет выше, чем у refund_amount. Если переданы оба параметра, то будет учитываться только refund_amount_kop |
available_amount |
Нет | Данный параметр можно использовать, чтобы избежать случайных повторных запросов при частичных возвратах. В данном параметре необходимо передавать доступную сумму платежа. Например, если платеж был на 100 р, available_amount = 100. После частичного возврата на 10 рублей, available_amount будет равен 90 р. Если сделать еще один запрос с available_amount = 100, возврат не произойдет и в ответе будет возвращена ошибка. |
Параметры ответа
| Название | Описание |
|---|---|
result |
Результат выполнения операции true / false. |
refund_amount |
Сумма возврата |
errors |
Массив, содержащий код ошибки. |
Возможные коды ошибок
| Название | Код ошибки | Описание |
|---|---|---|
AMOUNT_INVALID |
17004 | Неверно указана сумма возврата |
PART_REFUND_IMPOSSIBLE |
18001 | Частичный возврат невозможен |
REST_REFUND_DENIED |
18002 | Возврат запрещен |
TERMINAL_INVALID |
21002 | Проблемы с терминалом либо некорректный api-key магазина |
TRANSACTION_REQUIRED |
22001 | Не указан номер транзакции |
TRANSACTION_INVALID |
22002 | Неверно указан номер транзакции |
TRANSACTION_NOT_DEPOSITED |
22004 | Транзакция находится в статусе, при котором невозможен возврат |
API_KEY_REQUIRED |
81001 | Не указан api-key магазина |
API_KEY_INVALID |
81002 | Некорректный api-key магазина |
UNKNOWN_ERROR |
92004 | Неизвестная ошибка |
MODULE_INVALID |
95002 | Ошибка платежного модуля |
SIGNATURE_REQUIRED |
96001 | Не указана сигнатура |
SIGNATURE_INVALID |
96002 | Неверно указана сигнатура |
SECRET_KEY_INVALID |
96003 | В магазине не сгенерирован secret key. |
1.6 Рекуррентные платежи
1.6.1 Параметры рекуррента для iframe виджета
Пример использования:
{
"rebill": {
"amount": 100,
"period": "1.0",
"end": "31-12-2026",
"start_at": "20-10-2023"
}
}
При инициализации iframe на сайте мерчанта необходимо добавить следующие параметры:
| Название | Обязательно | Описание |
|---|---|---|
amount |
Да | Сумма в рублях (например 15 или 15.60). |
period |
Да | Периодичность платежа в формате <кол-во месяцев>.<кол-во дней> (например, 3.0 - каждые 3 месяца, 1.0 - каждый месяц, 0.40 - каждые 40 дней). |
end |
Да | Дата окончания ребиллов в формате DD-MM-YYYY (например, 20-12-2015 - после 20-го декабря 2015 ребиллы прекращаются). |
start_at |
Нет | Дата первого рекуррентного платежа в формате DD-MM-YYYY (например, 20-10-2016 - 20-е октября 2016); время списания берётся от времени первоначального платежа. |