Интеграция 1С-Битрикс с платежной системой Payme (Узбекистан)

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с платежной системой Payme (Узбекистан)
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

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