最終的には、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コードを追加する
このコンポーネントは、注文ごとに一意のリファレンスを作成し、それを転送リクエストの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のリクエストを意味します。代わりにSOLをリクエストする場合は、splTokenを指定しないでください。
3. 支払いを受け取る
アプリを実行し、ウォレットでQRコードをスキャンして、支払いを承認します。トランザクションが確定して検証を通過すると、コンポーネントにトランザクションシグネチャが表示されます。このシグネチャが領収書の役割を果たします。getTransactionまたは任意のエクスプローラーで照会できます。
ブラウザ上での検証はデモであれば問題ありません。実際の注文を処理する前に、サーバーで支払いを検証してください。支払いの検証を参照してください。
次のステップ
- Solana Pay - 転送リクエスト、トランザクションリクエスト、QRコードのオプション
- Solanaでの支払いの仕組み - ウォレット、ステーブルコイン、token account、および手数料
- 支払いの確認 - 注文を処理する前にサーバーサイドで支払いを確認する
- 支払いの送信 - 自社バックエンドからの支払いと送金
- 本番環境への対応 - 実際の資金が動く前に
Is this page helpful?