Как подключиться к Reptiloid P2P Gateway

Полное руководство по интеграции. От регистрации до первого платежа — без помощи поддержки.

Sandbox
Тестирование
Проверка
Production
1

Введение

Что такое Reptiloid P2P Gateway?

Reptiloid — это платёжный шлюз для приёма платежей через P2P-обмен. Ваши клиенты платят в рублях (переводом на карту, через СБП и другие методы), а вы получаете средства в USDT на баланс мерчанта.

Как это работает:

  1. Вы создаёте платёж через API — система находит трейдера
  2. Клиент получает реквизиты для оплаты (номер карты, СБП и т.д.)
  3. Клиент переводит деньги — трейдер подтверждает получение
  4. Вам начисляются USDT на баланс, вы получаете webhook-уведомление

Две среды работы

Система имеет две полностью изолированные среды:

🧪

Sandbox (тестовая)

Для разработки и тестирования. Тестовые ключи, тестовые платежи. Начинайте здесь.

https://sandbox.reptiloid.vg
🚀

Production (боевая)

Для реальных платежей. Боевые ключи, реальные деньги. Только после успешного тестирования.

https://reptiloid.vg
⚠️ Важно
Всегда начинайте с Sandbox. Переход в Production возможен только после полного тестирования всех сценариев. Не пропускайте этот этап!

Быстрая интеграция

REST API + HMAC-SHA256 подпись. Готовые примеры на Python, JS, PHP, curl.

🔒

Безопасность

API Key + Secret Key + подпись каждого запроса. HTTPS обязателен.

🔔

Webhook уведомления

Автоматические уведомления о статусе. 8 уровней retry. Подпись callback.

2

Шаг 1: Регистрация в Sandbox

Для начала работы зарегистрируйте аккаунт мерчанта в тестовой среде (Sandbox).

1

Откройте страницу регистрации

Перейдите по ссылке: https://sandbox.reptiloid.vg/merchant/register

2

Заполните форму

Укажите логин, email, название компании и пароль. Все поля обязательны.

3

Дождитесь одобрения

Администратор проверит заявку и активирует ваш аккаунт. В sandbox это обычно происходит быстро.

4

Войдите в личный кабинет

После одобрения войдите на https://sandbox.reptiloid.vg/auth с вашими данными.

💡 Подсказка
В Sandbox все платежи тестовые. Вы можете экспериментировать без риска. Данные между Sandbox и Production полностью изолированы.
3

Шаг 2: Получение API-ключей

Где найти ключи

После одобрения аккаунта вам будут выданы два ключа. Они доступны в личном кабинете мерчанта в разделе «Настройки» или «API».

Ключ Формат Назначение
API Key (публичный) pk_live_XXXXXX Передаётся в заголовке X-Api-Key каждого запроса
Secret Key (секретный) sk_live_XXXXXX Используется для генерации HMAC-SHA256 подписи. Никогда не передаётся в запросах!
Merchant ID merch_XXXXXX Ваш уникальный идентификатор в системе

Как использовать ключи

HTTP
POST /api/v1/invoice/create HTTP/1.1
Host: sandbox.reptiloid.vg
Content-Type: application/json
X-Api-Key: pk_live_ваш_api_ключ

{
  "merchant_id": "merch_ваш_id",
  "order_id": "order_001",
  "amount": 1000,
  "currency": "RUB",
  "callback_url": "https://your-site.com/webhook",
  "sign": "hmac_sha256_подпись"
}
🛑 Никогда не делайте это
• Не публикуйте Secret Key в клиентском коде (JavaScript на фронтенде)
• Не передавайте Secret Key в заголовках или параметрах запроса
• Не коммитьте ключи в Git-репозиторий
• Все запросы к API должны идти только с вашего бэкенда (сервер-сервер)
4

Шаг 3: Создание тестового платежа

Эндпоинт

POST /api/v1/invoice/create

Создаёт инвойс на оплату и возвращает ссылку для перенаправления клиента на страницу оплаты.

