メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.waffo.ai/llms.txt

Use this file to discover all available pages before exploring further.

SDKs & ライブラリ

Waffo Pancake は TypeScript と Next.js の公式 SDK、および直接 API アクセスを提供しています。

統合レベルの選択

Next.js SDK

最速 — ドロップインのコンポーネント、Hooks、Server Actions。チェックアウト UI、Webhook ルーティング、購入者セルフサービスを内蔵。npm install @waffo/pancake-nextjs

TypeScript SDK

柔軟 — 自動署名、型付きレスポンス、Webhook 検証を備えた完全な API カバレッジ。あらゆる Node.js フレームワークで使用可能。npm install @waffo/pancake-ts

直接 API

完全制御 — 書き込みは REST エンドポイント、読み取りは GraphQL。署名と検証を自前で実装。任意の言語。
Next.js プロジェクト@waffo/pancake-nextjs から始めましょう — @waffo/pancake-ts をラップし、React コンポーネントと Server Actions を追加します。高度なユースケースでは、TypeScript SDK や生の API 呼び出しにいつでも切り替えられます。

TypeScript SDK

@waffo/pancake-ts

npm 上の公式 TypeScript SDK

インストール

npm install @waffo/pancake-ts

特徴

  • ランタイム依存ゼロ、ESM + CJS、Node >= 20
  • リクエスト署名の自動化と決定的冪等キー
  • 完全な TypeScript 型定義(15 enum、40+ インターフェース)
  • 組み込み公開鍵による Webhook 署名検証(テスト/本番)

クイックスタート

import { WaffoPancake } from "@waffo/pancake-ts";

const client = new WaffoPancake({
  merchantId: process.env.WAFFO_MERCHANT_ID!,
  privateKey: process.env.WAFFO_PRIVATE_KEY!,
});

// ストアを作成
const { store } = await client.stores.create({ name: "My Store" });

// 単発商品を作成
const { product } = await client.onetimeProducts.create({
  storeId: store.id,
  name: "E-Book: TypeScript Handbook",
  prices: {
    USD: { amount: "29.00", taxIncluded: false, taxCategory: "digital_goods" },
  },
});

// チェックアウトセッションを作成
const session = await client.checkout.createSession({
  productId: product.id,
  currency: "USD",
});
// => 消費者を session.checkoutUrl にリダイレクト

設定

パラメータ必須説明
merchantIdstringはいマーチャント ID
privateKeystringはいRSA 秘密鍵(PEM、base64、生データ — 自動正規化)
baseUrlstringいいえAPI ベース URL(デフォルト:本番環境)
fetchtypeof fetchいいえカスタム fetch 実装

利用可能なリソース

ネームスペースメソッド説明
client.storescreate() update() delete()ストア管理
client.onetimeProductscreate() update() publish() updateStatus()単発商品 CRUD
client.subscriptionProductscreate() update() publish() updateStatus()サブスクリプション商品 CRUD
client.subscriptionProductGroupscreate() update() delete() publish()商品グループ(共有トライアル)
client.orderscancelSubscription()注文管理
client.checkoutcreateSession()チェックアウトセッション作成
client.graphqlquery<T>()型付き GraphQL クエリ
client.authissueSessionToken()チェックアウト用の購入者セッショントークン発行
client.webhooksverify()Webhook 署名検証

チェックアウトモード

SDK は、購入者の身元を把握しているかどうかに基づいて2つのチェックアウトモードをサポートしています:
モードメソッド購入者IDフォームユースケース
認証済みcheckout.authenticated.create()マーチャントが提供事前入力済みユーザーアカウントのあるサイト
匿名checkout.anonymous.create()提供なしテンプレートストア、共有リンク
**購入者を把握している場合は、必ず認証済みチェックアウトを使用してください。**認証済みチェックアウトは、注文をあなたが提供する buyerIdentity に紐付けます — マーチャントが管理する安定した識別子です。これがない場合:
  • トライアル悪用:購入者がメールアドレスを変更するだけで無制限に無料トライアルを取得可能
  • 注文の紐付け解除:異なるメールは異なるユーザーとして扱われる
  • セルフサービス不可:購入者はカスタマーポータルで注文管理ができない

認証済みチェックアウト(推奨)

const result = await client.checkout.authenticated.create({
  productId: "PROD_xxx",
  currency: "USD",
  buyerIdentity: "userIdInYourSystem",
});
// Redirect: res.redirect(result.checkoutUrl) or window.location.href = result.checkoutUrl
buyerIdentity は注文帰属とトライアル追跡にのみ使用され、チェックアウトページには表示されません。チェックアウトフォームのメール欄を事前入力するには、buyerEmail を明示的に渡してください。
動的価格設定とトライアル制御:
const result = await client.checkout.authenticated.create({
  productId: "PROD_xxx",
  currency: "USD",
  buyerIdentity: "userIdInYourSystem",
  buyerEmail: "customer@example.com",
  priceSnapshot: { amount: "19.99", taxCategory: "digital_goods" },
  withTrial: true,
  billingDetail: { country: "US", isBusiness: false },
  successUrl: "https://example.com/thank-you",
});

匿名チェックアウト

const result = await client.checkout.anonymous.create({
  productId: "PROD_xxx",
  currency: "USD",
});
// priceSnapshot と withTrial もサポート

Webhook 検証

import { verifyWebhook, WebhookEventType } from "@waffo/pancake-ts";

