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 パラメーターも使えます。
https://yoursite.com/thanks?session_id={CHECKOUT_SESSION_ID}04うまくいったか確認する
足りない情報や、実際の画面と違う点はありませんか? どのページかを添えて support@tallybyoutpost.com までお知らせください。