ensureCustomer($email, $userId); $baseUrl = (dbnToolsIsHttps() ? 'https://' : 'http://') . ($_SERVER['HTTP_HOST'] ?? 'tools.dobetternorge.no'); $successUrl = $baseUrl . '/billing.php?status=success&session_id={CHECKOUT_SESSION_ID}'; $cancelUrl = $baseUrl . '/pricing.php?status=canceled'; $isSub = in_array($sku, $validSubscriptions, true); $params = [ 'mode' => $isSub ? 'subscription' : 'payment', 'customer' => $customerId, 'success_url' => $successUrl, 'cancel_url' => $cancelUrl, 'line_items' => [[ 'price' => StripeClient::priceId($sku), 'quantity' => 1, ]], 'metadata' => [ 'user_id' => (string)$userId, 'sku' => $sku, ], 'allow_promotion_codes' => true, 'billing_address_collection' => 'auto', 'locale' => 'auto', 'automatic_tax' => ['enabled' => false], ]; if ($isSub) { $params['subscription_data'] = [ 'metadata' => ['user_id' => (string)$userId, 'tier' => $sku], ]; } else { $params['payment_intent_data'] = [ 'metadata' => ['user_id' => (string)$userId, 'sku' => $sku, 'credits' => (string)StripeClient::topupCredits($sku)], ]; } $session = $stripe->createCheckoutSession($params); $url = (string)($session['url'] ?? ''); if ($url === '') { dbnToolsError('Stripe did not return a checkout URL.', 502, 'stripe_no_url'); } dbnToolsRespond(['ok' => true, 'url' => $url, 'session_id' => (string)($session['id'] ?? '')]); } catch (Throwable $e) { error_log('[stripe-checkout] ' . $e->getMessage()); dbnToolsError('Could not start checkout: ' . $e->getMessage(), 500, 'stripe_failed'); }