false, 'ERROR' => 'missing_params', 'MESSAGE' => 'UserID is required.']); } try { $qUser = queryOne(" SELECT ActivationBalanceCents, ActivationCapCents FROM Users WHERE ID = ? ", [$userID]); if (!$qUser) { apiAbort(['OK' => false, 'ERROR' => 'user_not_found']); } $remainingCents = (int) $qUser['ActivationCapCents'] - (int) $qUser['ActivationBalanceCents']; if ($remainingCents <= 0) { jsonResponse([ 'OK' => true, 'ALREADY_COMPLETE' => true, ]); } $stripeSecretKey = getenv('STRIPE_SECRET_KEY') ?: ''; $base = baseUrl(); $postFields = [ 'mode' => 'payment', 'line_items[0][price_data][unit_amount]' => $remainingCents, 'line_items[0][price_data][currency]' => 'usd', 'line_items[0][price_data][product_data][name]' => 'Payfrit Activation', 'line_items[0][quantity]' => '1', 'success_url' => $base . '/works/stripe-return.cfm?status=success', 'cancel_url' => $base . '/works/stripe-return.cfm?status=cancel', 'metadata[user_id]' => $userID, 'metadata[type]' => 'activation_unlock', ]; $ch = curl_init('https://api.stripe.com/v1/checkout/sessions'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($postFields), CURLOPT_USERPWD => $stripeSecretKey . ':', CURLOPT_RETURNTRANSFER => true, ]); $result = curl_exec($ch); curl_close($ch); $sessionData = json_decode($result, true); if (isset($sessionData['error'])) { apiAbort(['OK' => false, 'ERROR' => $sessionData['error']['message']]); } jsonResponse([ 'OK' => true, 'CHECKOUT_URL' => $sessionData['url'], 'AMOUNT_DUE_CENTS' => $remainingCents, ]); } catch (Exception $e) { jsonResponse(['OK' => false, 'ERROR' => $e->getMessage()]); }