В результате вы получите React-компонент, который показывает QR-код Solana Pay для платежа в USDC, ожидает поступления платежа и проверяет, что он соответствует запрошенному. Вам понадобятся Node.js 20+, приложение на React или Next.js (подойдёт свежий create-next-app) и мобильный кошелёк, переключённый на devnet. Пополните его USDC в devnet на faucet.circle.com и SOL в devnet на faucet.solana.com, чтобы оплачивать комиссии за транзакции.
@solana/pay в настоящее время находится в бета-версии. API может измениться до стабильного релиза.
1. Установите Solana Pay
pnpm add @solana/pay@beta @solana/kit
2. Добавьте QR-код для оплаты
Компонент создаёт уникальную ссылку (reference) для заказа, кодирует её в URL запроса на перевод и отображает этот URL в виде QR-кода. Затем он отслеживает транзакцию, содержащую эту ссылку, и проверяет получателя, сумму и токен, прежде чем пометить заказ как оплаченный. Укажите в MERCHANT_WALLET адрес, который вы контролируете:
"use client";import { useEffect, useRef, useState } from "react";import {address,createSolanaRpc,createSolanaRpcSubscriptions,generateKeyPair,getAddressFromPublicKey} from "@solana/kit";import {createQR,encodeURL,validateTransfer,watchReference} from "@solana/pay";const MERCHANT_WALLET = address("your-wallet-address");const USDC_DEVNET = address("4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU");const AMOUNT = 1;const rpc = createSolanaRpc("https://api.devnet.solana.com");const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");export function Checkout() {const qrRef = useRef<HTMLDivElement>(null);const [signature, setSignature] = useState<string | null>(null);useEffect(() => {const abortController = new AbortController();async function startPayment() {const keyPair = await generateKeyPair();const reference = await getAddressFromPublicKey(keyPair.publicKey);const url = encodeURL({recipient: MERCHANT_WALLET,amount: AMOUNT,splToken: USDC_DEVNET,reference,label: "My Store",message: "Order #1001"});if (abortController.signal.aborted) return;if (qrRef.current) {qrRef.current.innerHTML = "";createQR(url, 300).append(qrRef.current);}const result = await watchReference(rpcSubscriptions, reference, {abortSignal: abortController.signal});if (result.err) throw new Error("Payment transaction failed");await validateTransfer(rpc, result.signature, {recipient: MERCHANT_WALLET,amount: AMOUNT,splToken: USDC_DEVNET,reference});setSignature(result.signature);}startPayment().catch((error) => {if (!abortController.signal.aborted) console.error(error);});return () => abortController.abort();}, []);if (signature) return <p>Payment confirmed: {signature}</p>;return <div ref={qrRef} />;}
amount указывается в единицах токена, поэтому 1 запрашивает 1 USDC. Не указывайте splToken, чтобы запросить SOL.
3. Примите платёж
Запустите приложение, отсканируйте QR-код кошельком и подтвердите платёж. Как только транзакция подтвердится и пройдёт проверку, компонент покажет подпись транзакции. Эта подпись — ваша квитанция: найдите её с помощью getTransaction или в любом обозревателе.
Проверки в браузере достаточно для демо. Прежде чем выполнять реальные заказы, проверяйте платежи на своём сервере. См. проверку платежей.
Что дальше
- Solana Pay — запросы на перевод, запросы на транзакции и параметры QR-кода
- Как работают платежи в Solana — кошельки, стейблкоины, token account и комиссии
- Верификация платежей — подтверждение платежа на стороне сервера перед выполнением заказа
- Отправка платежей — выплаты и переводы из вашего собственного бэкенда
- Готовность к продакшену — перед тем как начнут двигаться реальные деньги
Is this page helpful?