ドキュメントStripe Checkout

03 · 売上

Stripe Checkout の売上を訪問に紐づける

サーバーでセッションを作成する箇所に、小さな変更を 2 つ加えます。メタデータに訪問者 ID を入れることと、完了ページにセッションの ID を渡すことです。

01メタデータで訪問者 ID を渡す

サーバーで Checkout Session を作成する箇所で _tally_vid Cookie を読み取り、metadata に tally_visitor_id として渡します。サブスクリプションでは subscription_data.metadata にも渡しておくと、更新分が初回決済を引き継ぎます。payment モードでは subscription_data を省いてください。Stripe はこれをサブスクリプションでしか受け付けません。

コードを表示

// Express with cookie-parser (app.use(require('cookie-parser')())), where you create
// the Checkout Session; stripe = require('stripe')(process.env.STRIPE_SECRET_KEY).
app.post('/checkout', async (req, res) => {
  const visitorId = req.cookies['_tally_vid'];
  const metadata = visitorId ? { 'tally_visitor_id': visitorId } : {};
  const session = await stripe.checkout.sessions.create({
    mode: 'subscription',
    line_items: [{ price: 'price_123', quantity: 1 }],
    success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
    metadata,
    // Renewals read the subscription's metadata. In payment mode, leave this line out.
    subscription_data: { metadata },
  });
  res.redirect(303, session.url);
});

// app/api/checkout/route.ts
import { cookies } from 'next/headers';
import Stripe from 'stripe';

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

export async function POST() {
  const visitorId = (await cookies()).get('_tally_vid')?.value;
  const metadata: Record<string, string> = visitorId ? { 'tally_visitor_id': visitorId } : {};
  const session = await stripe.checkout.sessions.create({
    mode: 'subscription',
    line_items: [{ price: 'price_123', quantity: 1 }],
    success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
    metadata,
    // Renewals read the subscription's metadata. In payment mode, leave this line out.
    subscription_data: { metadata },
  });
  return Response.json({ url: session.url });
}

# Flask, where you create the Checkout Session (stripe.api_key is your secret key).
import stripe
from flask import redirect, request


@app.post("/checkout")
def checkout():
    visitor_id = request.cookies.get("_tally_vid")
    metadata = {"tally_visitor_id": visitor_id} if visitor_id else {}
    session = stripe.checkout.Session.create(
        mode="subscription",
        line_items=[{"price": "price_123", "quantity": 1}],
        success_url="https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}",
        metadata=metadata,
        # Renewals read the subscription's metadata. In payment mode, leave this line out.
        subscription_data={"metadata": metadata},
    )
    return redirect(session.url, code=303)

# Rails: app/controllers/checkouts_controller.rb (Stripe.api_key is your secret key).
class CheckoutsController < ApplicationController
  def create
    visitor_id = cookies['_tally_vid']
    metadata = visitor_id ? { 'tally_visitor_id' => visitor_id } : {}
    session = Stripe::Checkout::Session.create(
      mode: 'subscription',
      line_items: [{ price: 'price_123', quantity: 1 }],
      success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
      metadata: metadata,
      # Renewals read the subscription's metadata. In payment mode, leave this line out.
      subscription_data: { metadata: metadata }
    )
    redirect_to session.url, allow_other_host: true, status: :see_other
  end
end

<?php
// Where you create the Checkout Session (stripe/stripe-php).
$stripe = new \Stripe\StripeClient(getenv('STRIPE_SECRET_KEY'));

$visitorId = $_COOKIE['_tally_vid'] ?? null;
$metadata = $visitorId ? ['tally_visitor_id' => $visitorId] : [];

$session = $stripe->checkout->sessions->create([
  'mode' => 'subscription',
  'line_items' => [['price' => 'price_123', 'quantity' => 1]],
  'success_url' => 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
  'metadata' => $metadata,
  // Renewals read the subscription's metadata. In payment mode, leave this line out.
  'subscription_data' => ['metadata' => $metadata],
]);

header('Location: ' . $session->url, true, 303);

02完了ページにセッションの ID を渡す

自分のページのアドレスにした success_url(埋め込み型の Checkout では return_url)に ?session_id={CHECKOUT_SESSION_ID} を付けます。Stripe がセッションの ID を埋め込み、そのページのスニペットがそれを送信するので、Cookie を読み取れなかった場合でも決済が紐づきます。checkout_session_id パラメーターも使えます。

完了 URL
https://yoursite.com/thanks?session_id={CHECKOUT_SESSION_ID}

03Cookie なしのサイトの場合

Cookie がないとメタデータに入れる ID もないため、決済が訪問を見つける手段は完了ページになります。Cookie なしの訪問者は 1 日だけ有効なので、決済はその日の訪問に紐づきます。

04うまくいったか確認する

足りない情報や、実際の画面と違う点はありませんか? どのページかを添えて support@tallybyoutpost.com までお知らせください。