Документация API
1. Создание магазина
Укажите только название и URL проекта. Весь процесс обычно занимает не более 5 минут. Еще необходимо, чтобы проект соответствовал требованиям системы.
2. Настройка магазина
Проведите настройку магазина, включите способы оплаты.
Публичный ключ - используется для формирования подписи в форме оплаты.
Секретный ключ - используется для формирования подписи в скрипте оповещения.
URL оповещения - страница Вашего сайта, на который будут отправлены данные с информацией о платеже. Метод отправки: POST.
Успешный URL - страница Вашего сайта, на которую будет перенаправлен пользователь после успешной оплаты (мы передаем параметр `label`, GET-запросом).
Неудачный URL - страница Вашего сайта, на которую будет перенаправлен пользователь в случае неудачной оплаты.
3. Настройка формы оплаты (формирование ссылки)
Пример формы оплаты на HTML (подставьте значения: номер магазина, публичный ключ):
<form method="POST" action="https://amarapay.ru/oplata/index.php"> <input type="hidden" name="shopid" value="ВАШ_НОМЕР_МАГАЗИНА"> <input type="hidden" name="pub_key" value="ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ"> <input type="text" name="label" placeholder="Номер заказа или ID пользователя" required> <input type="text" name="summa" placeholder="Сумма" required> <button type="submit" name="create">Оплатить</button> </form>
Пример формирования ссылки на оплату с PHP:
<?php
$shop_id = 1; // ID Вашего магазина
$label = 'nickname_or_email'; // Номер заказа, логин пользователя и т.д.
$amount = 100; // Сумма платежа (от 1 до 15000 рублей)
$public_key = 'ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ'; // Публичный ключ из настроек магазина
// Формирование хеша для подписи платежа
$hash = hash('sha256', $shop_id . $amount . $public_key . $label);
$link = "https://amarapay.ru/merchant?" .
"shop_id=" . urlencode($shop_id) .
"&amount=" . urlencode($amount) .
"&label=" . urlencode($label) .
"&hash=" . urlencode($hash);
// Перенаправление пользователя на страницу оплаты
header("Location: $link");
exit(); // Важно завершить выполнение скрипта после перенаправления
?>
- shop_id - ID Вашего магазина
- amount - Сумма платежа (от 1 рубля до 15000 рублей)
- label - Номер заказа (также это может быть название товара или логин пользователя, для зачисления средств)
- public_key - Публичный ключ из настроек магазина
- hash - Цифровая подпись системы
ВАЖНО! Для создания ссылки на оплату должна быть сгенерирована подпись, с её помощью подделать данные платежа невозможно.
Подпись шифруется методом sha256 и содержит в себе:
- ID магазина
- Сумму
- Публичный ключ
- Передаваемый параметр `label`
После создания ссылки на оплату, при переходе на неё будут доступны способы оплаты:
4. Оповещение о платеже на ваш сайт (серверное уведомление)
Пример обработчика POST-уведомления от AmaraPay:
<?php
// Секретный ключ из настроек вашего магазина
// НИКОГДА не выставляйте этот ключ публично!
$secret_key = 'ВАШ_СЕКРЕТНЫЙ_КЛЮЧ';
// Получаем данные из POST-запроса
$transaction_id = $_POST['id'] ?? null; // Номер платежа в системе Amarapay
$label = $_POST['label'] ?? null; // Номер или название заказа в вашей системе
$payment_date = $_POST['time'] ?? null; // Дата и время платежа
$shop_id = $_POST['shop_id'] ?? null; // Номер магазина в AmaraPay
$amount = $_POST['amount'] ?? null; // Сумма платежа
$received_hash = $_POST['hash'] ?? null; // Подпись (HASH sha256), полученная от AmaraPay
// Проверка наличия всех обязательных параметров
if (is_null($transaction_id) || is_null($label) || is_null($shop_id) || is_null($amount) || is_null($received_hash)) {
die('ERROR: Missing parameters');
}
// Формирование хеша для проверки подлинности уведомления
// Обратите внимание: порядок параметров в хеше должен соответствовать спецификации AmaraPay
$check_hash = hash('sha256', $shop_id . $amount . $secret_key . $transaction_id);
// Проверка подписи
if ($received_hash !== $check_hash) {
// Если хеши не совпадают, это может быть поддельный запрос
// Логируйте эту ошибку для дальнейшего анализа
error_log("Amarapay webhook: Invalid hash for transaction ID {$transaction_id}. Received: {$received_hash}, Expected: {$check_hash}");
die('ERROR: Invalid hash');
}
// --- Оплата прошла успешно, далее ваш код обработки платежа ---
// Например, обновить статус заказа в вашей базе данных, выдать товар/услугу и т.д.
//
// Пример:
// require_once 'db_connect.php'; // Подключение к базе данных
// $stmt = $pdo->prepare("UPDATE orders SET status = 'paid', payment_id = ?, payment_date = ? WHERE label = ? AND amount = ?");
// $stmt->execute([$transaction_id, $payment_date, $label, $amount]);
//
// if ($stmt->rowCount() > 0) {
// // Успешно обновили заказ
// // Можно отправить уведомление пользователю
// } else {
// // Заказ не найден или уже обновлен
// error_log("Amarapay webhook: Could not update order for label {$label}, transaction ID {$transaction_id}");
// }
// Важно: всегда возвращать "200" для подтверждения успешного получения уведомления
die('200');
?>
Мы передаем на ваш сайт POST уведомление, в котором:
- id - номер платежа в системе Amarapay
- label - номер или название заказа в вашей системе
- shop_id - номер магазина в AmaraPay
- amount - сумма платежа
- hash - подпись (HASH sha256)
ВАЖНО! Сервис AmaraPay передает подпись (HASH), для безопасности платежа.
Подпись шифруется методом sha256 и содержит в себе:
- ID магазина
- Сумму
- Секретный ключ
- ID транзакции AmaraPay
5. Пример подключения Telegram бота на PHP с MySQL
Этот пример покажет, как интегрировать платежи AmaraPay в вашего Telegram бота. Пользователи смогут оплачивать товары или услуги прямо через бота, а бот будет автоматически обновлять статус заказа в базе данных и уведомлять пользователя после успешной оплаты.
Предварительные требования:
- Созданный Telegram бот через BotFather. У вас должен быть токен бота.
- Хостинг с PHP и доступом к MySQL.
- Установленный cURL на сервере (обычно установлен по умолчанию).
- Магазин AmaraPay с настроенными публичным и секретным ключами, а также URL оповещения.
Структура файлов проекта:
your_bot_directory/ ├── config.php <!-- Конфигурация базы данных, токенов и ключей AmaraPay --> ├── db_connect.php <!-- Файл для подключения к базе данных --> ├── telegram_api.php <!-- Вспомогательные функции для работы с Telegram API --> ├── webhook.php <!-- Основной скрипт для обработки входящих обновлений от Telegram --> └── amarapay_webhook.php <!-- Скрипт-обработчик уведомлений от AmaraPay об успешной оплате -->
Шаг 1: Настройка базы данных (MySQL)
Создайте следующую структуру таблиц в вашей базе данных:
CREATE TABLE `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`telegram_user_id` BIGINT UNIQUE NOT NULL,
`first_name` VARCHAR(255),
`last_name` VARCHAR(255),
`username` VARCHAR(255),
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `payments` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` BIGINT NOT NULL, <!-- telegram_user_id -->
`amarapay_transaction_id` VARCHAR(255) UNIQUE NULL, <!-- ID транзакции в AmaraPay -->
`label` VARCHAR(255) UNIQUE NOT NULL, <!-- Уникальный ID платежа в вашей системе (например, order_ID) -->
`amount` DECIMAL(10, 2) NOT NULL,
`currency` VARCHAR(3) DEFAULT 'RUB',
`status` ENUM('pending', 'paid', 'failed', 'cancelled') DEFAULT 'pending',
`payment_url` TEXT NULL, <!-- Ссылка на оплату -->
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX (`user_id`),
INDEX (`label`),
FOREIGN KEY (`user_id`) REFERENCES `users`(`telegram_user_id`) ON DELETE CASCADE ON UPDATE CASCADE
);
Шаг 2: Файл конфигурации (`config.php`)
Создайте файл `config.php` и заполните его вашими данными. Не забудьте указать полные URL для вебхуков!
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'your_database_name');
define('DB_USER', 'your_database_user');
define('DB_PASS', 'your_database_password');
define('TELEGRAM_BOT_TOKEN', 'ВАШ_ТОКЕН_ТЕЛЕГРАМ_БОТА'); // Получите его у BotFather
define('AMARAPAY_SHOP_ID', 'ВАШ_НОМЕР_МАГАЗИНА'); // ID вашего магазина AmaraPay
define('AMARAPAY_PUBLIC_KEY', 'ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ'); // Публичный ключ AmaraPay
define('AMARAPAY_SECRET_KEY', 'ВАШ_СЕКРЕТНЫЙ_КЛЮЧ'); // Секретный ключ AmaraPay
// Полный URL до файла webhook.php на вашем сервере
define('TELEGRAM_WEBHOOK_URL', 'https://ваш-домен.ru/your_bot_directory/webhook.php');
// Полный URL до файла amarapay_webhook.php на вашем сервере
// Этот URL нужно будет указать в настройках магазина AmaraPay как "URL оповещения"
define('AMARAPAY_NOTIFICATION_URL', 'https://ваш-домен.ru/your_bot_directory/amarapay_webhook.php');
// URL страницы успешной оплаты (куда перенаправит AmaraPay)
define('AMARAPAY_SUCCESS_URL', 'https://ваш-домен.ru/success_payment.php');
// URL страницы неудачной оплаты
define('AMARAPAY_FAIL_URL', 'https://ваш-домен.ru/fail_payment.php');
// Базовый URL AmaraPay для формирования ссылок на оплату
define('AMARAPAY_MERCHANT_URL', 'https://amarapay.ru/merchant');
?>
Шаг 3: Подключение к базе данных (`db_connect.php`)
<?php
require_once 'config.php';
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
} catch (PDOException $e) {
die("Ошибка подключения к базе данных: " . $e->getMessage());
}
?>
Шаг 4: Вспомогательные функции Telegram API (`telegram_api.php`)
<?php
require_once 'config.php';
function telegram_api_request(string $method, array $params = []): array
{
$url = "https://api.telegram.org/bot" . TELEGRAM_BOT_TOKEN . "/" . $method;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
error_log("Telegram API error ({$method}): " . $error);
return ['ok' => false, 'description' => $error];
}
return json_decode($response, true);
}
function send_telegram_message(int $chat_id, string $text, array $reply_markup = []): array
{
$params = [
'chat_id' => $chat_id,
'text' => $text,
'parse_mode' => 'HTML',
];
if (!empty($reply_markup)) {
$params['reply_markup'] = json_encode($reply_markup);
}
return telegram_api_request('sendMessage', $params);
}
function set_telegram_webhook(string $url): array
{
return telegram_api_request('setWebhook', ['url' => $url]);
}
?>
Шаг 5: Основной обработчик бота (`webhook.php`)
Этот скрипт будет получать все обновления от Telegram. Его нужно будет установить как вебхук для вашего бота.
<?php
require_once 'config.php';
require_once 'db_connect.php';
require_once 'telegram_api.php';
// Получаем входящие данные от Telegram
$update = json_decode(file_get_contents('php://input'), true);
if (!$update) {
// Если нет данных, просто выходим
exit('No update data.');
}
// Извлекаем информацию о сообщении
$message = $update['message'] ?? null;
if (!$message) {
exit('No message data.');
}
$chat_id = $message['chat']['id'];
$user_id = $message['from']['id'];
$text = $message['text'] ?? '';
$first_name = $message['from']['first_name'] ?? '';
$last_name = $message['from']['last_name'] ?? '';
$username = $message['from']['username'] ?? '';
// Логирование для отладки
error_log("Received message from {$user_id} in chat {$chat_id}: {$text}");
// Сохраняем/обновляем пользователя в БД
$stmt = $pdo->prepare("INSERT INTO users (telegram_user_id, first_name, last_name, username) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE first_name = VALUES(first_name), last_name = VALUES(last_name), username = VALUES(username)");
$stmt->execute([$user_id, $first_name, $last_name, $username]);
// Обработка команд
switch ($text) {
case '/start':
send_telegram_message($chat_id, "Привет, {$first_name}! Я бот для приема платежей через AmaraPay. Используйте /pay, чтобы совершить тестовый платеж.");
break;
case '/pay':
// Пример: создаем новый платеж на 100 рублей
$amount = 100.00;
$order_label = 'order_' . $user_id . '_' . time(); // Уникальный ID заказа/платежа
// Сохраняем информацию о платеже в БД со статусом 'pending'
$stmt = $pdo->prepare("INSERT INTO payments (user_id, label, amount, status) VALUES (?, ?, ?, 'pending')");
$stmt->execute([$user_id, $order_label, $amount]);
// Формирование хеша для подписи платежа
$hash = hash('sha256', AMARAPAY_SHOP_ID . $amount . AMARAPAY_PUBLIC_KEY . $order_label);
// Формирование ссылки на оплату AmaraPay
$payment_link = AMARAPAY_MERCHANT_URL .
"?shop_id=" . urlencode(AMARAPAY_SHOP_ID) .
"&amount=" . urlencode($amount) .
"&label=" . urlencode($order_label) .
"&hash=" . urlencode($hash) .
"&success_url=" . urlencode(AMARAPAY_SUCCESS_URL) . // Опционально
"&fail_url=" . urlencode(AMARAPAY_FAIL_URL); // Опционально
// Обновляем payment_url в БД
$stmt = $pdo->prepare("UPDATE payments SET payment_url = ? WHERE label = ?");
$stmt->execute([$payment_link, $order_label]);
// Отправляем ссылку пользователю
$keyboard = [
'inline_keyboard' => [
[['text' => "Оплатить {$amount} RUB", 'url' => $payment_link]]
]
];
send_telegram_message($chat_id, "Для оплаты {$amount} RUB используйте ссылку ниже:", $keyboard);
break;
default:
send_telegram_message($chat_id, "Неизвестная команда. Попробуйте /start или /pay.");
break;
}
// Установка вебхука (выполнить один раз, например, вручную или при первом запуске)
// Можно закомментировать после первой успешной установки
// $webhook_status = set_telegram_webhook(TELEGRAM_WEBHOOK_URL);
// if ($webhook_status['ok']) {
// error_log("Webhook установлен успешно: " . TELEGRAM_WEBHOOK_URL);
// } else {
// error_log("Ошибка установки вебхука: " . ($webhook_status['description'] ?? 'Неизвестная ошибка'));
// }
?>
Шаг 6: Обработчик уведомлений AmaraPay (`amarapay_webhook.php`)
Этот скрипт будет получать POST-уведомления от AmaraPay после успешной оплаты. Убедитесь, что вы указали `AMARAPAY_NOTIFICATION_URL` в настройках своего магазина AmaraPay.
<?php
require_once 'config.php';
require_once 'db_connect.php';
require_once 'telegram_api.php';
// Логируем все входящие POST-данные для отладки
error_log("Amarapay webhook received POST: " . print_r($_POST, true));
// Секретный ключ из настроек вашего магазина
$secret_key = AMARAPAY_SECRET_KEY;
// Получаем данные из POST-запроса
$transaction_id = $_POST['id'] ?? null; // Номер платежа в системе Amarapay
$label = $_POST['label'] ?? null; // Номер или название заказа в вашей системе (у нас это order_label)
$payment_date = $_POST['time'] ?? null; // Дата и время платежа
$shop_id = $_POST['shop_id'] ?? null; // Номер магазина в AmaraPay
$amount = $_POST['amount'] ?? null; // Сумма платежа
$received_hash = $_POST['hash'] ?? null; // Подпись (HASH sha256), полученная от AmaraPay
// Проверка наличия всех обязательных параметров
if (is_null($transaction_id) || is_null($label) || is_null($shop_id) || is_null($amount) || is_null($received_hash)) {
error_log("Amarapay webhook ERROR: Missing parameters. POST: " . print_r($_POST, true));
die('ERROR: Missing parameters');
}
// Проверка, соответствует ли ID магазина нашему
if ($shop_id != AMARAPAY_SHOP_ID) {
error_log("Amarapay webhook ERROR: Shop ID mismatch. Received: {$shop_id}, Expected: " . AMARAPAY_SHOP_ID);
die('ERROR: Shop ID mismatch');
}
// Формирование хеша для проверки подлинности уведомления
$check_hash = hash('sha256', $shop_id . $amount . $secret_key . $transaction_id);
// Проверка подписи
if ($received_hash !== $check_hash) {
error_log("Amarapay webhook ERROR: Invalid hash for transaction ID {$transaction_id}. Received: {$received_hash}, Expected: {$check_hash}");
die('ERROR: Invalid hash');
}
// --- Оплата прошла успешно, далее ваш код обработки платежа ---
try {
// Находим платеж по label и обновляем его статус
$stmt = $pdo->prepare("SELECT user_id, amount FROM payments WHERE label = ? AND status = 'pending'");
$stmt->execute([$label]);
$payment = $stmt->fetch();
if ($payment) {
// Проверяем, совпадает ли сумма
if ((float)$payment['amount'] !== (float)$amount) {
error_log("Amarapay webhook ERROR: Amount mismatch for label {$label}. DB: {$payment['amount']}, Received: {$amount}");
die('ERROR: Amount mismatch');
}
$stmt = $pdo->prepare("UPDATE payments SET status = 'paid', amarapay_transaction_id = ?, updated_at = NOW() WHERE label = ? AND status = 'pending'");
$stmt->execute([$transaction_id, $label]);
if ($stmt->rowCount() > 0) {
// Платеж успешно обновлен
$user_id = $payment['user_id'];
send_telegram_message($user_id, "✅ Ваш платеж на сумму {$amount} RUB успешно принят! Номер заказа: {$label}. ID транзакции: {$transaction_id}.");
error_log("Amarapay webhook SUCCESS: Payment for label {$label}, transaction ID {$transaction_id} processed.");
} else {
// Платеж уже был обработан или не найден в статусе 'pending'
error_log("Amarapay webhook INFO: Payment for label {$label}, transaction ID {$transaction_id} already processed or not pending.");
}
} else {
// Платеж с таким label не найден в статусе 'pending'
error_log("Amarapay webhook ERROR: Payment with label {$label} not found or not in pending status.");
die('ERROR: Payment not found or already processed');
}
} catch (PDOException $e) {
error_log("Amarapay webhook DB ERROR: " . $e->getMessage());
die('ERROR: Database error');
}
// Важно: всегда возвращать "200" для подтверждения успешного получения уведомления
die('200');
?>
Шаг 7: Установка Telegram вебхука
После того как вы загрузили все файлы на сервер и настроили `config.php`, вам нужно один раз установить вебхук для вашего Telegram бота, чтобы он знал, куда отправлять обновления.
Вы можете либо раскомментировать и запустить часть кода в `webhook.php` для установки вебхука, либо сделать это вручную, отправив GET-запрос в браузере или через cURL:
https://api.telegram.org/botВАШ_ТОКЕН_ТЕЛЕГРАМ_БОТА/setWebhook?url=https://ваш-домен.ru/your_bot_directory/webhook.php
Вы должны получить ответ `{"ok":true,"result":true,"description":"Webhook was set"}`.
Шаг 8: Настройка URL оповещения в AmaraPay
Зайдите в настройки вашего магазина AmaraPay и укажите `https://ваш-домен.ru/your_bot_directory/amarapay_webhook.php` (значение `AMARAPAY_NOTIFICATION_URL` из `config.php`) в поле "URL оповещения".
Готово!
Теперь ваш Telegram бот готов принимать платежи через AmaraPay. Пользователи могут инициировать платеж, получать ссылку, а бот будет автоматически обновлять их статус после успешной оплаты.
