Швидкий старт: прийом платежу

У результаті ви отримаєте React-компонент, який показує QR-код Solana Pay для платежу в USDC, очікує надходження платежу та перевіряє, чи він відповідає запитаному. Вам знадобляться Node.js 20+, додаток на React або Next.js (щойно створений create-next-app підійде) і мобільний гаманець, налаштований на devnet. Поповніть його демонстраційними USDC (devnet) на faucet.circle.com та devnet SOL на faucet.solana.com, щоб покрити комісії за транзакції.

@solana/pay наразі перебуває в бета-версії. API може змінитися до стабільного релізу.

1. Встановіть Solana Pay

pnpm add @solana/pay@beta @solana/kit

2. Додайте QR-код для оплати

Компонент створює унікальний референс для замовлення, кодує його в 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 або в будь-якому провіднику блоків.

Перевірка в браузері підходить для демо. Перш ніж виконувати реальні замовлення, перевіряйте платежі на своєму сервері. Див. перевірка платежів.

Що робити далі

Is this page helpful?

Зміст

Редагувати сторінку