Пишем "страницу поддержки" с Бесплатной оплатой Биткоинами
Слово "пожертвование" не всегда вызывает положительные эмоции, ведь оно происходит от слова "жертвовать" или “пожертвовать” чем либо.
Выражение "поддержать", "помочь" или "стать частью" гораздо благозвучнее и приятнее. Особенно если в ответ плательщик получает рекламную ссылку или рекламное упоминание о себе. Яркий пример, это Patreon на сайте https://coin.dance/. Но было бы интереснее продавать не одинаковые размеры логотипов, а всю рекламную площадь, в зависимости от суммы оплаты. Скажем квадрат 1х1 стоит 10.000 Сатоши. Кому то хватит реферального пикселя для поисковика, а кто то захочет большой анимированный логотип.
Итак, приступаем.
В своих проектах, вы можете не только принимать, но и полностью управлять кошельком, создавать выплаты по 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 $jsondata = array ( 'type' => "saving" );$apiendpoint = "https://apirone.com/api/v2/btc/wallet";
$curl = curlinit($apiendpoint);
curlsetopt($curl, CURLOPTHTTPHEADER, array("Content-Type: application/json"));
curlsetopt($curl, CURLOPTPOST, 1);
curlsetopt($curl, CURLOPTPOSTFIELDS, jsonencode($jsondata));
curlsetopt($curl, CURLOPTRETURNTRANSFER, 1);
$response = curlexec($curl);
$httpstatuscode = curlgetinfo($curl, CURLINFOHTTPCODE);
curlclose($curl);if ($httpstatuscode==200){
$decoded = jsondecode($response, true);
echo "Wallet: " . $decoded["wallet"] . "
";
echo "Key: " . $decoded["transferkey"];
} else {
vardump($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 CURRENTTIMESTAMP ON UPDATE CURRENTTIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- Индексы таблицы
supporters
ALTER TABLEsupporters
ADD PRIMARY KEY (id
);-- AUTOINCREMENT для таблицы
supporters
ALTER TABLEsupporters
MODIFYid
int(11) NOT NULL AUTOINCREMENT;
COMMIT;
На странице оплаты нам потребуется форма с двумя текстовыми полями URL, link to logo.
По нажатию на кнопку sabmit, оба этих поля и ссылку для получения колбэка, отправляем в JSON запросе на API эндпоинт.
https://apirone.com/api/v2/btc/wallet/WalletID/address
WalletID - это тот идентификатор кошелька который мы получили в первом запросе.
secret - какой то секретный код, для защиты нашего приложения. Мы будем его сверять на странице колбэка.
Пример PHP кода:
<?php $jsondata = array ( "callback" => array( 'url'=> 'http:// example.com/callback', 'data' => array ( 'secret' => "abrakadabra", 'url' => "https:// bits.media/", 'logo' => "https:// bits.media/local/templates/bits.media/images/bits3.png" ) ) );$wallet = "8133edaa7e1c8040963159b2ef8b2d30";
$apibase = "https://apirone.com/api/v2/btc/wallet/". $wallet ."/address";$curl = curlinit($apibase);
curlsetopt($curl, CURLOPTHTTPHEADER, array("Content-Type: application/json"));
curlsetopt($curl, CURLOPTPOST, 1);
curlsetopt($curl, CURLOPTPOSTFIELDS, jsonencode($jsondata));
curlsetopt($curl, CURLOPTRETURNTRANSFER, 1);
$httpstatuscode = curlgetinfo($curl, CURLINFOHTTPCODE);
$response = curlexec($curl);
curlclose($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 = filegetcontents('php://input');if ($data) {
$params = jsondecode($data, true);// проверяем наш секретный код
if ($params["data"]["secret"] !== $secret) die();$url = $params["data"]["url"];
$logo = $params["data"]["logo"];
$inputaddress = $params["inputaddress"];
$valueinsatoshi = $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":
{"url": "https:// bits.media/", "logo": "https:// bits.media/local/templates/bits.media/images/bits3.png", "secret": "abrakadabra"},
"inputaddress": "1E2VSRsaW3Kb1gDkdRUGDo6knAKfi9iYsb",
"confirmations": 0,
"inputtransactionhash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"value" : 100000000
}' -i http:// example.com/callback.php
http://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