Параметры запроса (Body JSON)

Параметр Тип Обяз. Описание
merchant_idstring*Ваш ID мерчанта
order_idstring*Уникальный ID заказа в вашей системе
amountnumber*Сумма к оплате в рублях (мин. 100)
currencystringВалюта (по умолчанию «RUB»)
user_idstringID пользователя в вашей системе
callback_urlstring*URL для webhook уведомлений
descriptionstringОписание платежа
payment_methodstringМетод: card, sbp, sim, qr_code, mono_bank, sng_sbp, sng_card
signstring*HMAC-SHA256 подпись (см. раздел Безопасность)

Примеры кода

curl -X POST https://sandbox.reptiloid.vg/api/v1/invoice/create \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: pk_live_ваш_api_ключ" \
  -d '{
    "merchant_id": "merch_abc123",
    "order_id": "order_001",
    "amount": 1000,
    "currency": "RUB",
    "callback_url": "https://your-site.com/webhook",
    "description": "Оплата заказа #001",
    "sign": "вычисленная_hmac_подпись"
  }'
import requests
import hmac
import hashlib

API_KEY = "pk_live_ваш_api_ключ"
SECRET_KEY = "sk_live_ваш_секретный_ключ"
BASE_URL = "https://sandbox.reptiloid.vg"  # Для тестов

# === Генерация подписи ===
def generate_signature(data: dict, secret_key: str) -> str:
    SIGN_FIELDS = ['merchant_id', 'order_id', 'amount', 'currency',
                   'user_id', 'callback_url']

    sign_data = {}
    for k, v in data.items():
        if k not in SIGN_FIELDS or v is None:
            continue
        if isinstance(v, float) and v == int(v):
            v = int(v)
        sign_data[k] = v

    sorted_params = sorted(sign_data.items())
    sign_string = '&'.join(f"{k}={v}" for k, v in sorted_params)
    sign_string += secret_key

    return hmac.new(
        secret_key.encode('utf-8'),
        sign_string.encode('utf-8'),
        hashlib.sha256
    ).hexdigest()

# === Создание платежа ===
data = {
    "merchant_id": "merch_abc123",
    "order_id": "order_001",
    "amount": 1000,
    "currency": "RUB",
    "callback_url": "https://your-site.com/webhook",
    "description": "Оплата заказа #001"
}

data["sign"] = generate_signature(data, SECRET_KEY)

response = requests.post(
    f"{BASE_URL}/api/v1/invoice/create",
    json=data,
    headers={"X-Api-Key": API_KEY}
)

result = response.json()
print(result)

# Ответ:
# {
#   "status": "success",
#   "payment_id": "inv_20250315_A1B2C3D4",
#   "payment_url": "https://..../select-operator/inv_20250315_A1B2C3D4",
#   "details": {
#     "original_amount": 1000,
#     "total_amount": 1012,     # с маркером
#     "marker": 12,
#     "amount_usdt": 12.97,
#     "expires_at": "2025-03-15T13:30:00+00:00"
#   }
# }

# Перенаправьте клиента на payment_url
print(f"Ссылка для оплаты: {result['payment_url']}")
const crypto = require('crypto');
const axios = require('axios');

const API_KEY = 'pk_live_ваш_api_ключ';
const SECRET_KEY = 'sk_live_ваш_секретный_ключ';
const BASE_URL = 'https://sandbox.reptiloid.vg'; // Для тестов

// === Генерация подписи ===
function generateSignature(data, secretKey) {
  const SIGN_FIELDS = ['merchant_id', 'order_id', 'amount', 'currency',
                       'user_id', 'callback_url'];

  const signData = {};
  for (const [k, v] of Object.entries(data)) {
    if (!SIGN_FIELDS.includes(k) || v === null || v === undefined) continue;
    signData[k] = (typeof v === 'number' && v === Math.floor(v))
      ? Math.floor(v) : v;
  }

  const sorted = Object.entries(signData).sort(([a], [b]) => a.localeCompare(b));
  let signString = sorted.map(([k, v]) => `${k}=${v}`).join('&');
  signString += secretKey;

  return crypto.createHmac('sha256', secretKey)
    .update(signString, 'utf8')
    .digest('hex');
}

