Инструкция: Как добавить оплату биткоинами на сайте

Инструкция: Как добавить оплату биткоинами на сайте



Биткоин привлекает всё больше внимания, а технологии блокчейн прогнозируют светлое будущее. Наша компания, например, решила предоставить возможность клиентам покупать трафик за криптовалюту и подключила способ оплаты при помощи биткоина.

У текущей моды на криптовалюты масса обоснованных плюсов:

  1. Безопасные онлайн-платежи: здесь отсутствует фрод и чарджбеки. Сеть устроена так, что отправленный платеж вернуть нельзя, достоверность транзакции подтверждают пользователи по всему миру, а каждая транзакция шифруется.
  2. Выгодные комиссии: стоимость проведения платежа не превышает 1%. И чем больше сумма перевода — тем меньше потери.
  3. Анонимность: средства клиентов не контролируют банки — никто не вправе блокировать транзакцию или добавить лишнюю комиссию.
  4. Платежи без ограничений: транзакции проводятся в неограниченных объемах, чего не позволяют другие платежные средства.

Существует множество сервисов, позволяющих принимать биткоины и другие валюты. Лишь малая часть из них:

  • Blockchain (ключ для работы с API выдается по заявке).
  • Coinbase (необходимо заполнить заявку и дождаться одобрения).
  • Bitaps (открытое API).
  • Cryptonator.

Мы подключили оплату через API сервиса Bitaps, потому что через него это оказалось сделать проще. Если у Blockchain требуется писать заявку и ждать одобрения три банковских дня, то здесь изначально можно подключиться самостоятельно. В API найдется всё необходимое для этого.

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

При формировании счета для клиента надо сгенерировать и мониторить уникальный адрес (временный кошелек) для каждого платежа. Как только платёж подтверждён сетью, сервер API перечисляет биткоины с временного кошелька на указанный кошелек (свой или корпоративный, куда вам удобно будет получать средства).

У каждого сервиса свой API, но выглядит схема примерно одинаково:

  • Сгенерируйте платеж, обратившись по специальной ссылке и передав параметры.
  • Создайте биткоин-адрес продавца, на который будут пересылаться деньги.
  • Создайте ссылку вашей системы (callback), которая будет вызываться при подтверждении платежа.
  • Укажите количество принятых подтверждений платежа в сети Bitcoin (опциональное поле, по умолчанию — 3).
  • Определите уровень комиссии сети (опциональное поле, по умолчанию — low). Чем он выше, тем быстрее произойдет перевод.

В итоге получается сгенерированный адрес для приёма оплаты, код платежа и счёт. Код вы используете в базе данных для записи, сортировки или поиска информации о платежах. Счёт может быть отправлен покупателю или использован для платёжной формы.

После зачисления средств по указанному счету происходит подтверждение в сети Bitcoin. На каждое подтверждение отправляется обращение к callback и передаются параметры, чтобы опознать платеж. При получении последнего подтверждения надо выполнить заказ или услугу клиента. Сумма передается в сатоши — самой маленькой части биткоина.

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

Пример на языке PHP

