Как принимать оплату биткоинов без коммисий в питоне

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

Все что вам нужно - генерировать биткоин адрес (это просто 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')

В моем примере, при проверке оплаты все биткоины отправляются на какой-то кошелек владельца.

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

Комментарии

Популярные сообщения из этого блога

DOS атака при помощи Python

Ведем телеграм канал через питон

Django migrations не видит изменения моделей