// Express(生の body を使用 — パース済み JSON は署名検証を壊す)
app.post("/webhooks", express.raw({ type: "application/json" }), (req, res) => {
  try {
    const event = verifyWebhook(
      req.body.toString("utf-8"),
      req.headers["x-waffo-signature"] as string,
    );
    res.status(200).send("OK");

    switch (event.eventType) {
      case WebhookEventType.OrderCompleted:
        // 注文完了を処理
        break;
      case WebhookEventType.SubscriptionActivated:
        // サブスクリプション有効化を処理
        break;
    }
  } catch {
    res.status(401).send("Invalid signature");
  }
});

// Next.js App Router
export async function POST(request: Request) {
  const body = await request.text();
  const sig = request.headers.get("x-waffo-signature");
  try {
    const event = verifyWebhook(body, sig);
    // イベントを処理 ...
    return new Response("OK");
  } catch {
    return new Response("Invalid signature", { status: 401 });
  }
}

エラーハンドリング

import { WaffoPancakeError } from "@waffo/pancake-ts";

try {
  await client.stores.create({ name: "" });
} catch (err) {
  if (err instanceof WaffoPancakeError) {
    console.log(err.status);  // 400
    console.log(err.errors);  // [{ message: "...", layer: "store" }, ...]
  }
}

Next.js SDK

@waffo/pancake-nextjs

公式 Next.js SDK — コンポーネント、Hooks、Server Actions

インストール

npm install @waffo/pancake-nextjs
ピア依存として @waffo/pancake-ts が必要です。Next.js 14+ App Router で動作します。

クライアントエクスポート

エクスポートタイプ説明
CheckoutButtonコンポーネント3モードのチェックアウトボタン(リンク / 匿名 / 認証済み)
WaffoPancakeProviderコンポーネント自動トークンライフサイクル付きの購入者セルフサービスコンテキスト
useCheckout()Hookプログラムによるチェックアウト制御
useBuyer()Hook購入者セルフサービスアクション(キャンセル、返金、再開、クエリ)
useBuyerOrders()Hook購入者の注文を取得
useBuyerPayments()Hook購入者の支払い記録を取得
useBuyerRefundTickets()Hook購入者の返金チケットを取得
useMerchantOrders()Hookマーチャントダッシュボードの注文
useMerchantSales()Hookマーチャントの売上概要
useMerchantSubscriptions()Hookマーチャントのサブスクリプション概要
Webhookルートハンドラー自動署名検証とイベントディスパッチ

サーバーエクスポート (@waffo/pancake-nextjs/server)

エクスポート説明
createCheckoutAction(config)Server Action: チェックアウトセッション作成
createBuyerTokenAction(config)Server Action: 購入者セッショントークン発行
createBuyerSessionAction(config)Server Action: 購入者セルフサービス操作
createMerchantQueryAction(config)Server Action: マーチャント GraphQL クエリ

クイック例

// app/lib/actions.ts
"use server";
import { createCheckoutAction, createBuyerTokenAction } from "@waffo/pancake-nextjs/server";

const config = {
  merchantId: process.env.WAFFO_MERCHANT_ID!,
  privateKey: process.env.WAFFO_PRIVATE_KEY!,
};

export const checkoutAction = createCheckoutAction(config);
export const issueBuyerToken = createBuyerTokenAction(config);
// app/components/BuyButton.tsx
"use client";
import { CheckoutButton } from "@waffo/pancake-nextjs";
import { checkoutAction } from "@/app/lib/actions";

export function BuyButton({ productId }: { productId: string }) {
  return (
    <CheckoutButton
      type="authenticated"
      action={checkoutAction}
      productId={productId}
      currency="USD"
      buyerIdentity={user.email}
    >
      Subscribe Now
    </CheckoutButton>
  );
}

Webhook ルートハンドラー

// app/api/webhooks/waffo/route.ts
import { Webhook } from "@waffo/pancake-nextjs";

export const POST = Webhook({
  onOrderCompleted: async (event) => {
    // デジタル商品を配信
  },
  onSubscriptionActivated: async (event) => {
    // アクセスをプロビジョニング
  },
  onSubscriptionCanceled: async (event) => {
    // アクセスを取り消し
  },
});

Next.js ガイド

ステップバイステップの Next.js 統合ガイド。

直接 API アクセス

REST および GraphQL API を直接利用することもできます。API Key 認証は SDK が自動処理するため、手動でヘッダーを設定する必要はありません。
// 商品を作成
const { product } = await client.onetimeProducts.create({
  storeId: "your-store-uuid",
  name: "My Product",
  prices: {
    USD: { amount: "29.00", taxIncluded: false, taxCategory: "saas" },
  },
});

// GraphQL でデータをクエリ
const data = await client.graphql.query<{ stores: Array<{ id: string; name: string; status: string }> }>(
  `{ stores { id name status } }`
);

SDK ロードマップ

言語ステータス
Node.js / TypeScript公開済み — @waffo/pancake-ts
Next.js公開済み — @waffo/pancake-nextjs
Python計画中
Go計画中
PHP計画中

フレームワークガイド

Next.js

Next.js と Server Actions で構築。

チェックアウトセッション

プログラムでチェックアウトフローを作成。

サブスクリプション

定期課金の実装。

Webhooks

リアルタイムのイベント通知を受信。

API リファレンス

エンドポイントの完全なドキュメント:

API リファレンス

REST および GraphQL API の完全なドキュメント。