// === Создание платежа ===
async function createPayment() {
  const data = {
    merchant_id: 'merch_abc123',
    order_id: 'order_001',
    amount: 1000,
    currency: 'RUB',
    callback_url: 'https://your-site.com/webhook',
    description: 'Оплата заказа #001'
  };

  data.sign = generateSignature(data, SECRET_KEY);

  const response = await axios.post(
    `${BASE_URL}/api/v1/invoice/create`,
    data,
    { headers: { 'X-Api-Key': API_KEY } }
  );

  console.log(response.data);
  // Перенаправьте клиента на response.data.payment_url
}

createPayment();
<?php
$apiKey = 'pk_live_ваш_api_ключ';
$secretKey = 'sk_live_ваш_секретный_ключ';
$baseUrl = 'https://sandbox.reptiloid.vg'; // Для тестов

// === Генерация подписи ===
function generateSignature(array $data, string $secretKey): string {
    $signFields = ['merchant_id', 'order_id', 'amount', 'currency',
                   'user_id', 'callback_url'];

    $signData = [];
    foreach ($data as $k => $v) {
        if (!in_array($k, $signFields) || $v === null) continue;
        if (is_float($v) && $v == intval($v)) $v = intval($v);
        $signData[$k] = $v;
    }

    ksort($signData);
    $signString = http_build_query($signData, '', '&');
    $signString .= $secretKey;

    return hash_hmac('sha256', $signString, $secretKey);
}

// === Создание платежа ===
$data = [
    'merchant_id' => 'merch_abc123',
    'order_id' => 'order_001',
    'amount' => 1000,
    'currency' => 'RUB',
    'callback_url' => 'https://your-site.com/webhook',
    'description' => 'Оплата заказа #001'
];

$data['sign'] = generateSignature($data, $secretKey);

$ch = curl_init("$baseUrl/api/v1/invoice/create");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        "X-Api-Key: $apiKey"
    ],
    CURLOPT_RETURNTRANSFER => true,
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);

echo "Payment URL: " . $response['payment_url'];
?>

Ответ сервера

{
  "status": "success",
  "payment_id": "inv_20250315_A1B2C3D4",
  "payment_url": "https://secure-payments.st/select-operator/inv_20250315_A1B2C3D4",
  "details": {
    "type": "waiting",
    "message": "Ожидание реквизитов. Откройте страницу оплаты.",
    "original_amount": 1000,
    "total_amount": 1012,
    "marker": 12,
    "amount_usdt": 12.97,
    "expires_at": "2025-03-15T13:30:00+00:00"
  }
}
💰 Маркер суммы
Система добавляет маркер (5-20 руб.) к сумме для идентификации платежа. total_amount = amount + marker. Клиент должен перевести именно total_amount.

Проверка статуса платежа

GET /api/v1/invoice/status?order_id=order_001

# Проверка по order_id
response = requests.get(
    f"{BASE_URL}/api/v1/invoice/status",
    params={"order_id": "order_001"},
    headers={"X-Api-Key": API_KEY}
)

# Или по payment_id
response = requests.get(
    f"{BASE_URL}/api/v1/invoice/status",
    params={"payment_id": "inv_20250315_A1B2C3D4"},
    headers={"X-Api-Key": API_KEY}
)

Статусы платежа

СтатусОписание
waiting_requisitesОжидание выбора метода оплаты
pendingОжидает оплаты клиентом
paidКлиент отметил оплату, ожидает подтверждения трейдера
completedПлатёж завершён, USDT зачислен
expiredПлатёж истёк (не оплачен вовремя)
cancelledПлатёж отменён
disputedОткрыт спор по платежу
5

