ℹ️
Заголовки callback запросов:
Content-Type: application/json
User-Agent: Platix-Callback/1.0

Структура PayIn callback

json
{
  "id": "e42e0768-d913-4b4b-8708-f94cfeaf0777",
  "externalID": "test_merchant_id_1",
  "trackerID": "e42e0768-d913-4b4b-8708-f94cfeaf0777",
  "status": "COMPLETED",
  "amount": "1000",
  "commission": "100",
  "currency": "RUB",
  "bank": "Озон Банк (OZON)",
  "method": "CARD",
  "receiver": "2200154965960000",
  "holder": "Иванов Иван Иванович",
  "description": "Тестовая транзакция",
  "timestamp": "2024-01-01T12:00:00Z"
}

Структура PayOut callback

json
{
  "id": "f5ef6b73-0952-4602-a306-82ef1f755f85",
  "externalID": "test_merchant_id_2",
  "trackerId": "f5ef6b73-0952-4602-a306-82ef1f755f85",
  "status": "COMPLETED",
  "amount": "5000",
  "commission": "355",
  "currency": "RUB",
  "bank": "Озон Банк (OZON)",
  "method": "CARD",
  "receiver": "4000000000000000",
  "holder": "Иванов Иван Иванович",
  "description": "Тестовая транзакция",
  "timestamp": "2024-01-01T12:00:00Z"
}

Параметры callback

ПараметрТипОписание
externalIDstringВаш уникальный ID транзакции
trackerIdstringОпциональный ID для отслеживания
statusstringНовый статус транзакции
amountstringСумма транзакции
commissionstringКомиссия
currencystringВалюта транзакции
bankstringБанк
methodstringМетод платежа/выплаты
receiverstringРеквизиты получателя
holderstringИмя держателя карты
descriptionstringОписание транзакции
timestampstring (ISO 8601)Время изменения статуса

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

🛡️Проверка IPОграничьте доступ к callback URL только с IP-адресов Platix
🔒HTTPSИспользуйте только защищённые HTTPS URL для callback
ВалидацияПроверяйте корректность полученных данных
🔁ИдемпотентностьКорректно обрабатывайте дублирующиеся уведомления
⏱️ТаймаутОтвечайте на callback запросы в течение 30 секунд
🔄
Повторные попытки: В случае ошибки система выполнит до 3 повторных попыток. Ваш сервер должен отвечать HTTP 200 для подтверждения получения.

Обработка callback

Node.js / Express
javascript
const express = require('express');
const app = express();
app.use(express.json());

app.post('/callback', (req, res) => {
  const { externalID, status, amount, currency, method, timestamp } = req.body;
  
  if (!externalID || !status) {
    return res.status(400).json({ error: 'Invalid data' });
  }
  
  // Обновляем статус в вашей системе
  updateTransactionStatus(externalID, status);
  
  // Обязательно отвечаем 200
  res.status(200).send('OK');
});

app.listen(3000);
PHP
php
<?php
$input = file_get_contents('php://input');
$data = json_decode($input, true);

if ($data && isset($data['externalID'], $data['status'])) {
    updateTransactionStatus($data['externalID'], $data['status']);
    http_response_code(200);
    echo 'OK';
} else {
    http_response_code(400);
    echo 'Invalid data';
}
?>
Python / Flask
python
from flask import Flask, request

app = Flask(__name__)

@app.route('/callback', methods=['POST'])
def callback():
    data = request.get_json()
    if data and 'externalID' in data and 'status' in data:
        update_transaction_status(data['externalID'], data['status'])
        return 'OK', 200
    return 'Invalid data', 400

if __name__ == '__main__':
    app.run(port=3000)