internet shop

С учетом достаточно быстрого роста популярности такой электронной криптовалюты, как биткоины, я стал все чаще получать на почту вопросы о том, а как же, собственно, реализовать прием Bitcoin на своем сайте, интернет магазине. Эти вопросы и побудили меня написать эту статью.

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

Итак, допустим у вас есть интернет магазин, который успешно функционирует. Вы реализовали возможность оплаты товаров с помощью таких систем, как Webmoney, Яндекс деньги, пластиковая карта и т.д., и в последнее время, всерьез задумались о возможности принимать в качестве оплаты за ваши товары или услуги биткоины. Для начала разберемся как же работает простейший алгоритм практически любого интернет магазина:

  1. Пользователь регистрируется в интернет магазине.
  2. Выбирает необходимый товар или услугу.
  3. Выбирает тип оплаты.
  4. В соответствие с выбранным типом оплаты, система передает данные либо на специальный процессинговый центр, либо выдает все необходимые реквизиты для оплаты товара. Параллельно с этим в системе создается запись о заказе пользователя, с ожиданием поступления от него денег.
  5. После завершения оплаты и поступления средств на счет магазина, менеджер связывается с клиентом и уточняет вопросы сроков доставки и др.

Вот собственно и все. При интеграции приема BTC в интернет магазине данный алгоритм будет практически неизменен. Это значит, что никаких сложных нововведений, усложняющих работу интернет магазина и системы приема платежей, не будет.

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

Для начала представим, что у нас есть интернет магазин, с фиксированными ценами в рублях, к примеру. Само собой разумеется, что если вы будете вводить возможность оплаты биткоинами, то вам нужно каким-либо образом реализовать конвертацию цены из рублей в BTC. Для решения этой задачи я бы порекомендовал воспользоваться курсом биржи mtgox.com, для конвертации рублевой цены в биткоины.

Итак, допустим, что эта проблема уже решена, и что вы, например, сделали иконку «Оплатить в BTC», при нажатии на которую цена автоматически конвертируется в биткоины. Теперь представим простой интерфейс корзины, который видит пользователь, оформляющий заказ:

корзина покупателя с указанием цены в биткоинах


Клиентская часть:

Здесь мы видим, что в качестве товара был выбран планшет на андройде в количестве 1 штука и ценой в 10 BTC. После того, как заказ сформирован, и пользователь готов перейти к оплате, он нажимает «Перейти к оплате».

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

указание адреса bitcoin кошелька для оплаты

Система предлагает пользователю перевести необходимую сумму на указанный кошелек. Клиент оплачивает, после чего нажимает кнопку «Оплатил». Дальше система выдает следующую страницу:

заказ товара выполнен успешно

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


Серверная часть:

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

данные о заказанном товаре

Данный интерфейс предоставляет самую необходимую информацию о заказе, такую как:

- номер заказа;

- дата и время формирования заказа;

- описание заказа;

- сумма для оплаты;

- уникальный сгенерированный адрес для оплаты заказа;

- сколько поступило на счет;

- id клиента (это всего лишь представление связи 2-х таблиц, и в данном примере не является функциональной единицей. Часто вместо номера клиента указывается его ФИО или ссылка на его профиль, для удобства работы с системой.)

Как только деньги приходят на определенный адрес, в графе «поступило на счет» появляется переведенная сумма + графа начинает светиться зеленым цветом:

данные о заказанном товаре

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

Теперь рассмотрим работу этой системы с точки зрения программирования.

Для внедрения приема BTC, необходимо установить и настроить демон bitcoind на сервере. Следует иметь ввиду, что если сайт расположен на виртуальном хостинге, внедрить оплату таким образом скорее всего не получится, т.к. редкие shared хостинги разрешают устанавливать программы на своих серверах. Установка и настройка bitcoind подробно расписана здесь.

После установки и настройки демона, необходимо воспользоваться классом, специально написанным для работы с bitcoind из PHP. Класс можно бесплатно загрузить здесь.

Теперь у вас установлено и настроено окружение для организации приема BTC.

Алгоритм реализован следующим образом.

Когда пользователь регистрируется в интернет магазине, для него создается, так называемый «аккаунт» в bitcoind. Account – это некий кошелек, который может содержать в себе неограниченное количество уникальных адресов. Данная процедура реализуется с помощью метода new_address. Если к методу указан параметр, то его имя и будет равняться имени нового акаунта. Например, при регистрации пользователя выполним следующий код:

$account = $btc->new_address(“user”); //Получим новый акаунт для пользователя $user с его же именем.

После оформления заказа в пользовательском акаунте создается новый адрес, который привязывается к определенному заказу. Во время оформления заказа в базу данных, в таблицу "orders", заносятся данные о новом заказе.

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

$amount = $btc->get_recieved_address('номер кошелька'); //выведет сумму, перечисленную на этот адрес.

И на клиентскую, и на серверную часть можно установить проверку на количество подтверждений определенной транзакции. Для этого можно воспользоваться функцией listreceivedbyaddress, которая выдает информацию относительно принятых средств на указанном в качестве аргумента адресе. Нас интересует параметр confirmations, который и нужно выводить. Вот пример:

$receive = $btc-> listreceivedbyaddress(‘адрес’);
var_dump($recieve);
[
{
"address" : "1DVAcPkjru9nzfEqKYhubNDjdXBHjHqbLo",
"account" : "",
"amount" : 0.05500000,
"confirmations" : 266
},
{
"address" : "1Ctg4arv6EYmLHdqqTVtXekFi6sJAr9Edm",
"account" : "",
"amount" : 0.10000000,
"confirmations" : 311
}
]

Соответственно, эти подтверждения можно выводить в пользовательскую или административную панель для наглядности.

По большому счету, это весь функционал. Обертка – дело каждого программиста. Но хочу сказать, что пользуясь всеми прелестями API bitcoind, можно реализовать гораздо более продуманную и защищенную систему.