Інтеграція 1С-Бітрікс з платіжною системою Payme (Узбекистан)
Payme — найбільший платіжний агрегатор Узбекистану з понад 10 млн активних користувачів. Для інтернет-магазину, який працює з узбецькою аудиторією, відсутність Payme у списку способів оплати відчутно б'є по конверсії — мобільні покупці в Узбекистані звикли оплачувати через цей застосунок. Готового офіційного модуля для 1С-Бітрікс немає, інтеграція реалізується через кастомний JSON-RPC обробник за протоколом Subscribe API.
Як працює Subscribe API
Payme не перенаправляє покупця на сторонній сайт — натомість сервер Payme викликає методи JSON-RPC на вашому сервері. Магазин реалізує сервер, що приймає 6 методів:
| Метод | Призначення |
|---|---|
CheckPerformTransaction |
Перевірити існування замовлення та коректність суми |
CreateTransaction |
Зафіксувати початок платежу |
PerformTransaction |
Підтвердити успішну оплату |
CancelTransaction |
Обробити скасування |
CheckTransaction |
Повернути статус транзакції |
GetStatement |
Звірка транзакцій за період |
Реалізація сервера у Бітрікс
Точка входу — окремий PHP-файл local/api/payme.php:
<?php
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
header('Content-Type: application/json');
// Basic Auth — пароль має збігатися з ключем із кабінету Payme
$auth = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
preg_match('/Basic (.+)/', $auth, $m);
[, $password] = explode(':', base64_decode($m[1] ?? ''), 2);
if (!hash_equals(PAYME_CASHIER_KEY, $password)) {
echo json_encode(['error' => ['code' => -32504, 'message' => 'Auth failed']]);
exit;
}
$body = json_decode(file_get_contents('php://input'), true);
$method = $body['method'] ?? '';
$params = $body['params'] ?? [];
$id = $body['id'] ?? null;
if ($method === 'CheckPerformTransaction') {
$orderId = (int)($params['account']['order_id'] ?? 0);
$amount = (int)($params['amount'] ?? 0); // у тійінах
$order = Bitrix\Sale\Order::load($orderId);
if (!$order) {
echo json_encode(['error' => ['code' => -31050, 'message' => ['ru' => 'Замовлення не знайдено']], 'id' => $id]);
exit;
}
// Порівнюємо суму (ціни у магазині у UZS, помножені на 100)
$expected = (int)round($order->getPrice() * 100);
if ($expected !== $amount) {
echo json_encode(['error' => ['code' => -31001, 'message' => ['ru' => 'Сума не збігається']], 'id' => $id]);
exit;
}
echo json_encode(['result' => ['allow' => true], 'id' => $id]);
exit;
}
if ($method === 'PerformTransaction') {
$paymeId = $params['id'];
// Знайти платіж за payme_id та підтвердити
$payment = findPaymentByPaymeId($paymeId);
if ($payment && !$payment->isPaid()) {
$payment->setPaid('Y');
$payment->save();
}
echo json_encode(['result' => [
'transaction' => $paymeId,
'perform_time' => time() * 1000,
'state' => 2,
], 'id' => $id]);
exit;
}
Зберігання транзакцій
Payme вимагає ідемпотентності: повторний CreateTransaction із тим самим ID має повернути існуючу транзакцію. Потрібна окрема таблиця:
CREATE TABLE b_payme_transactions (
payme_id VARCHAR(64) PRIMARY KEY,
order_id INT NOT NULL,
amount BIGINT NOT NULL,
state TINYINT DEFAULT 1,
create_time BIGINT,
perform_time BIGINT DEFAULT 0,
cancel_time BIGINT DEFAULT 0,
reason TINYINT DEFAULT NULL
);
Стани транзакції: 1 — створено, 2 — виконано, -1/-2 — скасовано на різних етапах.
Валюта та перерахунок
Payme приймає лише узбецькі суми. Суму передавайте у тійінах (1 UZS = 100 тійінів). Якщо ціни у магазині у USD або EUR, потрібен перерахунок за курсом ЦБ РУ (рекомендується кешувати на 1 годину):
$amountTiyin = (int)round($orderPriceUsd * $uzsPerUsd * 100);
Тестування
Тестове середовище: https://checkout.test.paycom.uz/. Тестові ключі видаються окремо від бойових у кабінеті розробника. Перевірте всі 6 методів, особливо CancelTransaction на різних стадіях — залежно від того, чи вже було виконано PerformTransaction, повертаються різні значення state (-1 або -2).
Терміни
| Завдання | Термін |
|---|---|
| Розробка JSON-RPC сервера (всі 6 методів) | 2–3 дні |
| Інтеграція з модулем Sale Бітрікс | 1–2 дні |
| Тестування та передача в Payme на перевірку | 1–2 дні |
| Реєстрація магазину у Payme | 3–10 робочих днів |







