Заведите кошелёк
Адрес - это всё, что от вас нужно. Ключ остаётся у вас, нам он не нужен и мы его не видим. Кошелёк создаётся за минуту на nxt.stackworks.ru.
Перевод доходит за шесть секунд и стоит доли копейки. Ни эквайринга, ни договора, ни процента с оборота. Всё, что нужно от вас - адрес кошелька и тридцать строк кода.
Адрес - это всё, что от вас нужно. Ключ остаётся у вас, нам он не нужен и мы его не видим. Кошелёк создаётся за минуту на nxt.stackworks.ru.
К сумме заказа добавьте уникальный хвост в младших разрядах. По нему вы отличите одну оплату от другой: поля для комментария в переводе нет, и сумма - единственная метка.
Опрашивайте адрес раз в несколько секунд и ищите перевод на точную сумму. Одна функция из нашей библиотеки, зависимостей нет.
Соберём счёт, покажем ссылку и код. Это настоящая сеть, а не песочница: если оплатить, монеты действительно уйдут.
Библиотека на стандартной библиотеке Python, зависимостей нет. Скачайте два файла и положите рядом со своим кодом.
import time
import nextcoin_merchant as nxt
ADDR = "nxt1ваш_адрес_для_приёма"
seen = set() # засчитанные хэши, держите их в своей базе
def выставить_счёт(цена_в_монетах, заказ):
# Уникальный хвост в младших разрядах: по нему отличим одну
# оплату от другой. Поля для комментария в переводе нет.
units = nxt.to_base_units(цена_в_монетах) + (заказ % 1000)
return units
def ждать_оплату(units, минут=30):
край = time.time() + минут * 60
while time.time() < край:
оплата = nxt.find_payment(ADDR, units, seen=seen)
if оплата:
seen.add(оплата.hash) # сохраните в базу, а не в память
return оплата
time.sleep(6) # блок выходит раз в шесть секунд
return None
Не верьте хэшу из браузера. Страницу можно поменять в отладчике и вызвать обработчик успеха, не заплатив ни монеты. Проверять надо со своего сервера.
Не засчитывайте один хэш дважды. Это единственная проверка, которую библиотека сделать за вас не может: она не знает вашу базу.
Не берите перевод из очереди. Пока он не в блоке, его можно вытеснить другим с тем же номером операции, и товар уйдёт за деньги, которых не будет.
Шесть знаков после запятой, внутри всегда целые базовые единицы, 1 NXT это 1 000 000. Никаких дробных чисел с плавающей точкой: ноль целых одна десятая плюс две десятых в них не даёт три десятых.
Приводите к нижнему регистру перед сравнением. Заглавный вариант законен по стандарту и проверку проходит, но это другая строка.
Валидатор один, форков нет. Одного блока достаточно для любых разумных сумм. Ждать десятки подтверждений незачем.
Цену держите в своей валюте и переводите в NXT в момент выставления счёта, а курс закрепляйте на срок жизни счёта. Курс отдаёт /rate, там же признак протухания внешних источников.