user_id ?? null; if (!$userId) { printFailure("Authentication failed."); exit; } // 1. --- Create a unique order reference --- $orderRef = 'INTALEQ_' . $userId . '_' . time(); // 2. --- Save the initial transaction to your database --- // This step is CRITICAL for the webhook to work correctly. // Create a table named 'ecash_transactions' with columns like: // id, order_ref, user_id, passenger_id, amount, status, created_at, updated_at try { $stmt = $con->prepare( "INSERT INTO ecash_transactions (order_ref, user_id, passenger_id, amount, status) VALUES (?, ?, ?, ?, 'pending')" ); $stmt->execute([$orderRef, $userId, $passengerId, $amount]); } catch (PDOException $e) { // Log the database error error_log("ecash_initiate DB Error: " . $e->getMessage()); printFailure("Failed to initiate payment transaction."); exit; } // 3. --- Generate the Verification Code (VC) --- $stringToHash = ECASH_MERCHANT_ID . ECASH_MERCHANT_SECRET . $amount . $orderRef; $verificationCode = strtoupper(md5($stringToHash)); // 4. --- Construct URLs --- $redirectUrl = urlencode(APP_REDIRECT_URL_SUCCESS); $callbackUrl = urlencode(APP_CALLBACK_URL); // 5. --- Build the Final Checkout URL --- $checkoutUrl = sprintf( "%s/Checkout/CardCheckout?tk=%s&mid=%s&vc=%s&c=%s&a=%s&lang=%s&or=%s&ru=%s&cu=%s", ECASH_CHECKOUT_URL, ECASH_TERMINAL_KEY, ECASH_MERCHANT_ID, $verificationCode, ECASH_CURRENCY, $amount, ECASH_LANG, $orderRef, $redirectUrl, $callbackUrl ); // 6. --- Return the URL to Flutter --- printSuccess($checkoutUrl); ?>