Шаг 4: Настройка Webhook

Что такое Webhook?

Webhook — это автоматическое HTTP-уведомление (POST-запрос), которое система отправляет на ваш сервер при изменении статуса платежа. Это основной способ получения информации о результате оплаты.

Как указать URL: передайте callback_url при создании платежа. На этот URL будут приходить все уведомления по данному платежу.

Какие события приходят

СтатусКогда приходитДополнительные поля
pendingНайден трейдер, клиенту показаны реквизиты
paidКлиент отметил что оплатил
completedТрейдер подтвердил получение средствБухгалтерские данные (см. ниже)
expiredПлатёж истёкreason, expired_at
cancelledПлатёж отменёнreason, cancelled_at
disputedОткрыт спорreason, disputed_at, disputed_by

Формат Webhook (пример для completed)

// POST на ваш callback_url
// Content-Type: application/json
// Все временные метки в московском времени (UTC+3)
{
  "order_id": "DEMO_123",
  "payment_id": "inv_20260320_A1B2C3D4",
  "status": "completed",
  "amount": 2000,                    // сумма запроса (= original_amount_rub)
  "amount_usdt": 23.45,              // общая сумма сделки (USDT)

  // === Бухгалтерские данные (только для completed) ===
  "original_amount_rub": 2000,       // сумма, которую запросил мерчант (RUB)
  "client_paid_rub": 2298,           // сколько клиент фактически заплатил (RUB)
  "merchant_received_usdt": 18.61,   // чистая сумма мерчанту (USDT)
  "merchant_received_rub": 1600,     // чистая сумма мерчанту (RUB)
  "commission_percent": 20,          // процент комиссии
  "commission_usdt": 4.84,           // комиссия (USDT)
  "commission_rub": 400,             // комиссия (RUB)
  "base_rate": 85.3,                 // базовый курс платформы из payout_settings (USDT/RUB)
  "trader_rate": 98,                 // курс трейдера (USDT/RUB)
  "trade_id": "trd_abc12345",
  "completed_at": "2026-03-20T07:12:01+03:00",
  "timestamp": "2026-03-20T07:12:01+03:00",
  "sign": "a1b2c3d4e5f6..."
}
📋 Примечания
• Бухгалтерские поля (original_amount_rub, client_paid_rub, merchant_received_*, commission_*, base_rate, trader_rate) присутствуют только в статусе completed
• Все временные метки в московском времени (UTC+3)
amount = original_amount_rub — сумма, запрошенная мерчантом
client_paid_rub — фактическая сумма от клиента (включая маркер)
base_rate — базовый курс платформы из payout_settings (Rapira)
trader_rate — курс трейдера, по которому клиент фактически платит

Обработка Webhook (пример)

import hmac, hashlib
from flask import Flask, request, jsonify

app = Flask(__name__)
SECRET_KEY = "sk_live_ваш_секретный_ключ"

def verify_webhook(payload: dict, secret_key: str) -> bool:
    """Проверка HMAC-подписи webhook"""
    SIGN_FIELDS = ['order_id', 'payment_id', 'status',
                   'amount', 'amount_usdt', 'timestamp']

    provided_sign = payload.get("sign", "")

    sign_data = {}
    for k, v in payload.items():
        if k not in SIGN_FIELDS or k == 'sign' or v is None:
            continue
        if isinstance(v, float) and v == int(v):
            v = int(v)
        sign_data[k] = v

    sorted_params = sorted(sign_data.items())
    sign_string = '&'.join(f"{k}={v}" for k, v in sorted_params)
    sign_string += secret_key

    expected_sign = hmac.new(
        secret_key.encode('utf-8'),
        sign_string.encode('utf-8'),
        hashlib.sha256
    ).hexdigest()

    return hmac.compare_digest(expected_sign, provided_sign)

