開発

Stripe Payment Linksの使い方:ダッシュボードとAPIでの作成とWebhookでの注文処理

Stripe Payment Linksの使い方:ダッシュボードとAPIでの作成とWebhookでの注文処理

Stripe Payment Linksは、Stripeがホストする決済ページを、何度でも使えるURLとして発行する機能です。ダッシュボードで商品を選べばリンクができ、メールやSNS、QRコードで共有するだけで販売を始められます。この記事では、ダッシュボードでの作成手順、Payment Links APIでのリンク発行コード、注文IDを渡すURLパラメータ、購入ボタンの埋め込み、Webhookでリンク経由の支払いを判別する処理、そしてCheckoutへ移るべき条件までを解説します。仕様と料金の確認元は2026年10月時点の公式ドキュメントです。

まとめ|Stripe Payment Linksで決めるリンクの作り方と使える範囲の要点

固定価格の商品やサブスクリプションを、自社サイトなしで売り始めたい場合はPayment Linksで足ります。決済の受け付けに追加料金はなく、日本のアカウントではカード決済3.6%の手数料だけで動きます。

リンクを大量に作る、商品ごとに自動で作る、といった運用はAPIで行います。1本のリンクに載せられる商品は20項目までです。作ったリンクは削除できないため、販売を止めるときはactiveをfalseにして無効化します。

決済後の処理はcheckout.session.completedのWebhookで受け、payment_linkの値で発行元のリンクを判別します。カートの中身で金額が変わる販売や、会員IDと決済を確実に結び付けたい販売では、Payment Linksでは足りません。購入ごとにセッションを作るStripe Checkoutの実装へ進みます。

Stripe Payment Linksの仕組みと日本のアカウントでかかる手数料の内訳

最初に、Payment Linksがどの部品の上に作られているかを押さえておくと、後のAPIやWebhookの挙動が理解しやすくなります。

Checkoutの決済画面を再利用できるURLとして配るPayment Linksの構造

Payment Linksの公式ガイドでは、画面は「Stripeがオンラインで提供するページ」で、導入の手間は5段階の1と位置付けられています。顧客がリンクを開くたびに、そのリンクの設定からCheckout Sessionが作られ、決済はCheckoutの画面で進みます。

リンク自体はplink_で始まるIDを持つオブジェクトです。共有するURLはbuy.stripe.comのドメインで発行されます。Checkoutの上に作られているので、決済手段は40種類以上に対応し、領収書メールの自動送信やダッシュボードからの返金もコードなしで使えます。

見た目の自由度は低めです。変えられるのは事前設定の20種類のフォント、3種類の角丸、ロゴ、背景色、ボタン色に限られます。自社サイトのデザインに決済欄を溶け込ませる用途には向きません。

決済手数料3.6%と追加料金なし・独自ドメイン月10ドルの費用構造

Stripeの日本向け料金ページでは、2026年10月時点でカードとウォレットの決済手数料を3.6%としています。Payment Linksで決済を受け付けること自体は、標準の料金体系なら追加手数料なしで含まれます。

費用が増えるのはオプションを足したときです。

項目 料金(2026年10月時点) 発生する条件
カード・ウォレット決済 3.6% 決済が成功するたび
通貨換算 2%を加算 円以外の通貨で受け取るとき
独自ドメイン 月額10.00米ドル 決済ページを自社ドメインで出すとき
決済後の請求書 0.4%(上限2.00米ドル) 単発購入に請求書を発行するとき
Stripe Tax 0.5% 税の登録地域で自動計算するとき

海外の顧客に売る場合、Payment Linksでは顧客の現地通貨で払える仕組みが常に有効になっています。換算が発生する取引では2%の加算を粗利に含めて価格を決めてください。手数料体系の全体像は親記事のStripeとは?仕組み・手数料・実装パターンで整理しています。

ダッシュボードで決済リンクを作る手順と料金モデル2種類の選び方

コードを書かずに使う場合、作業はダッシュボードで完結します。最初に決めるのは料金モデルです。

商品・サブスクの決済リンクを作成して共有するまでの4ステップ

