[DEV: PHP] Пишем код для пополнения балансов в играх и сервисах

Допустим, у вас есть игровая платформа или сервис, в котором вы планируете принимать криптовалюту для пополнения баланса пользователей.

В платежном гейте Apirone есть кошельки под отдельные криптовалюты и аккаунты, объединяющие крипто-кошельки. Аккаунты и кошельки можно создавать API-запросом, что очень удобно при масштабировании и разворачивании уже готовых проектов. Также можно это сделать на странице https://apirone.com/dashboard/create

Выбор кошелька или аккаунта
Выбор кошелька или аккаунта

Запросы полностью анонимные, а создавать кошельки и аккаунты можно сколько угодно, без ограничений по количеству.

Главное хранить данные кошелька в безопасном месте.

Тестовый кошелек: tbtc-bde1cfc70297e4ff7068334b25986819
Transfer key: hyl1aQkd5vwdzT1uExgUCOXOcekUg4Yc

Для пополнения баланса на любую сумму, клиентам достаточно показать текущий курс https://apirone.com/docs/rate/#ticker

адрес для оплаты и QR-код https://developers.google.com/chart/infographics/docs/qr_codes?hl=ru . В криптовалютах нет назначения платежа и суммы оплаты, поэтому идентификатором платежей служит адрес (для примера, возьмем блокчейн биткоина).

Для каждого пользователя POST-запросом создаем отдельный биткоин-адрес с параметрами id пользователя, email или login, также можно добавить секретный ключ, чтобы повысить безопасность вашей платформы.

<?php $json_data = array ( "callback" => array( 'url'=> 'http://example.com/callback', 'data' => array ( 'user_id' => "1234", 'secret' => "7j0ap91o99cxj8k9"))); $wallet = "tbtc-bde1cfc70297e4ff7068334b25986819"; $api_base = "https://apirone.com/api/v2/wallets/". $wallet ."/addresses"; $curl = curl_init($api_base); curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json_data)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $http_status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); $response = curl_exec($curl); curl_close($curl); $decoded = json_decode($response, true); echo "Please send the payment to the following bitcoin address: " . $decoded["address"]; ?>

В 'url'=> 'http://example.com/callback' меняем ссылку на адрес страницы для колбэка на своем сайта. Эта страница будет получать всю информацию о поступающих платежах.

'user_id' - какой-либо идентификатор вашего клиента.

'secret' - придуманный вами секретный код, для дополнительной безопасности при получении данных от платежного сервиса.

$wallet - идентификатор кошелька, с которым мы работаем.В этом примере используем тестнет биткоина для отладки, на продакшен поменяете на рабочий кошелек.

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

На странице пополнения баланса клиенту будет удобно, если платеж автоматически появится на экране. Для этого можно периодически делать запрос в базу и проверять была ли оплата.

Обработка Callback

Страница колбэка нужна для приема данных о транзакции и следования бизнес-логике при оплате. На эту страницу Apirone передает: адрес, сумму, хэш транзакции, количество подтверждений и данные которые мы указали: user_id и secret. Данные передаются POST запросом в формате JSON, так удобнее и безопаснее.

<?php $secret = "7j0ap91o99cxj8k9"; //receive JSON data $data = file_get_contents('php://input'); if ($data) { $params = json_decode($data, true); // Проверяем секретный код if ($params["data"]["secret"] !== $secret) die(); $input_address = $params["input_address"]; $value_in_satoshi = $params["value"]; // Если количество подтверждений = нолю, то записываем данные в базу, но не выплачиваем if ($params["confirmations"] == 0) { // пишем данные о транзакции и отмечаем статус инвойса - ожидание подтверждения оплаты } if ($params["confirmations"] >= 1) { // транзакция подтверждена в сети, отвечаем платежному серверу *ok* и пополняем баланс клиенту echo "*ok*"; } } ?>

P.S.:

  • Настоятельно рекомендуем зачислять платеж минимум после одного подтверждения в сети, а если суммы ощутимо большие, то после 3 подтверждений.
  • Рекомендуем хранить в базе данных целочисленные значения суммы в сатоши, потому что значения с плавающей запятой могут привести к ошибкам вычисления.
  • Эндпоинт для всех кошельков одинаковый, меняйте параметр $wallet на Litecoin, Bitcoin Cash, Dogecoin и др. В будущем будут появляться новые криптовалюты, стэйбл-коины и токены.
22
Начать дискуссию