Bạn sẽ tạo được một component React hiển thị mã QR Solana Pay cho khoản thanh toán USDC, chờ thanh toán được ghi nhận và kiểm tra xem khoản thanh toán có khớp với yêu cầu của bạn hay không. Bạn cần
Node.js 20+, một ứng dụng React hoặc Next.js (có thể dùng create-next-app mới tạo), và một
ví di động được đặt sang devnet. Hãy nạp USDC devnet từ faucet.circle.com và SOL
devnet từ faucet.solana.com để chi trả phí giao dịch.
@solana/pay hiện đang trong giai đoạn beta. Các API có thể thay đổi trước khi phát hành phiên bản ổn định.
1. Cài đặt Solana Pay
pnpm add @solana/pay@beta @solana/kit
2. Thêm mã QR thanh toán
Component này tạo một mã tham chiếu (reference) duy nhất cho đơn hàng, mã hóa mã đó vào URL
yêu cầu chuyển khoản, rồi
hiển thị URL dưới dạng mã QR. Sau đó, component theo dõi giao dịch có chứa
mã tham chiếu và xác thực người nhận, số tiền và token trước khi đánh dấu đơn hàng
là đã thanh toán. Hãy đặt MERCHANT_WALLET thành một địa chỉ do bạn kiểm soát:
"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 tính theo đơn vị token, nên 1 nghĩa là yêu cầu 1 USDC. Bỏ splToken để
yêu cầu SOL thay thế.
3. Nhận thanh toán
Hãy chạy ứng dụng, quét mã QR bằng ví của bạn và phê duyệt thanh toán. Khi giao dịch được xác nhận và vượt qua bước xác thực, component sẽ hiển thị chữ ký giao dịch. Chữ ký đó chính là biên nhận của bạn: hãy tra cứu bằng getTransaction hoặc trên bất kỳ trình khám phá blockchain nào.
Xác thực ngay trong trình duyệt là đủ cho bản demo. Trước khi xử lý các đơn hàng thật, hãy xác thực thanh toán trên máy chủ của bạn. Xem xác minh thanh toán.
Tiếp theo nên làm gì
- Solana Pay - yêu cầu chuyển khoản, yêu cầu giao dịch và các tùy chọn mã QR
- Cách thanh toán hoạt động trên Solana - ví, stablecoin, token account, và phí
- Xác minh thanh toán - xác nhận thanh toán phía server trước khi thực hiện đơn hàng
- Gửi thanh toán - thanh toán và chuyển tiền từ backend của bạn
- Sẵn sàng cho môi trường production - trước khi tiền thật được giao dịch
Is this page helpful?