Прием платежей Bitcoin

Материал из poiuty wiki
Перейти к: навигация, поиск

Не смущайтесь, что написано для litecoin. Логика та же и для bitcoin.
Отдельно отмечу, что на данный момент для запуска bitcoind -> нужен VPS с диском как минимум 40Gb.

Ставим litecoin wallet.

apt-get install build-essential libssl-dev libdb5.1-dev libdb5.1++-dev libboost-all-dev git
git clone git://github.com/litecoin-project/litecoin.git
cd litecoin/src
make -j2 -f makefile.unix USE_UPNP=
cp litecoind /usr/bin/litecoind
mkdir ~/.litecoin

Создаем /root/.litecoin/litecoin.conf c правами 0600

server=1
rpcallowip=127.0.0.1
rpcuser=HardToGuessUsername
rpcpassword=Str0ngS3cur3Passw0rd1

Запускаем.

litecoind -daemon

Чтобы отправлять команды на API -> воспользуемся jsonRPCClient.
Всем пользователям делаем отдельный адрес (чтобы определить, кто оплатил).

$litecoin->getnewaddress("NAME");

ltc1.png

Далее раз в N минут проверяем транзакции, где количество подтверждений от 6 до 1000 и статус платежа receive.
Если получили такие транзакции -> проверяем txid в базе. Если в базе нет txid -> увеличиваем баланс. Если есть -> игнорируем. ltc2.png

Пример кода (проверка оплаты).

<? // example by poiuty 
require_once('jsonRPCClient.php');
 
$litecoin = new jsonRPCClient('http://USER:PASSWD@127.0.0.1:9332/');
 
// Получаем массив и делаем цикл
$i = 0;
$a = $litecoin->listtransactions("*", 100000));
 
while(count($a) > $i){
 
// Проверяем тип транзакции, количество подтверждений + сумму
if($a["$i"]["category"] != "receive" || $a["$i"]["confirmations"] < 6 || $a["$i"]["amount"] < 0.001) continue;
 
// Есть ли в базе эта транзакция?
$select_query = $db->prepare("SELECT * FROM `billing_log` WHERE `payment_id` =:id");
$select_query->bindParam(':id', $a["$i"]["txid"], PDO::PARAM_STR);
$select_query->execute();
if($select_query->rowCount() > 0){ $i++; continue; }
 
// Кто оплачивает?
$select_query = $db->prepare("SELECT * FROM `users` WHERE `ltc` =:address");
$select_query->bindParam(':address', $a["$i"]["address"], PDO::PARAM_STR);
$select_query->execute();
if($select_query->rowCount() != 1){ $i++; continue; }
$row = $select_query->fetch();
$user_id = $row['user_id'];
 
// Узнаем курс
$select_query = $db->prepare("SELECT * FROM `ltc` WHERE `id` = '1'");
$select_query->execute();
$row = $select_query->fetch();
$ltc_val = $row['value'];
 
// Увеличим баланс
$money = round($a["$i"]["amount"]*$ltc_val);
$update_query = $db->prepare("UPDATE `users` SET `money` = `money`+:money WHERE `user_id` = :user_id");
$update_query->bindParam(':money', $money, PDO::PARAM_STR);
$update_query->bindParam(':user_id', $user_id, PDO::PARAM_STR);
$update_query->execute();
 
// Запишем лог
$insert_query = $db->prepare("insert into `billing_log`(`payment_id`, `amount`, `date`, `system`, `user_id`) VALUES ( :id, :money, UNIX_TIMESTAMP(), 'Litecoin', :user_id)");
$insert_query->bindParam(':id', $a["$i"]["txid"], PDO::PARAM_STR);
$insert_query->bindParam(':money', $money, PDO::PARAM_STR);
$insert_query->bindParam(':user_id', $user_id, PDO::PARAM_STR);
$insert_query->execute();
 
$i++;
}

  Узнаем средний курс по BTC-E.

<? // example by poiuty
$i = file_get_contents("https://btc-e.com/api/2/ltc_rur/ticker");
if($i === false) die;
$i = json_decode($i, true);
$i = (int) $i["ticker"]['avg'];
 
$update_query = $db->prepare("UPDATE `ltc` SET `value` = :ltc WHERE `id` = '1'");
$update_query->bindParam(':ltc', $i, PDO::PARAM_STR);
$update_query->execute();