최종적으로 USDC 결제용 Solana Pay QR 코드를 표시하고, 결제가 반영될 때까지 기다린 뒤, 요청한 내용과 일치하는지 확인하는 React 컴포넌트가 만들어집니다. Node.js 20 이상, React 또는 Next.js 앱(새로 생성한 create-next-app도 가능), 그리고 devnet으로 설정한 모바일 지갑이 필요합니다. faucet.circle.com에서 devnet USDC를, faucet.solana.com에서 devnet SOL을 받아 지갑에 채워 트랜잭션 수수료를 충당하세요.
@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?