false, 'ERROR' => 'UserID is required']); $config = getStripeConfig(); $qUser = queryOne("SELECT StripeCustomerId, EmailAddress, FirstName, LastName FROM Users WHERE ID = ?", [$userID]); if (!$qUser) apiAbort(['OK' => false, 'ERROR' => 'User not found']); $stripeCustomerId = $qUser['StripeCustomerId'] ?? ''; // Create Stripe Customer if user doesn't have one if (empty(trim($stripeCustomerId))) { $customerParams = ['metadata[user_id]' => $userID]; $customerName = trim(($qUser['FirstName'] ?? '') . ' ' . ($qUser['LastName'] ?? '')); if (!empty($customerName)) $customerParams['name'] = $customerName; if (!empty(trim($qUser['EmailAddress'] ?? ''))) $customerParams['email'] = $qUser['EmailAddress']; $customerData = stripeRequest('POST', 'https://api.stripe.com/v1/customers', $customerParams); if (isset($customerData['error'])) { apiAbort(['OK' => false, 'ERROR' => 'Failed to create customer: ' . $customerData['error']['message']]); } $stripeCustomerId = $customerData['id']; queryTimed("UPDATE Users SET StripeCustomerId = ? WHERE ID = ?", [$stripeCustomerId, $userID]); } // Create Ephemeral Key (need raw response for SDK) $ephemeralRaw = stripeRequestRaw( 'https://api.stripe.com/v1/ephemeral_keys', ['customer' => $stripeCustomerId], ['Stripe-Version' => '2023-10-16'] ); $ephemeralData = json_decode($ephemeralRaw, true); if (isset($ephemeralData['error'])) { apiAbort(['OK' => false, 'ERROR' => 'Failed to create ephemeral key: ' . $ephemeralData['error']['message']]); } jsonResponse([ 'OK' => true, 'CUSTOMER' => $stripeCustomerId, 'EPHEMERAL_KEY' => $ephemeralRaw, // Raw JSON for SDK 'PUBLISHABLE_KEY' => $config['publishableKey'], ]); } catch (Exception $e) { jsonResponse(['OK' => false, 'ERROR' => $e->getMessage(), 'DETAIL' => '']); }