NextCoin NextCoin приём оплаты
1 NXT -

Приём оплаты на своём сайте

Сайт, которому нужно принимать NXT, подключает один файл и вызывает одну функцию. Кошелёк открывается в отдельном окне на этом домене, человек видит сумму и подтверждает сам. Продавцу возвращается только хэш перевода.

Пример счёта

Это техническая демонстрация приёма оплаты, а не витрина. Товара за этим счётом нет, но перевод настоящий и монеты действительно уйдут.

Товар
Пробный товар
Цена
28 NXT

Как подключить

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

import { pay, NXT } from 'https://nxt.stackworks.ru/js/nxtconnect.js';

document.getElementById('buy').onclick = async () => {
  try {
    const res = await pay({
      to: 'nxt1...',                        // адрес продавца
      amount: 28 * NXT,                     // сумма в базовых единицах
      label: 'StackWorks',                  // как представиться
      message: 'Пробный товар',
      orderId: 'A-1024',                    // вернётся обратно как есть
    });
    // res.hash это хэш перевода. Проверять оплату надо на своём сервере,
    // запросом к ноде, а не верить тому, что пришло из браузера.
    console.log(res.hash, res.from, res.orderId);
  } catch (e) {
    console.log('не оплатили:', e.message);
  }
};

Как проверять оплату

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

GET https://nxt.stackworks.ru/tx/<хэш>

Ответ, например
  {
    "recipient": "nxt1...",
    "amount": 28000000,
    "confirmed": true,
    "in_mempool": false,
    "block_height": 3616,
    "confirmations": 13
  }

Проверить надо четыре вещи.
  recipient      совпадает с вашим адресом
  amount         не меньше выставленного счёта
  confirmed      true, иначе перевод ещё висит в очереди
  hash           такую транзакцию вы ещё не засчитывали

Пока confirmed равно false, перевод лежит в очереди и его ещё можно вытеснить другим с тем же номером. Засчитывать оплату по такому ответу нельзя: товар отдадите, а денег не будет. Блок выходит раз в шесть секунд, так что ждать недолго. Для крупных сумм разумно дождаться нескольких подтверждений, их число отдаётся в confirmations.

Что здесь безопасно, а что нет

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

Чего эта схема не делает. Она не защищает от продавца, который написал одну сумму на своей странице, а в запросе прислал другую. Именно поэтому кошелёк показывает свою цифру, взятую из запроса, и просит сверить её. И она не заменяет проверку на сервере, о которой выше.