決済リンク作成の公式手順は、固定価格の商品やサブスクリプションなら次の4ステップです。

  1. ダッシュボードのPayment Linksページを開き、「+新規」をクリックする
  2. 既存の商品を選ぶか、「+新しい商品を追加」をクリックする
  3. 新しい商品なら商品名や価格を入力し、「商品を追加」をクリックする
  4. 「リンクを作成」をクリックし、発行されたURLをコピーする

作成画面では、住所・電話番号・氏名の収集、利用規約への同意チェック、プロモーションコードの入力欄、配送料も設定できます。共有方法はURLのコピーだけでなく、QRコードをPNG画像として書き出す方法も選択可能です。共有方法の公式ガイドによると、QRコードに有効期限はなく、元のリンクを無効にすると読み取った人は有効期限切れのページへ移ります。

顧客が金額を決めるリンクの既定上限10,000ドルと寄付・チップ用途

もう一つの料金モデルが「顧客が支払う金額を選択する」方式です。寄付、チップ、価格を買い手が決める販売に使います。推奨金額のプリセットと、最小・最大金額を設定できます。

最大金額の既定値は10,000.00米ドルで、引き上げにはStripeサポートへの申請が必要です。このモデルには制約が2つあります。継続支払いや継続的な寄付には使えません。APIで作る場合も、載せられる項目は1つで数量は1に固定です。iOSのダッシュボードアプリはこの方式のリンク作成に対応していないため、パソコンのブラウザで作ります。

Payment Links APIでリンクを発行する:curlとNode.jsのコード例

商品が数百点ある、商品マスタの登録と同時にリンクを作りたい、という運用ではAPIを使います。

Priceを先に作ってline_itemsへ渡すcurlリクエストの最小構成

Payment Linksは、ProductとPriceで販売内容を表します。Payment Link作成のAPIリファレンスでは、必須パラメータはline_itemsだけです。各項目にpriceとquantityを入れます。テスト用の秘密鍵で次の2本を順に実行すると、テスト環境のリンクが返ります。

# 1. 商品と価格を同時に作る(日本円は小数点なし。1,980円なら1980)
curl https://api.stripe.com/v1/prices \
  -u "sk_test_xxx:" \
  -d currency=jpy \
  -d unit_amount=1980 \
  -d "product_data[name]=オンライン講座 基礎編"

# 2. 返ってきた price の id を渡してリンクを作る
curl https://api.stripe.com/v1/payment_links \
  -u "sk_test_xxx:" \
  -d "line_items[0][price]=price_xxx" \
  -d "line_items[0][quantity]=1"

レスポンスのurlが共有用のURLで、テスト環境ではbuy.stripe.com/test_から始まります。price_dataは、リンクの作成と同時に商品と価格を作りたい場合に使うパラメータです。サブスクリプションにする場合はrecurring付きのPriceを渡し、subscription_data[trial_period_days]で無料期間を付けます。

stripe-node 23系で数量の変更と購入回数の上限を付けたリンク作成

Stripe公式のNode.jsライブラリは、2026年10月時点でnpmの最新が23.0.0です。npm install stripeで入れ、在庫50個の商品を1回あたり最大5個まで売るリンクを作る例を示します。

import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

const link = await stripe.paymentLinks.create({
  line_items: [{
    price: 'price_xxx',
    quantity: 1,
    // 顧客が決済画面で数量を変えられる。maximum の既定は99
    adjustable_quantity: { enabled: true, minimum: 1, maximum: 5 },
  }],
  // 決済が50回完了したらリンクを自動で無効にする
  restrictions: { completed_sessions: { limit: 50 } },
  inactive_message: '販売数に達したため受付を終了しました。',
  // リンクの metadata は、リンクから作られる Checkout Session にコピーされる
  metadata: { sku: 'COURSE-BASIC' },
  after_completion: {
    type: 'redirect',
    redirect: { url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}' },
  },
});

console.log(link.id, link.url); // plink_... と https://buy.stripe.com/...

APIリファレンスによると、adjustable_quantity.maximumは既定99で、999999まで指定できます。任意で追加できる商品(optional_items)は10個までで、通常の項目との合計は20個が上限です。restrictionsで数えるのは「完了した決済」です。上限の直前に複数の顧客が同時に決済画面を開いた場合の扱いは、公式ドキュメントに記載が見当たりません。1点物を売り越さずに売るなら、在庫の引当はリンクの外で行います。

作成後に変えられる項目とactive=falseで販売を止める手順