@app.route('/webhook', methods=['POST'])
def handle_webhook():
    payload = request.json

    # 1. Проверяем подпись
    if not verify_webhook(payload, SECRET_KEY):
        return jsonify({"status": "error"}), 403

    # 2. Обрабатываем статус
    status = payload["status"]
    order_id = payload["order_id"]

    if status == "completed":
        amount = payload["amount"]
        amount_usdt = payload["amount_usdt"]
        # Зачислить средства пользователю
        print(f"Заказ {order_id} оплачен: {amount} RUB / {amount_usdt} USDT")
        # credit_user(order_id, amount)

    elif status == "expired":
        print(f"Заказ {order_id} истёк")

    elif status == "cancelled":
        print(f"Заказ {order_id} отменён")

    # 3. Обязательно вернуть {"status": "ok"} и HTTP 200
    return jsonify({"status": "ok"})
const express = require('express');
const crypto = require('crypto');
const app = express();

app.use(express.json());

const SECRET_KEY = 'sk_live_ваш_секретный_ключ';

function verifyWebhook(payload, secretKey) {
  const SIGN_FIELDS = ['order_id', 'payment_id', 'status',
                       'amount', 'amount_usdt', 'timestamp'];

  const providedSign = payload.sign || '';
  const signData = {};

  for (const [k, v] of Object.entries(payload)) {
    if (!SIGN_FIELDS.includes(k) || k === 'sign' || v == null) continue;
    signData[k] = (typeof v === 'number' && v === Math.floor(v))
      ? Math.floor(v) : v;
  }

  const sorted = Object.entries(signData).sort(([a], [b]) => a.localeCompare(b));
  let signString = sorted.map(([k, v]) => `${k}=${v}`).join('&');
  signString += secretKey;

  const expectedSign = crypto.createHmac('sha256', secretKey)
    .update(signString, 'utf8')
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(expectedSign), Buffer.from(providedSign)
  );
}

app.post('/webhook', (req, res) => {
  const payload = req.body;

  if (!verifyWebhook(payload, SECRET_KEY)) {
    return res.status(403).json({ status: 'error' });
  }

  if (payload.status === 'completed') {
    console.log(`Заказ ${payload.order_id} оплачен: ${payload.amount} RUB`);
    // creditUser(payload.order_id, payload.amount);
  }

  res.json({ status: 'ok' });
});

app.listen(3000);
<?php
$secretKey = 'sk_live_ваш_секретный_ключ';
$payload = json_decode(file_get_contents('php://input'), true);

// Проверка подписи
$signFields = ['order_id', 'payment_id', 'status',
               'amount', 'amount_usdt', 'timestamp'];

$signData = [];
foreach ($payload as $k => $v) {
    if (!in_array($k, $signFields) || $k === 'sign' || $v === null) continue;
    if (is_float($v) && $v == intval($v)) $v = intval($v);
    $signData[$k] = $v;
}

ksort($signData);
$signString = http_build_query($signData, '', '&') . $secretKey;
$expectedSign = hash_hmac('sha256', $signString, $secretKey);

if (!hash_equals($expectedSign, $payload['sign'] ?? '')) {
    http_response_code(403);
    echo json_encode(['status' => 'error']);
    exit;
}

// Обработка
if ($payload['status'] === 'completed') {
    // Зачислить средства
    error_log("Заказ {$payload['order_id']} оплачен: {$payload['amount']} RUB");
}

echo json_encode(['status' => 'ok']);
?>

Политика повторных попыток

Ваш сервер должен вернуть HTTP 200 с {"status": "ok"}. Если ответ не получен, система повторяет отправку:

ПопыткаЗадержка
11 минута
25 минут
315 минут
41 час
52 часа
64 часа
712 часов
8 (последняя)24 часа
💡 Рекомендация
Не полагайтесь только на webhook. Для критичных платежей периодически опрашивайте GET /api/v1/invoice/status в качестве fallback.
6

Шаг 5: Полное тестирование

Чек-лист тестирования

