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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс із платіжною системою Payme (Узбекистан)
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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