Payment Linksは作成後に削除できません。Payment Link更新のAPIリファレンスでは、activeをfalseにするとURLを開いた人に無効化のページが表示されると説明しています。再開するときはtrueに戻すだけです。

// 販売停止。表示する文言は500文字まで
await stripe.paymentLinks.update('plink_xxx', {
  active: false,
  inactive_message: '次回の販売は11月を予定しています。',
});

line_itemsやmetadata、支払い後の動作は更新で差し替えられます。価格改定のたびに新しいリンクを作ると、古いURLが共有先に残り続けます。商品ごとにリンクを1本に固定し、価格は更新で変えるほうが管理は楽です。

URLパラメータと購入ボタンで注文IDやメールアドレスを決済に渡す方法

Payment LinksのURLは誰が開いても同じです。誰の購入かを決済に結び付けるには、URLパラメータか購入ボタンの属性で情報を足します。

URLで渡す会員IDの文字種・200文字の上限とメールアドレスの事前入力

URLパラメータの公式ガイドによると、client_reference_idに自社の顧客IDや注文IDを付けると、その値がcheckout.session.completedのWebhookに入って届きます。使える文字は英数字、ダッシュ、アンダースコアで、最大200文字です。条件を外れた値は通知なく捨てられ、決済ページはそのまま動きます。

https://buy.stripe.com/test_xxx?client_reference_id=order_10293&prefilled_email=taro%40example.com&locale=ja&utm_source=newsletter

決済のカスタマイズに関する公式ガイドでは、prefilled_emailでメールアドレスを事前入力し、顧客に変更させたくない場合はlocked_prefilled_emailを使うと案内しています。prefilled_promo_codeはプロモーションコードを有効にしたリンクでだけ効きます。localeは表示言語の指定です。

注意点が1つあります。URLは転送や共有で想定外の場所に出るため、client_reference_idにパスワードやAPIキーなどの秘密情報を入れてはいけません。UTMはutm_sourceなど5種類に対応し、支払い後の動作をリダイレクトにしておけば戻り先のURLへ引き継がれます。

購入ボタンの埋め込みコードとCSPに足すjs.stripe.comの指定

自社サイトに購入ボタンを置く場合は、リンクの詳細画面で「購入ボタン」を選び、生成されたコードを貼ります。購入ボタンの公式ガイドの構成は、スクリプトの読み込みとWebコンポーネントの2つです。

<script async src="https://js.stripe.com/v3/buy-button.js"></script>
<stripe-buy-button
  buy-button-id="buy_btn_xxx"
  publishable-key="pk_test_xxx"
  client-reference-id="member_5521">
</stripe-buy-button>

属性のclient-reference-idはURLパラメータと同じ規則で、ログイン中の会員IDを埋め込めます。属性にcustomer-emailを足してメールアドレスを渡すと、顧客は決済画面でメールアドレスを編集できません。ボタンは公開可能キーで動くため、そのキーを無効にした場合は埋め込みコードも差し替えが必要です。

Content-Security-Policyを設定しているサイトでは、frame-srcとscript-srcにhttps://js.stripe.comを足します。ボタンの表示にはドメインが必要なので、ローカルで試すときはHTMLファイルを直接開かず、localhostのHTTPサーバーで配信してください。

決済後の注文処理:Webhookでリンク経由の支払いを判別して確定する

ノーコードで売るだけならダッシュボードの通知で足ります。自社の会員管理や発送システムに注文を流すときは、Webhookで受けます。

決済完了Webhookのpayment_linkで発行元リンクを特定する処理

支払い後の処理に関する公式ガイドでは、リンク経由の支払いが完了するとcheckout.session.completedが送られると説明しています。Checkout Sessionオブジェクトの仕様によると、そのセッションを作ったリンクのIDを持つフィールドはpayment_linkです。この値で、自社サイトのCheckoutからの注文とリンクからの注文を分けます。

import express from 'express';
import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
const app = express();

