03 · Umsatz
Stripe-Checkout-Verkäufe mit ihren Besuchen verknüpfen
Zwei kleine Änderungen dort, wo dein Server die Session erstellt: die Besucher-ID in den Metadaten und die ID der Session auf deiner Erfolgsseite.
01Die Besucher-ID in den Metadaten übergeben
Wo dein Server die Checkout Session erstellt, lies das Cookie _tally_vid und übergib es als tally_visitor_id in metadata. Bei einem Abo übergib es auch in subscription_data.metadata, damit seine Verlängerungen der ersten Zahlung folgen. Im Payment-Modus lass subscription_data weg: Stripe nimmt es nur für Abos an.
// 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);
02Die ID der Session auf deiner Erfolgsseite behalten
Hänge ?session_id={CHECKOUT_SESSION_ID} an success_url an (bei eingebettetem Checkout an return_url), mit der Adresse deiner eigenen Seite. Stripe setzt die ID der Session ein, und das Snippet auf dieser Seite meldet sie, sodass die Zahlung auch dann verknüpft wird, wenn das Cookie nicht gelesen werden konnte. Ein Parameter checkout_session_id geht auch.
https://yoursite.com/thanks?session_id={CHECKOUT_SESSION_ID}04Prüfen, ob es geklappt hat
Fehlt etwas, oder sieht es bei dir anders aus? Schreib an support@tallybyoutpost.com und nenne die Seite.