Перед переходом в Production вы обязаны протестировать все сценарии в Sandbox:

  • Создание платежа — вызовите POST /create, убедитесь что получаете payment_url
  • Проверка статуса — вызовите GET /status, убедитесь что получаете актуальный статус
  • Получение webhook — убедитесь что ваш сервер получает POST-запрос на callback_url
  • Проверка подписи — убедитесь что sign в webhook проходит верификацию на вашей стороне
  • Корректность данных — проверьте что order_id, amount, status совпадают с ожидаемыми
  • Обработка expired — проверьте как ваша система реагирует на истёкший платёж
  • Обработка cancelled — проверьте отмену платежа
  • Обработка disputed — проверьте открытие спора
  • Дублирование webhook — убедитесь что повторный webhook не приводит к двойному зачислению
⚠️ Обязательно
Перед переходом в Production необходимо полностью протестировать все сценарии. Пропуск тестирования может привести к потере средств.
7

Демо-магазин

🏫 Демонстрационный магазин

Мы предоставляем готовый демо-магазин, который наглядно показывает весь процесс интеграции. Это лучший способ понять, как работает система, прежде чем писать собственный код.

Открыть демо-магазин →

Что можно сделать в демо-магазине

💳

Создать тестовый платёж

Введите сумму и создайте платёж прямо через интерфейс. Увидите API-запрос и ответ.

🔄

Пройти полный цикл

Создание → оплата → подтверждение → зачисление. Весь путь от начала до конца.

🔔

Увидеть Webhook

Демо-магазин показывает все полученные webhook-уведомления в реальном времени с полным payload.

Как использовать

1

Откройте демо-магазин

Перейдите на sandbox.reptiloid.vg/demo-shop

2

Введите ваш API Key

Вставьте ваш тестовый pk_live_... ключ для привязки к мерчанту

3

Создайте платёж

Укажите сумму и нажмите «Создать». Система покажет ссылку для оплаты.

4

Наблюдайте за webhook-ами

В разделе «История webhook» отображаются все уведомления с полным payload включая бухгалтерские данные.

💡 Совет
Используйте демо-магазин для отладки webhook-обработчика. Сравните payload из демо-магазина с тем, что получает ваш сервер, чтобы убедиться в корректности обработки.
8

Типичные ошибки

Ошибки при интеграции и их решения

INVALID_API_KEY (401)

Причина: неверный или отсутствующий API ключ в заголовке X-Api-Key

Решение: проверьте что ключ скопирован полностью, без пробелов. Убедитесь что используете ключ от правильной среды (sandbox / production).

INVALID_SIGNATURE (400)

Причина: HMAC-подпись не совпадает с ожидаемой

Решение:
• Проверьте что Secret Key правильный
• Проверьте порядок полей (должны быть отсортированы по алфавиту)
• Проверьте что float значения без дробной части конвертируются в int (1000.0 → 1000)
• Проверьте что Secret Key добавляется в конец строки (без &)

Не приходит Webhook

Возможные причины:

callback_url недоступен из интернета (проверьте файрвол)
• Сервер возвращает не HTTP 200 (проверьте логи)
• Сервер отвечает, но не {"status": "ok"} (будут retry)
• HTTPS сертификат невалидный на вашем callback URL
• Таймаут ответа (сервер думает дольше 10 секунд)

DUPLICATE_ORDER_ID (400)

Причина: заказ с таким order_id уже существует

Решение: каждый order_id должен быть уникальным. Используйте UUID или инкрементальные ID из вашей системы.

MERCHANT_MISMATCH (400)

Причина: merchant_id в теле запроса не соответствует API ключу

Решение: убедитесь что merchant_id и X-Api-Key принадлежат одному и тому же мерчанту.

INVALID_AMOUNT (400)

Причина: сумма меньше минимальной

Решение: минимальная сумма платежа — 100 RUB. Проверьте что amount ≥ 100.

Все коды ошибок API