DATA HOSTED WITH ♥ BY PASTEBIN.COM - DOWNLOAD RAW - SEE ORIGINAL

  1. // Пример создания платежа
  2.  
  3. // необходимое вам кол-во подтверждений
  4. define('CONFIRMATIONS', 3);
  5.  
  6. // уровень комиссии, чем выше, тем быстрее зачисление
  7. define('FEE_LEVEL', 'low');
  8.  
  9. // адрес вашей логики приема callback'ов
  10. $callback = 'https://example.com/bitcoin-payment-callback';
  11. $callback = urlencode($callback);
  12.  
  13. // формируем адрес для создания платежа
  14. $requestUrl = 'https://bitaps.com/api/create/payment/';
  15. $requestUrl .= 'YOU_BITCOIN_PAYMENT_ADDRESS/';
  16. $requestUrl .= $callback;
  17. $requestUrl .= '?confirmations=' . CONFIRMATIONS . '&fee_level='. FEE_LEVEL;
  18.  
  19. $data = file_get_contents($requestUrl);
  20. $result = json_decode($data, true);
  21.  
  22. // если произошли какие-либо ошибки создания платежа
  23. if (!$result || isset($result['error_code'])) {
  24.    throw new \Exception('Bitcoin payment creation error: ' . $data);
  25. }
  26.  
  27. // если все OK, получим массив данных
  28. [
  29.    // сгенерированный адрес для приёма оплаты
  30.    "address" => "14aT7ELki1pVWtryd5brMGqsFySWgjy8je",
  31.  
  32.    // код платежа
  33.    "payment_code" => "PMTvvdRdFBPvY1KrDeRxSuwr4nDcMVBenbX2rB2zRYHBHbGRYK5Lu",
  34.  
  35.    // счет
  36.    "invoice" => "invNfFnca2Vg49dDg77exiQmqrVKCMBWsBBrB95HNZGbAwqQpNY2b"
  37. ]
  38.  
  39.  
  40. // После оплаты сервис посылает подтверждения на ваш callback
  41. /*
  42.   * В каждом колбэке отправляются переменные в POST запросе:
  43.   * tx_hash={transaction hash}
  44.   * address={address}
  45.   * invoice={invoice}
  46.   * code={payment code}
  47.   * amount={amount} # Satoshi
  48.   * confirmations={confirmations}
  49.   * payout_tx_hash={transaction hash} # payout transaction hash
  50.   * payout_miner_fee={amount}
  51.   * payout_service_fee={amount}
  52. */
  53.  
  54. // Пример обработки подтверждений ($data = $_POST)
  55.  
  56. // будем ждать последнего подтверждения для зачисления денег
  57. if (intval(ArrayHelper::getValue($data, 'confirmations')) !== CONFIRMATIONS) {
  58.    return;
  59. }
  60.  
  61. // получаем сумму
  62. $bcAmount = ArrayHelper::getValue($data, 'amount');
  63. if (!$bcAmount) {
  64.    throw new \Exception('bcAmount is not found!');
  65. }
  66.  
  67. // сумма в Сатошах, нам нужна в BTC
  68. $bcAmount = ($bcAmount / 100000000);
  69. if ($bcAmount < 0) {
  70.    return;
  71. }
  72.  
  73. // получаем курс на данный момент для конвертации в рубли
  74. // чтобы зачислить клиенту в рублях
  75. $exchangeRate = Bitcoin::getExchangeRate();
  76. $rubAmount = $bcAmount * $exchangeRate;
  77.  
  78. // сохраняем информацию о платеже в БД
  79. $invoiceBitcoin->bcAmount = $bcAmount;
  80. $invoiceBitcoin->rubAmount = $rubAmount;
  81. $invoiceBitcoin->save();
  82.  
  83. // логика зачисления денег в сервисе клиенту
  84. $afterPayment = new AfterPayment();
  85. $afterPayment->addMoneyToUserByInvoice($invoiceBitcoin);

Количество подтверждений

Необходимое количество подтверждений зависит от модели риска, клиентов и сумм. Если вы доверяете клиентам, то принимайте платежи без подтверждений или с одним подтверждением. При небольших переводах трех подтверждений достаточно.

Шесть подтверждений математически невозможно подделать, не имея 51% вычислительной мощности сети. Чем больше подтверждений необходимо, тем больше комиссия и время ожидания. В среднем платеж проходит 15-20 минут, а оплата для клиента будет выглядеть следующим образом:

  • Выбор товара или услуги.
  • Выставление счета клиенту (вывод на странице номера кошелька и суммы, необходимой для оплаты).
  • Перевод средств клиентом.
  • Ожидание трех подтверждений и завершение заказа или услуги (в нашем случае это пополнение счета рекламного кабинета).

Важные замечания

  1. Кроме комиссии сервиса приема платежей, существует биткоин-комиссия за перевод с временного кошелька на указанный вами. Об этом нигде, к сожалению, не написано, поэтому рекомендуем не проводить мелкие платежи. В нашей сети установлено минимальное пополнение — 1000 рублей.
  2. Курс биткоина, как и других криптовалют, ощутимо меняется каждую секунду. Рекомендуем пересчитывать курс и как можно чаще выводить биткоин в реальную валюту. Конечно, это работает для тех случаев, если вам важно работать с реальной валютой, конвертируя биткоин по курсу.
  3. Не каждый блокчейн-сервис разрешает использовать API для приема платежей без подтверждения. Критерии приема в тот или иной сервис неизвестны, поэтому подавайте заявки в несколько мест.
  4. В каждом сервисе комиссии на прием платежей отличаются. Изучите детально каждый, прежде чем решите подключиться.
  5. Не выставляйте число обязательных подтверждений для выполнения оплаты выше шести. Это приведет к большему времени ожидания для клиента и негативным отзывам. Для безопасности хватит трех.
  6. При уровне комиссии low перевод средств занимает тридцать минут. Если желаете сэкономить покупателям средства, не увеличивайте уровень комиссии.


Report Page