makeApiRequest($body, $networkDetails, $datagroup, $actualPlanId, 1); } // Function to handle the second request public function request2($body, $networkDetails, $datagroup, $actualPlanId) { return $this->makeApiRequest($body, $networkDetails, $datagroup, $actualPlanId, 2); } // Helper function to handle the API request logic for both requests private function makeApiRequest($body, $networkDetails, $datagroup, $actualPlanId, $requestType) { $response = []; // Determine network ID based on data group if ($datagroup == "SME") { $name = "Sme"; $thenetworkId = $networkDetails["smeId"]; } elseif ($datagroup == "SME2") { $name = "Sme2"; $thenetworkId = $networkDetails["sme2Id"]; } elseif ($datagroup == "Gifting") { $name = "Gifting"; $thenetworkId = $networkDetails["giftingId"]; } else { $name = "Corporate"; $thenetworkId = $networkDetails["corporateId"]; } // Get API details for the request (either request1 or request2) $networkname = strtolower($networkDetails["network"]); $apiDetails = $this->model->getApiDetails($networkname . $name . "Api"); if ($apiDetails !== null && !empty($apiDetails)) { // Use different API configurations based on the request type (request1 or request2) $apiDetails = $apiDetails[$requestType - 1]; // [0] is request1, [1] is request2 $host = trim($apiDetails->provider); $apikey = trim($apiDetails->apikey); // Convert ported_number to boolean $ported_number = isset($body->ported_number) && $body->ported_number !== '' ? filter_var($body->ported_number, FILTER_VALIDATE_BOOLEAN) : true; // Prepare request data (you can differentiate the data for request1 vs request2) if ($requestType == 1) { // Data format for request1 $data = json_encode([ "network" => $thenetworkId, "mobile_number" => $body->phone, "Ported_number" => $ported_number, "request-id" => $body->ref, "plan" => $actualPlanId ]); } else { // Data format for request2 (this can be different based on API specs) $data = json_encode([ "network" => $thenetworkId, "phone_number" => $body->phone, // Different field name for request2 "is_ported" => $ported_number, // Different field name for request2 "transaction_id" => $body->ref, // Different field name for request2 "subscription_plan" => $actualPlanId // Different field name for request2 ]); } // Initialize cURL $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $host, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => $data, CURLOPT_HTTPHEADER => [ "Authorization: Token $apikey", "Content-Type: application/json" ], ]); // Execute API request $exereq = curl_exec($curl); $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); $err = curl_error($curl); curl_close($curl); // Check for cURL errors if ($err) { $response["status"] = "fail"; $response["msg"] = "Unable to process your request at the moment. Please try again later."; $response["error"] = $err; return $response; } // Decode API response $result = json_decode($exereq); // Handle HTTP errors first if ($http_code === 400) { $response["status"] = "fail"; $response["msg"] = "Invalid request! Contact admin immediately."; $response["error"] = $result->message ?? "Bad Request"; return $response; } elseif ($http_code === 401) { $response["status"] = "fail"; $response["msg"] = "Authorization failed! Check API key."; $response["error"] = $result->message ?? "Unauthorized Access"; return $response; } elseif ($http_code === 500) { $response["status"] = "fail"; $response["msg"] = "Server error from provider. Try again later."; $response["error"] = $result->message ?? "Internal Server Error"; return $response; } // Handle API response if (is_object($result)) { if (isset($result->Status)) { $status = strtolower($result->Status); if (in_array($status, ['successful', 'processing', 'success'])) { $response["status"] = "success"; $response["msg"] = $result->api_response ?? $result->message ?? "Transaction processed successfully."; $response["error"] = $result->api_response ?? $result->message ?? "No response message from API."; } elseif ($status === 'failed') { $response["status"] = "fail"; $response["msg"] = "Transaction was processed but failed at the network provider’s end."; $response["error"] = $result->api_response ?? $result->message ?? "No response message from API."; } else { $response["status"] = "fail"; $response["msg"] = "Transaction status unknown. Please verify manually."; $response["error"] = $result->api_response ?? $result->message ?? "No response message from API."; } } elseif (isset($result->error) && is_array($result->error)) { $response["status"] = "fail"; $response["error"] = implode(", ", $result->error); } else { $response["status"] = "fail"; $response["msg"] = "Transaction status unknown. Please verify manually."; $response["error"] = $result->msg ?? "Unknown error occurred."; } } else { $response["status"] = "fail"; $response["msg"] = "Invalid API response format."; $response["error"] = "Invalid API response format: " . print_r($exereq, true); } } else { $response["status"] = "fail"; $response["msg"] = "API details missing or invalid."; $response["error"] = "API configuration issue."; } return $response; } // The main function to decide when to use request1 or request2 public function purchaseData($body, $networkDetails, $datagroup, $actualPlanId) { $response = $this->request1($body, $networkDetails, $datagroup, $actualPlanId); // Try request1 // If request1 fails, try request2 if ($response["status"] === "fail") { error_log("Request 1 failed. Trying Request 2..."); $response = $this->request2($body, $networkDetails, $datagroup, $actualPlanId); } return $response; } }