Интеграция 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 рабочих дней |







