Здравствуйте! Есть такая задача - есть площадка, к которой нужно пристроить оплату через btc. Работа будет осуществляться с помощью bitcoind через json rpc. Вопрос вот такого характера: как собственно реализовать возможность оплаты и проверку корректности транзакции? С биткоином я раньше особо не работал, поэтому вот как я вижу:
1)выдать клиенту адрес нашего кошелька (или сгенерировать новый для каждой транзакции?)
2)запросить у bitcoind подтверждение прихода средств
Только вот уже тут куча моментов: как узнать что он нужного клиента пришла оплата, как определить сумму, которая пришла и сделать соответствующие пометки в базе данных. В общем я не совсем понимаю как тут быть. Буду рад дельным советам, спасибо за ваше мнение!
1. Создаете отдельный кошелек для каждого клиента
2. С помощью bitcoind или blockr.io например, проверяете транзакции для данного кошелька (с интервалом например в 30 секунд)
3. В параметрах транзакции (если она есть), будет отправитель и сумма - если сумма не подошла - повторяем пункт 2
4. Если сумма подошла - зачисляем пользователю внутренний баланс, забываем про этот кошелек
Так же важно проверить хотя бы два confirmation, перед зачислением. А то всякое бывает
Спасибо, по второму пункту хотел уточнить - получается что нужен отдельный скрипт, который будет в бесконечном цикле проверять неподтвержденные транзакции из базы?
Mark Doe, astrotrain и Иван Тихонов Как в демоне биткоин посмотреть по конкретному адресу не подтвержденные транзакции, а также список всех не подтвержденных транзакций ??
Статья конечно полезная, только я теперь совсем запутался как проверить произошла ли оплата. В статье у автора listreceivedbyaddress почему то несколько адресов вернул, хотя должен был информацию по одному выдать, по идее. Так же, если средств пришло больше или меньше, нужно опять как-то возится - например создавать новый адрес, считать разницу между тем сколько должно прийти и сколько пришло на самом деле и выдавать новую информацию пользователю.
astrotrain: логику можно прописать ту, которая нужна. Я бы делал под один заказ один адрес. Когда на адресе появляется сумма большая или равная требуемой с нужным количеством подтверждений - заказ считается оплаченным. В ином случае - нет. Все, зачем еще дополнительные адреса? Только путаницы больше.
astrotrain: если меньшая, то неплохо бы отобразить юзеру ее и написать сколько надо доплатить. Как станет больше или равна - товар оплачен. Что больше не вижу смысла логику еще накручивать. Если там какие-то копейки, то может округлили так человек. Если серьезно больше отправил - он наверняка напишет, и можно в ручном режиме ему будет вернуть. Не думаю, что это будет частое явление.
В таком случае ответ MarkDoe выглядит решением, с той лишь разницей, что в п.3 лучше регать все входящие транзакции до набора нужной суммы. Ведь человек может захотеть отправить оплату частями из разных мест. И маленькая ремарка по п.1 - не кошелек, а адрес создавать нужно. И не для каждого клиента, а для каждой покупки (счета).
YuriyIvanov: Подразумевалось что у каждого клиента в моем кошельке будет аккаунт соответсвующий его нику, и отталкиваясь от него будет генерироваться адрес getnewaddress('accountname'). А что значит регать транзакции до набора нужной суммы? Не совсем понял.
YuriyIvanov: Получается, если вся сумма будет слаться на один адрес частями, то просто нужно до истечения какого-то времени проверять сколько средств на этом адресе. И если по окончании какого-то времени их будет меньше, независимо от того сколько он там раз деньги слал, то оплату считать недействительной?
Не стоит проверять факт оплаты проверкой баланса адреса, т.к. если будете отправлять из общего кошелька средства - часть из них может списаться именно с этого адреса. Депозиты проверяют по транзакциям. Просто проверяйте до тех пор, пока сумма оплат во всех транзакциях будет >= требуемой. (в рамках разумного времени).
Я против использование сторонних сервисов, поэтому только через bitcoin json rpc api дергаю функцию listreceivedbyaddress и смотрю в ней транзакции с приходами на нужный адрес.