app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
  let event;
  try {
    event = stripe.webhooks.constructEvent(
      req.body, req.headers['stripe-signature'], process.env.STRIPE_WEBHOOK_SECRET
    );
  } catch {
    return res.status(400).send('invalid signature');
  }

  const session = event.data.object;
  const isPaidEvent = event.type === 'checkout.session.completed' ||
    event.type === 'checkout.session.async_payment_succeeded';

  // リンク経由の決済だけを扱い、未入金(コンビニ決済の支払い待ちなど)は確定しない
  if (isPaidEvent && session.payment_link && session.payment_status !== 'unpaid') {
    // 数量を顧客が変えられるため、購入内容は必ず取り直す
    const items = await stripe.checkout.sessions.listLineItems(session.id);
    await fulfillLinkOrder({
      sessionId: session.id,               // 二重処理を防ぐキーに使う
      linkId: session.payment_link,
      sku: session.metadata.sku,           // リンクの metadata がコピーされている
      memberId: session.client_reference_id,
      email: session.customer_details?.email,
      items: items.data.map((i) => ({ name: i.description, qty: i.quantity })),
      customFields: session.custom_fields,
    });
  }
  res.sendStatus(200);
});

fulfillLinkOrderは自社の確定処理を表す仮の関数です。同じイベントが複数回届く前提で、セッションIDで重複を弾いてください。署名検証と冪等処理の設計は決済Webhookの署名検証と冪等な注文確定で詳しく扱っています。

決済画面に追加できる入力欄は3つまでです。テキストは255文字、ドロップダウンはAPIで作れば200選択肢まで持てます。決済画面に追加した入力欄の値をWebhookで受け取るためのフィールドはcustom_fieldsです。公式ガイドは、この欄を個人情報や機密データの収集に使わないよう求めています。

リダイレクト先のCHECKOUT_SESSION_IDと入金まで2〜14日かかる決済手段

支払い後の動作は、Stripeの完了ページを出すhosted_confirmationと、自社ページへ戻すredirectの2種類です。戻り先URLに{CHECKOUT_SESSION_ID}を書くと、実際のセッションIDに置き換わります。戻り先ページで購入内容を表示するには、このIDでセッションを取得する構成です。注文の確定は戻り先ページでは行わず、上のWebhookに任せます。

口座振替や店舗支払いのように、決済の確定まで2〜14日かかる決済手段を有効にしている場合は、checkout.session.async_payment_succeededも受けます。注文のフルフィルメントの公式ガイドが、この2つのイベントを同じ確定処理に流す構成を示しています。コンビニ決済や銀行振込の有効化はStripeの決済方法を有効化する手順を参照してください。

リンクごとの閲覧数、売上件数、収入はダッシュボードの「決済と分析」タブで見られます。ただしデータは最大18時間遅れ、サンドボックスでは使えず、継続課金の価格を含むリンクは集計の対象外です。サブスクリプションの申込数を毎日追うなら、Webhookで受けた件数を自社側で数えます。

Payment LinksとCheckoutの使い分けと、リンク決済を採用しない場面

Payment LinksとCheckoutは同じ決済画面を使います。違いは、決済の中身を誰がいつ決めるかです。リンクは作成時に中身が固定され、Checkoutは購入のたびにサーバーが決めます。

Payment Linksで止めてよい条件:固定商品・少数SKU・照合が緩い販売

次の条件がそろうなら、Payment Linksで止めて構いません。開発に工数をかけるより、販売を始めて反応を見るほうが先です。

  • 商品と価格が固定で、商品数がリンクで管理できる程度に少ない
  • 購入者と自社の会員IDの紐付けが、client_reference_idや購入ボタンの属性で足りる
  • 在庫が十分にあり、売り越しが起きても後から調整できる
  • イベント参加費、セミナー、デジタル商品、月額会費の申込など、決済後の処理が単純

ノーコードで始めた販売でも、決済後の処理はWebhookで後から自動化できます。最初にリンクで売り、注文が増えてから確定処理だけを書く進め方で問題ありません。

Checkoutへ移る条件:カート連動の金額・在庫引当・会員との紐付け

次のどれかに当てはまる場合、Payment Linksでの運用は破綻します。Stripe Checkoutの実装方法に切り替えてください。

1つ目は、カートの中身や会員ランクで金額が変わる販売です。リンクの価格は作成時に決まるため、顧客ごとに金額を変えるには毎回リンクを作ることになり、削除できないリンクが積み上がります。2つ目は、在庫を決済前に引き当てたい販売です。Checkoutなら在庫を確保したうえで期限付きのセッションを作れます。3つ目は、会員IDとの紐付けを改ざんされたくない場合です。URLパラメータは利用者が書き換えられるため、サーバーで顧客を指定するCheckoutのほうが確実です。

