Приём оплаты на своём сайте
Сайт, которому нужно принимать 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.
Что здесь безопасно, а что нет
Приватный ключ не покидает браузер покупателя и продавцу не показывается. Продавец не может подписать перевод сам, списать больше запрошенного или повторить платёж: каждый запрос подтверждается человеком вручную в окне на домене кошелька.
Чего эта схема не делает. Она не защищает от продавца, который написал одну сумму на своей странице, а в запросе прислал другую. Именно поэтому кошелёк показывает свою цифру, взятую из запроса, и просит сверить её. И она не заменяет проверку на сервере, о которой выше.