HTTPКодОписание
401INVALID_API_KEYНеверный API ключ
400INVALID_SIGNATUREНеверная HMAC подпись
400MERCHANT_MISMATCHMerchant ID не соответствует API ключу
403MERCHANT_TRAFFIC_DISABLEDТрафик мерчанта отключён
400DUPLICATE_ORDER_IDЗаказ с таким order_id уже существует
400INVALID_AMOUNTСумма меньше минимальной (100 RUB)
400INVALID_PAYMENT_METHODНедопустимый метод оплаты
400MISSING_IDENTIFIERНе указан order_id или payment_id
404NOT_FOUNDПлатёж не найден
400ALREADY_DISPUTEDСпор уже открыт
429RATE_LIMIT_EXCEEDEDПревышен лимит запросов
9

Безопасность

Проверка HMAC-подписи

Каждый запрос к API и каждый входящий webhook подписаны HMAC-SHA256. Это гарантирует что запрос не был подделан.

Алгоритм создания подписи для запросов:

1

Берём поля для подписи

merchant_id, order_id, amount, currency, user_id, callback_url

2

Убираем null-значения

Поля со значением null или undefined исключаются

3

Сортируем по ключу (алфавит)

Результат: amount=1000&callback_url=...¤cy=RUB&merchant_id=...&order_id=...

4

Добавляем Secret Key в конец

...&order_id=order_001sk_live_ваш_секрет (без разделителя &)

5

Вычисляем HMAC-SHA256

Ключ — secret_key, сообщение — полученная строка. Результат — 64-символьный hex.

Поля для подписи Webhook (входящего):

order_id, payment_id, status, amount, amount_usdt, timestamp

Правила хранения ключей

✅ Правильно

  • Хранить в переменных окружения (.env)
  • Использовать vault / secrets manager
  • Ограничить доступ к ключам
  • Ротировать ключи при утечке

❌ Неправильно

  • Хардкодить в исходном коде
  • Коммитить в Git-репозиторий
  • Использовать на фронтенде
  • Передавать в URL или логах

HTTPS обязателен

Все запросы к API и callback URL должны использовать HTTPS. HTTP-запросы будут отклонены. Убедитесь что ваш callback_url имеет валидный SSL-сертификат.

10

Переход в Production

Пошаговый план перехода

1

Завершите тестирование в Sandbox

Убедитесь что все сценарии из чек-листа (раздел 6) пройдены успешно.

2

Свяжитесь с администратором

Запросите перевод в Production. Администратор проверит вашу интеграцию и создаст боевой аккаунт.

3

Получите Production-ключи

Вам будут выданы новые pk_live_... и sk_live_... ключи для боевой среды.

4

Переключите Base URL

Замените в вашем коде:

// Было (sandbox):
BASE_URL = "https://sandbox.reptiloid.vg"

// Стало (production):
BASE_URL = "https://reptiloid.vg"
5

Замените API-ключи

Обновите API_KEY и SECRET_KEY на production-версии.

6

Проведите первый реальный платёж

Сделайте тестовый платёж на минимальную сумму (100 RUB) чтобы убедиться что всё работает.

⚠️ Внимание
В Production используются реальные деньги. Убедитесь на 100% что ваша интеграция работает корректно, прежде чем начинать принимать платежи от клиентов.
11

URL среды

Sandbox
https://sandbox.reptiloid.vg
Тестовая среда. Регистрация, разработка, отладка.
Production
https://reptiloid.vg
Боевая среда. Реальные платежи, реальные деньги.
Docs
https://docs.reptiloid.vg
Документация (вы здесь).

API Base URLs

СредаBase URLПример
Sandbox https://sandbox.reptiloid.vg/api/v1/invoice POST .../invoice/create
Production https://reptiloid.vg/api/v1/invoice POST .../invoice/create
1. Sandbox — тестируем
2. Проверяем все сценарии
3. Связываемся с админом
4. Production!

Reptiloid P2P Gateway — Документация v2.0

Sandbox · Production · Docs