メインコンテンツへスキップ
事前に作成された checkout session に基づいてサブスクリプション注文を作成します。PSP の決済 URL を返却するため、買い手をリダイレクトして支払いを完了させるとサブスクリプションが開始します。
POST /v1/actions/subscription-order/create-order
認証: Session Token — Customer Endpoints を参照(customer または shopper ロール)

動作

  • 価格スナップショット:注文作成時にサブスクリプション価格を凍結します(price_snapshot)。二段階価格(regularPhase + オプションの specialPhase、後者は試用期間用)をサポート。
  • 請求期間のマッピングweekly -> week/1monthly -> month/1quarterly -> month/3yearly -> year/1
  • PSP フォールトトレランス:PSP 呼び出しが失敗した場合、ローカル注文は自動的にキャンセルされエラーが返却されます。
  • Session プリフィル:リクエストボディの billingDetailbuyerEmail は session 上のプリフィル値を上書きします。両方とも欠落している場合は 400 で拒否。
  • メール正規化buyerEmail は使用前に trim().toLowerCase() で正規化されます。
以下のフィールドは session から取得されるため、リクエストボディに含めないでください:storeIdproductIdbillingPeriodcurrency。送信されても無視されます。

リクエストボディ

フィールド必須説明
checkoutSessionIdstring必須create-checkout-session から返された checkout session ID
billingDetailobject条件付き必須買い手の請求情報。session にプリフィルされていない場合は必須
billingDetail.countrystringbillingDetail がある場合は必須国コード(ISO 3166-1 alpha-2)
billingDetail.isBusinessbooleanbillingDetail がある場合は必須法人購入かどうか
billingDetail.postcodestring任意郵便番号
billingDetail.statestringUS/CA は必須州 / 省コード
billingDetail.businessNamestringisBusiness=true の場合は必須法人名
billingDetail.taxIdstringEU 法人買い手の場合は必須税番号(例:DE123456789
buyerEmailstring条件付き必須買い手のメールアドレス。session にプリフィルされていない場合は必須
buyerIpstring任意買い手の IP アドレス(税計算に使用)
successUrlstring任意決済後のリダイレクト URL。session レベルの値を上書き

リクエスト例

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

const client = new WaffoPancake({
  sessionToken: window.WAFFO_SESSION_TOKEN, // マーチャントのポータルから注入
  environment: "prod",
});

const result = await client.orders.createSubscriptionOrder({
  checkoutSessionId: "cs_550e8400-e29b-41d4-a716-446655440000",
  billingDetail: {
    country: "DE",
    isBusiness: true,
    businessName: "Acme GmbH",
    taxId: "DE123456789",
  },
  buyerEmail: "customer@example.com",
  successUrl: "https://myapp.com/subscription/success",
});

console.log(result.checkoutUrl);

成功レスポンス (200)

{
  "data": {
    "checkoutUrl": "https://checkout.stripe.com/c/pay/cs_xxx"
  }
}

レスポンスフィールド

フィールド説明
checkoutUrlstringPSP 決済ページの URL。買い手をリダイレクトして支払いを完了させる

エラー

リトライポリシー:4xx は一切リトライしない — リクエストを修正してから再送信。5xx は指数バックオフでリトライ(5s 開始、最大 3 回)。
ステータスerrors[0].message意味推奨処理
400Invalid JSON bodyリクエストボディが有効な JSON ではないリクエストボディを修正してから再送信
400Missing required field: checkoutSessionIdcheckoutSessionId が提供されていないリクエストボディを修正してから再送信
400Session product type mismatch: expected subscriptionSession が非サブスクリプション製品で作成されているサブスクリプション製品で作成された session を使用
400Environment mismatch between request and sessionリクエストの X-Environment が session の環境と一致しないリクエスト環境を session 環境に合わせる
400Session missing subscription information (productVersionId or billingPeriod)Session に必須のサブスクリプションフィールドが欠落Checkout session を再作成
400Missing billingDetail: provide in request body or pre-fill in checkout sessionボディと session の両方に billingDetail がないリクエストボディに billingDetail を含めて再送信
400State is required for US/CAUS / CA の買い手には billingDetail.state が必須billingDetail.state を追加して再送信
401Authentication failedSession token が無効、期限切れ、または不正な形式Issue Session Token で再発行
403Session does not belong to this storeSession が別のストアに属しているSession のストア所有権を確認
409Checkout session invalid, please re-enter checkoutSession が存在しないか期限切れCheckout session を再作成
500Internal server errorサーバ側の予期しない障害指数バックオフでリトライ(5s 開始、最大 3 回)