Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

vincentsanity's avatar

Laravel call method and pass value when got an exception

I got method in getting the access token and here it is

public $token; //I declare global var to read in the saveToken

    public function getToken(){
        $key = 'xxxxxxxxxxxxxx';
        $secret = 'xxxxxxxxxxxxxxxxxx';
        $data = array(
            'key' => 'xxxxxxxxxxxxxxxxxx',
            'secret' => 'xxxxxxxxxxxxxxx'
        );
        $payload = json_encode($data);
        $ch = curl_init('https://cgi.singmap.com/token?key='.$key.'&secret='.$secret.'');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLINFO_HEADER_OUT, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/x-www-form-urlencoded',
            'Accept: application/json',
            'Content-Length: ' . strlen($payload))
        );

        // Submit the POST request
        $response = json_decode(curl_exec($ch), true);
        $trimmed = $response['datas'];
        $token = $trimmed['access_token'];
        curl_close($ch);
        $this->token = $token;
    }

The token i got only lasts for 5 minutes to use. But in my other method like this which uses token

public function propertyBuildings(){

        $project_id = \DB::table('project_list')
                        ->select('projectId')
                        ->get();

        foreach($project_id as $res){
            $request_time = Carbon::now()->format('YmdHis');
            $token = 'dc7318d173bb4a9c81ef1ec2e990ad35'; //manually generated result from postman, 5 mins lifetime
            $sign = md5($token.$request_time);
            $url = 'https://cgi.singmap.com/project/queryBuilding?request_time='.$request_time.
            '&token='.$token.'&sign='.$sign.'&projectId='.$res->projectId.'';
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $response = json_decode(curl_exec($ch), true);
            $trimmed = $response['datas'];

            // return $trimmed;
                foreach($trimmed as $data){
                    $inserts[] = [
                    'projectId' => $res->projectId,
                    'buildId' => $data['buildId'],
                    'buildName' => $data['buildName'],
                    ];
            }

         }
         \DB::table('property_building')->insert($inserts);
         dd('Data Inserted');

    }

When the function is not completely excecuted or the data is not fully inserted, maybe because it has a large amount of data. It throws an error of datas index is not found or something from the curl response. It is because I can only get the datas based on the token i get manually or declared manually. What I want is that if the token expires, it will run the function getToken() and pass the token to the running function in order to avoid interrupting it.

I tried doing

foreach($project_id as $res){
        $this->getToken();
        $final_token = $this->token;

        $request_time = Carbon::now()->format('YmdHis');
        $sign = md5($final_token.$request_time);

//and so on ....

And i thought when im calling the method i can prevent the token from expiring becauase it sends reqeust every project_id it gets. but im getting the same error maybe it expires when it was inserting

I also added a condition where

 if(empty($trimmed)){
               $this->getToken();
               $final_token = $this->token;
           }

         
                foreach($trimmed as $data){

Still dont work for me

0 likes
0 replies

Please or to participate in this conversation.