請求先が決まった法人に金額を確定して請求するなら、Payment LinksではなくInvoicingを使います。公式ガイドの比較表でも、部分支払いや見積りから請求書への変換はPayment Linksの対象外とされています。サブスクリプションの更新や解約まで作り込む場合はStripe Billingの実装手順が次の段階です。

決済を基幹システムや会員基盤とつなぐときに外部へ設計を任せる条件

Payment Linksは単体で完結する一方、注文データが自社のシステムに残りません。販売管理や会計、会員基盤へ取り込む段階で、Webhookの受け口、重複処理、返金時の取り消し、リンクとSKUの対応表の管理が一度に必要になります。

社内にStripeのWebhookを運用した経験者がいない、決済と基幹システムの連携を同時に作る、Connectで売上を分配する、のいずれかに当てはまるなら、設計の段階から外部に相談したほうが手戻りは少なく済みます。一創では決済・サブスクリプションシステム開発として、Payment LinksやCheckoutの導入から基幹システムとの連携までを受託しています。

Stripe Payment Linksのよくある質問|削除・料金・テスト

Payment Linksを使い始めるときに確認されることの多い質問をまとめました。

Stripe Payment Linksは無料で使えますか?

Payment Linksで決済を受け付けること自体に追加料金はかかりません。日本のアカウントでは、2026年10月時点でカードとウォレットの決済ごとに3.6%の手数料が発生します。通貨換算が必要な取引は2%が加算されます。決済ページを独自ドメインで出す場合は月額10.00米ドルです。単発購入に請求書を発行すると、取引額の0.4%(1件あたり上限2.00米ドル)がかかります。

作成したPayment Linkは削除できますか?

削除はできません。販売を止めるときは、ダッシュボードのメニューから「無効にする」を選ぶか、APIでactiveをfalseに更新します。無効にしたリンクを開いた人への表示は、有効期限切れのページか、inactive_messageで設定した500文字までの文言です。販売を再開するときはactiveをtrueに戻せば、同じURLのまま使えます。

Payment LinksとCheckoutの違いは何ですか?

どちらも同じStripeの決済画面を使います。Payment Linksは中身を固定したURLを先に作って配る方式で、コードは不要です。Checkoutは購入のたびにサーバーでセッションを作る方式で、カートの中身や注文IDを決済に直接結び付けられます。金額が購入ごとに変わる販売や、在庫を引き当ててから決済させる販売ならCheckoutを選びます。

Payment Linksでサブスクリプションを販売できますか?

継続課金の価格を持つ商品も販売の対象です。ダッシュボードで継続課金の価格を持つ商品を選ぶか、APIでrecurring付きのPriceをline_itemsに渡します。subscription_data[trial_period_days]で無料期間を付けることもできます。ただし、顧客が金額を決める方式は継続支払いに対応していません。継続課金の価格を含むリンクは、ダッシュボードのリンク別分析の対象外です。

Payment Linksをテスト環境で試すにはどうすればよいですか?

ダッシュボードをテスト環境に切り替えてリンクを作るか、テスト用の秘密鍵でAPIを呼びます。発行されるURLはbuy.stripe.com/test_から始まり、実際の請求は発生しません。決済画面では、Stripeが用意したテスト用のカード番号を入力して完了や拒否を確かめます。番号の一覧はStripeテストカード一覧と使い方にまとめています。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.15 テックブログ リゾートトラスト不正アクセス:会員2.6万件・カハラ横浜3.6万件の対象確認と窓口
  2. 2025.09.03 コラム ストループ効果とは?原典1935年の実測値と年齢別の平均・テストのやり方
  3. 2026.10.16 テックブログ バーガーキング不正アクセスで約1,118万件の情報漏洩|対象確認・案内メールの真偽と運営側のログ点検
  4. 2025.09.03 コラム Google AIモードの履歴の消し方と残る理由|いつまで残るか・使い方・オフにする方法【2026年10月】
  5. 2026.01.20 テックブログ PineDramaとは?TikTokのショートドラマアプリの日本配信・料金・安全性を解説

RELATED POSTS 関連記事

目次