Serverとして使う
APIやコンテンツを提供し、JPYCで収益を得る方法を解説します。
セットアップ手順
- /dashboardでAPIキーを発行
ログインして「新規発行」からAPIキーと受取アドレスを登録します。 発行したキーと受取アドレスは、Facilitatorが送金先としてDBの値を強制的に採用します (paymentRequirements.payToが登録アドレスと一致しない場合は400で拒否されます)。 - 受け取りアドレスを登録
APIキー発行時にJPYCの受取先EVMアドレスを設定します。 - サーバーに402レスポンスを実装
支払いが必要なエンドポイントでpaymentRequirementsを含む402レスポンスを返し、クライアントからのPAYMENT-SIGNATUREヘッダーを受け取ります。 - Facilitatorに検証と送金を依頼
/verifyで署名・nonce・金額を検証し、成功したら/settleでオンチェーン送金を実行します。 - 環境変数を設定
X402_API_KEYとX402_FACILITATOR_URL、RECIPIENT_ADDRESSを環境変数に設定します。
サンプルコード(Express)
import express from "express";
const app = express();
const X402_FACILITATOR_URL =
process.env.X402_FACILITATOR_URL || "https://yen402.com";
const X402_API_KEY = process.env.X402_API_KEY!; // /dashboard で発行
const RECIPIENT_ADDRESS = process.env.RECIPIENT_ADDRESS!; // JPYC 受取アドレス
const JPYC_ASSET = "0xe7c3d8c9a439fede00d2600032d5db0be71c3c29";
const paymentRequirements = {
scheme: "exact",
network: "eip155:137", // Polygon mainnet (CAIP-2)
asset: JPYC_ASSET,
amount: "1000000000000000000", // 1 JPYC (18 decimals)
payTo: RECIPIENT_ADDRESS,
extra: { name: "JPY Coin", version: "1" }, // EIP-712 domain
};
// 有料エンドポイント
app.get("/api/premium", async (req, res) => {
// x402 v2: PAYMENT-SIGNATURE ヘッダーに base64 エンコードされた
// paymentPayload が入る
const header = req.headers["payment-signature"];
if (!header) {
return res.status(402).json({
x402Version: 2,
accepts: [paymentRequirements],
});
}
const paymentPayload = JSON.parse(
Buffer.from(String(header), "base64").toString("utf-8"),
);
const body = JSON.stringify({ paymentPayload, paymentRequirements });
const headers = {
"Content-Type": "application/json",
"X-API-Key": X402_API_KEY, // facilitator 認証
};
// 1) verify: 署名・nonce・残高条件をチェック(オンチェーン書き込みなし)
const verifyRes = await fetch(`${X402_FACILITATOR_URL}/verify`, {
method: "POST",
headers,
body,
});
const verify = await verifyRes.json();
if (!verifyRes.ok || !verify.isValid) {
return res.status(402).json({ error: verify.error ?? "verify failed" });
}
// 2) settle: transferWithAuthorization をブロードキャスト
const settleRes = await fetch(`${X402_FACILITATOR_URL}/settle`, {
method: "POST",
headers,
body,
});
const settle = await settleRes.json();
if (!settleRes.ok || !settle.success) {
return res.status(402).json({ error: settle.error ?? "settle failed" });
}
// PAYMENT-RESPONSE に settle 結果を base64 で載せてクライアントへ
res.setHeader(
"PAYMENT-RESPONSE",
Buffer.from(JSON.stringify(settle)).toString("base64"),
);
res.json({ data: "Premium content here" });
});
app.listen(3000);verify と settle が2段階に分かれているのは x402 v2 仕様です。 verify はオンチェーン書き込みを伴わない検証のみ、settle でtransferWithAuthorizationをブロードキャストします。
環境変数
X402_API_KEY/dashboardで発行したAPIキー
X402_FACILITATOR_URLFacilitatorエンドポイント(例: https://yen402.com)。 SDKの規約どおり/verifyや/settleが付与されます。
RECIPIENT_ADDRESSJPYC受取用EVMアドレス。DB登録値と一致させる必要があります。 登録値はGET /payment-info(X-API-Keyヘッダー必須)で確認できます。
Claude Code ではじめる
最速でサーバー実装を動かすには Claude Code を使ってください。以下のプロンプトをそのまま貼り付けるだけで、クローンから起動まで一緒に進めてくれます。
こんにちは Claude。
https://github.com/kakedashi3/x402-jpyc-example.git を今いるディレクトリにクローンして。
それから README.md を読んで。x402 × JPYC のサーバーをローカルで動かしたい。
server/ ディレクトリの npm install、.env の設定(X402_API_KEY・X402_FACILITATOR_URL・RECIPIENT_ADDRESS)、開発サーバーの起動まで一緒に進めて。