Как принимать оплату биткоинов без коммисий в питоне
Большинство гайдов описывают как принимать биткоины через платёжные шлюзы, но они имеют свои коммисии, которых можно избежать. Биткоин в отличии от банковской системы не требует наличия экваринга и договоров с банками для проведения оплат услуг.
Все что вам нужно - генерировать биткоин адрес (это просто ECDSA публичный и приватный ключи), записывать его куда-то в БД и при нажати пользователем кнопки "проверить оплату" через блокчейн браузеры проверить оплату. Тем самым для проведения оплат вам даже не нужно держать full node у себя на сервере. Конечно при больших нагрузках лучше установить себе на компьютер full node, чтобы избежать тротлинга API.
В питоне для целей генерации адресса, проверки оплат есть минималистичная библиотека - Bit. Key это основной объект этой библиотеки, в нем происходят все действия с кошельком. Генерация, получение приватного ключа, публичного ключа. Например простая генерация биткоин кошелька:
>>> from bit import Key >>> my_key = Key() >>> >>> my_key <PrivateKey: 15CWkhVnZBtZwSdRwjn8UgzriWU9wQ4hWe> >>>
Как я и сказал, адрес нужно будет как-то сохранять и вынимать из БД.
>>> my_key.to_hex() '01923b2c11075951d6f8044fd4f05f2f97228649aa9f22b5e5b85eb66d3a3f10' >>> prev_key = Key.from_hex('01923b2c11075951d6f8044fd4f05f2f97228649aa9f22b5e5b85eb66d3a3f10') >>> prev_key <PrivateKey: 15CWkhVnZBtZwSdRwjn8UgzriWU9wQ4hWe> >>>
Приватный ключ можно хранить в любой БД, главное чтобы потом вы могли получить ее как string. Чтобы не задумыватся об SQL и прочих вещах под БД, можно использовать ORM. Они очень упрощают общение приложения с базами данных, тк вам лишь придётся работать с абстракциями ORM вместо того чтобы писать все SQL запросы с нуля. В моем случае я использовал peewee, но вы можете использовать любую другую.
from peewee import * db = SqliteDatabase('orders.db') class Order(Model): key = CharField() order_id = CharField(primary_key=True, index=True) order_amount = FloatField() is_paid = BooleanField(default=False) class Meta: database = db db.connect() db.create_tables([Order])
Для получения баланса кошелька можно пользоватся методом .get_balance(). Он возвращает баланс в формате string, его просто нужно превратить в float и использовать для проверки с кол-вом которое нужно вам в заказе.
Для проверки оплат я создал эти процедуры:
from bit import Key from db import Order owner_btc_address = '' # Установить биткоин кошелек владельца def create_payment(order_id, amount): key = Key() thereis_order = Order.get_or_none(order_id=str(order_id)) if not thereis_order: o = Order.create( key=key.to_hex(), order_id=str(order_id), order_amount=amount ) address = key.address return address def check_payment(order_id): o = Order.get(order_id=str(order_id)) if not o.is_paid: address = Key.from_hex(o.key) balance = address.get_balance('btc') utxos = address.get_unspents() if float(balance)>=o.order_amount: address.send([(owner_btc_address, balance, 'btc')], unspents=utxos, fee=1) o.is_paid = True o.save() return True else: return True return False create_payment('123', 0.00000004) check_payment('123')
В моем примере, при проверке оплаты все биткоины отправляются на какой-то кошелек владельца.
Если у вас остались вопросы, оставляйте их в комментах. Я на них обязательно отвечу.
Комментарии
Отправить комментарий