AutoPTC

Как это сделано? Прием оплаты в криптовалюте (DOGE)



Эта статья открывает цикл "Как это сделано?", далее пойдет речь как подключить на любой сервис(сайт) прием оплаты в криптовалюте.

Самое очевидное, воспользоваться API у любого сервиса, который его представляет - тьма их.
Но это не наш метод.
Для начала нам понадобится несколько наших адресов - их можно создать в любом кошельке. Сколько?
Их количество должно коррелировать с количеством одновременно поступающих платежей. Допустим три, или десять или сто.

Создаем табличку mywallet(addr varchar(50),active integer, summ numeric(10,6), need_summ(10,6), invoice integer,userid integer)
где addr - адреса нашего кошельков, activesumm - сумма которая уже есть на кошельке, need_summ - сумма которую будем ожидать, invoice/userid - куда зачислим

Создаем табличку и вставляем в нее начальные данные
insert into mywallet(addr,active) valeus('9srsQW1v4tBDpMpP7YrTZ4dju15bAQb7dB',1)

Допустим у нас есть некоторый интерфейс, который инициирует запрос на платеж - пусть вызывается страница, через POST в которую передается
сумма (userid - мы получаем из кук/сессии)

Запускается скрипт PHP - который получает $summ=$_POST['summ'] и $userid=$_SESSION['uid']

  1. вызываем PHP функцию создание счета (не обязательно можно сразу переходить к следующему шагу),
    таблица счетов invoice(id integer,userid integer,summ numeric(10,6),build integer)

  2. вызываем получение свободного кошелька $wallet=get_active_wallet($summ,$userid,$invoice);


function get_active_wallet($summ,$userid,$invoice)
{
$sth=mysql_query("select * from mybtcwallet where active=1 limit 1");
$row = mysql_fetch_array($sth);
if (!$row) return false;
$addr = $row['addr'];
$balance = get_wallet_balance($addr);
if ($balane===false) return false;
$n_summ=$balance+$summ;
$sth=mysql_query("update mywallet set active=0,invoice=$invoice,need_summ=$n_summ,summ=$balance,userid=$userid,invoice=$invoice where addr='$addr'");
if (!$sth) return $addr;
return $addr;
}


В случаем успеха показываем пользователю кошелек, который нужно пополнить - $addr.
Ах, да функция - get_wallet_balance, для каждой криптовалюты своя, для DOGE - примерно такая:
function get_wallet_balance($addr)
{
$url ="https://dogechain.info/api/v1/address/balance/".$addr;
$json = file_get_contents($url);
$data=json_decode($json,true);
if (isset($data['success']) && $qata['success']==1)
return $data['balance'];
return false;
}


Далее просто время от времени (например при обновлении страницы) проверяем данные у "загруженных" кошельков

function check_wallet()
{
$sth=mysql_query("select * from mywallet where active=0");
while ($row = mysql_fetch_array($sth))
{
$addr = $row['addr'];
$balance = get_wallet_balance($addr);
if ($balance>$row['summ'])
{
//1 вариант мы зачисляем любую сумму пользователю
$summ_user = $balance-$row['summ'];
add_balance_user($row['userid'],$summ_user);
$st2h=mysql_query("update mywallet set active=1 where addr='$addr'");

//2 вариант мы все же ждем сумму равную или большую запрошеной, но зачисляем ровно :)
if ($balance>=$row['n_summ'])
{
add_balance_user($row['userid'],$row['n_summ']-$row['summ']);
$st2h=mysql_query("update mywallet set active=1 where addr='$addr'");
}
}
}
}


На самом деле неплохо было бы в табличке mywallet еще добавить поле startdate и заполнять его текущем временем при создание счета/платежа,
а в проверке кошельков те которые уже грузятся больше нужного (для DOGE - скажем сутки, тоже освобождать.

Еще есть нюанс - как самому выводить деньги с кошелька - перед этой операцией его тоже нужно заблокировать - т.е. установить active = 1.
Опубликовано admin (база знаний)