Инструкция: Пишем "страницу сбора пожертвований" с Бесплатной оплатой Биткоинами (Bitcoin)

Итак, приступаем.
В своих проектах, вы можете не только принимать, но и полностью управлять кошельком, создавать выплаты по API запросу.
Тариф простой:Все входящие транзакции абсолютно БЕСПЛАТНЫ!Фиксированная комиссия 0.0002 BTC ($0.8) за исходящую транзакцию на сумму более 0.001 BTC.
Микро-выплаты менее 100.000 Сатоши также бесплатны. Все входящие транзакции обрабатываются Бесплатно, а значит это идеально подходит для сбора платежей.
Для начала создаем Накопительный (saving) кошелек, отправляем JSON запрос на эндпоинт https://apirone.com/api/v2/btc/wallet
В ответ получаем
{ "wallet": "8133edaa7e1c8040963159b2ef8b2d30", "type": "saving", "transfer_key": "sfZ4MmnfhXNb1RiLh7jqnFW2eZmdsYt9", "currency": "btc" }
wallet - это кошелек, на который мы будем собирать платежи и им управлять.
transfer_key - ключ, с помощью которого делаем выплаты по API
Пример PHP кода:
<?php
$json_data = array ( 'type' => "saving" );
$api_endpoint = "https://apirone.com/api/v2/btc/wallet";
$curl = curl_init($api_endpoint);
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);
$response = curl_exec($curl);
$http_status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($http_status_code==200){
$decoded = json_decode($response, true);
echo "Wallet: " . $decoded["wallet"] . "<BR>";
echo "Key: " . $decoded["transfer_key"];
} else {
var_dump($response);
}
?>База данных будет максимально проста и оптимизирована. В единственную таблицу мы будем записывать только оплаченные URL, ссылку на логотип и сумму с количеством подтверждений сети.
CREATE TABLE `supporters` ( `id` int(11) NOT NULL, `address` varchar(34) NOT NULL, `logo` varchar(250) NOT NULL, `link` varchar(250) NOT NULL, `amount` int(11) NOT NULL, `confirmations` tinyint(4) NOT NULL, `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Индексы таблицы `supporters` ALTER TABLE `supporters` ADD PRIMARY KEY (`id`); -- AUTO_INCREMENT для таблицы `supporters` ALTER TABLE `supporters` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; COMMIT;

На странице оплаты нам потребуется форма с двумя текстовыми полями URL, link to logo. По нажатию на кнопку сабмит, оба этих поля и ссылку для получения колбэка, отправляем в JSON запросе на API эндпоинт.
https://apirone.com/api/v2/btc/wallet//a...
<WalletID> - это тот идентификатор кошелька который мы получили в первом запросе.
'secret' - какой то секретный код, для защиты нашего приложения. Мы будем его сверять на странице колбэка.
<?php
$json_data = array ( "callback" => array(
'url'=> 'http://example.com/callback',
'data' => array ( 'secret' => "abrakadabra", 'url' => "https://bits.media/")
)
);
$wallet = "8133edaa7e1c8040963159b2ef8b2d30";
$api_base = "https://apirone.com/api/v2/btc/wallet/". $wallet ."/address";
$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"];
?>В ответ на запрос, получаем новый биткоин адрес для оплаты. Все сгенерированные адреса будут постоянно мониториться нашим сервисом, ведь клиент может оплатить сейчас, а может сделать это чуть позже.
Для удобства оплаты выводим QR код, с помощью АПИ https://apirone.com/ru/docs/get-qr-code
Обработка колбэка. Callback.php

Страница колбэка нужна для обработки данных от платежного сервиса. Apirone передает адрес на который поступил платеж, сумму, транзакцию, количество подтверждений и данные которые предоставленные пользователем: secret, url, logo. Данные передаются POST запросом в формате JSON, так удобнее и безопаснее.
<?php$secret = "abrakadabra";//receive JSON data$data = file_get_contents('php://input');if ($data) { $params = json_decode($data, true); // проверяем наш секретный код if ($params["data"]["secret"] !== $secret) die(); $url = $params["data"]["url"]; $logo = $params["data"]["logo"]; $input_address = $params["input_address"]; $value_in_satoshi = $params["value"]; //Save unconfirmed transaction and data to your Database. if ($params["confirmations"] == 0) { // записываем URL и LOGO в базу данных } if ($params["confirmations"] >= 3) { // обновляем количество конфирмов в базе данных // по завершению сделки, сообщаем серверу *ok* echo "*ok*"; }}?>Оплату за донаты от доверительных плательщиков, можно принимать по нулевому подтверждению Биткоин сети. Но если вы продаете что то дорогое и значимое, мы рекомендуем завершать сделку по 2-3 подтверждениям сети.
После завершения оплаты, в ответ серверу сообщаем *ok*. После этого колбэки по оплате прекращаются.
Завершение оплаты и размещение логотипа

Чтобы показать клиенту о проведенной оплате, мы должны её периодически проверять. Мы будем проверять её в созданной таблице. Ведь как только платежный сервер сделает колбэк, у нас сохраняется сгенерированный адрес и ссылки в БД. С помощью Ajax JQuery запроса с периодичностью в 3 секунды, проверяем оплату в БД по идентификатору - сгенерированному биткоин адресу. Как альтернатива, можно проверять транзакцию напрямую в блокчейне, например через blockchain.info или любой другой открытый API или открытая подписка по сокету.
Именно поэтому все входящие платежи должны быть бесплатными, а не брать за это процент. Транзакции всегда можно проверить в блокчейне.
Как только мы нашли транзакцию, пишем плательщику что оплата прошла успешно и перезагружаем страницу. Теперь его логотип со ссылкой будет на сайте. Размер логотипа = сумма оплаты / 10000 Сатоши.
Отладка
Чтобы проверить работу колбэка без оплаты, достаточно его эмулировать cURL запросом:
curl -X POST -H "Content-type: application/json" -d '{ "data": "input_address": "1E2VSRsaW3Kb1gDkdRUGDo6knAKfi9iYsb", "confirmations": 0, "input_transaction_hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "value" : 100000000}' -i http://example.com/callback.phphttp://example.com - замените на свой ресурс.
Так мы отправляем запрос с "data" - данными пользователя и информацию о транзакции в формате JSON.
Вы можете поменять секретный код, ссылки, количество подтверждений, сумму и увидеть, что на это отвечает страница callback.php.
Заключение
Предложенный код, вы можете использовать и модифицировать как угодно. Например выставлять логотипы одного размера, а сумма оплаты это время размещения в минутах. Или сумма это занимаемая площадь, а может даже клетка на шахматной доске или приоритет в списке. Как вам будет угодно.
GitHub: https://github.com/Apirone/supporter
Документация по разворачиванию проекта: https://apirone.com/ru/integrations/become-a-supporter
Рабочий пример: https://allprivatekeys.com/become-a-supporter.php
Документация: https://apirone.com/ru/docs/wallet