クイックスタート:支払いを受け付ける

最終的には、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または任意のエクスプローラーで照会できます。

ブラウザ上での検証はデモであれば問題ありません。実際の注文を処理する前に、サーバーで支払いを検証してください。支払いの検証を参照してください。

次のステップ

Is this page helpful?

目次

ページを編集
© 2026 Solana Foundation. 無断転載を禁じます。