Quickstart: chấp nhận thanh toán

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ì

Is this page helpful?

Mục lục

Chỉnh sửa trang