Как правильно вызвать API, используя php curl? Я получаю http статус кода 401 - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь вызвать API (с использованием авторизации токена на предъявителя) в php curl, но я получаю ответ 401.

Я пытался использовать код из почтовой службы, но я получил другую ошибку с этим,Я включил код.Скручиваемость является первой функцией.У меня есть другой API для получения токена носителя, и он отлично работает, но когда я передаю токен носителя в мой запрос php Curl, я получаю код состояния http 401

function restRequestDispute($method, $endpoint, $data, $content_type, $token) 
{

            $ch = curl_init($endpoint);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_TIMEOUT, 300);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER,
                        array("Authorization: Bearer " . $token,
                            "Content-type: $content_type", 
                              "Accepts: application/json"));
                             // 'Content-Length: 0'));
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            $method = strtoupper($method);

            switch ($method) {
                case "GET":
                    curl_setopt($ch, CURLOPT_HTTPGET, true);
                    break;
                case "DELETE":
                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
                    break;
                case "PUT":
                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
                case "POST":
                //return $data;
                    //curl_setopt($ch, CURLOPT_POST, 1);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                    break;
                default:
                    throw new Exception("Error: Invalid HTTP method '$method' $endpoint");
                    return null;
            }

            $oRet = new StdClass;
            $oRet->response = json_decode(curl_exec($ch));

            $oRet->status   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            return $oRet;

}

function createDispute()
{
    try{
    $local_date = $date;
    $method ="POST";
    $content_type="application/json";

    $accessToken  = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiU2hlcmlmZi5PcGVsIiwiZXhwIjoxNTU0MzE2ODAzLCJpc3MiOiJ1cC1uZy5jb20iLCJhdWQiOiJ1cC1uZy5jb20ifQ.8LN6gcoDEpb2i8h9NA0Z_PNxRLweaHh44PN5nbfER10";
    $params = array (
        "issuerrrn"=> "003409137690",
        "transactionamount"=> "-7100",
        "localtransactiondate"=> "20181210",
        "logcomment"=> "comment",
        "amountdispenced"=>"0",
        "currentstatus"=> "NotStarted",
        "transitionaction"=> "GoodsServicesNotReceived"

        );

    $endpoint="https://172.**.*.***:***/api/DisputeWIthIssRrn?issuerrrn=003409137690&transactionamount=-7100&localtransactiondate=20181210&logcomment=comment&amountdispenced=0&currentstatus=NotStarted&transitionaction=GoodsServicesNotReceived";       

    $response = restRequestDispute($method, $endpoint, "", $content_type, $accessToken);

    return $response;
    } catch(Exception $e){

        $returned_result  =  ["error" => ["status" => "Exception", "data" => $e->getMessage()]];
        return $returned_result;

    }   

} 

1 Ответ

1 голос
/ 04 апреля 2019

Я немного повозился с вашей функцией curl, немного переместил некоторые вещи и добавил пару вещей - одна вещь - это улучшенная отладочная информация в выходных данных, а другая - использование cainfo в SSL опции. Надеюсь, это поможет

function restRequestDispute($method, $endpoint, $data, $content_type, $token){
    try{

        /* you can freely download cacert.pem from the internet - always use when performing SSL communications in cURL */
        $cacert = '/path/to/your/cacert.pem';
        /* add additional debug info to this stream */
        $vbh = fopen('php://temp', 'w+');


        $method = strtoupper( $method );

        $ch = curl_init( $endpoint );
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 300);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_ENCODING, '');
        curl_setopt($ch, CURLOPT_HTTPHEADER,
                    array(
                        "Authorization: Bearer " . $token,
                        "Content-type: $content_type",
                        "Accepts: application/json"
                        )
                    );


        if( parse_url( $endpoint,PHP_URL_SCHEME )=='https' ){
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true );
            curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
            curl_setopt( $ch, CURLOPT_CAINFO, $cacert );
        }

        /* set the options for enhanced debugging */
        curl_setopt( $ch, CURLOPT_VERBOSE, true );
        curl_setopt( $ch, CURLOPT_NOPROGRESS, true );
        curl_setopt( $ch, CURLOPT_STDERR, $vbh );

        switch( $method ) {
            case "GET":
                curl_setopt($ch, CURLOPT_HTTPGET, true );
            break;
            case "DELETE":
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE" );
            break;
            case "PUT":
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT" );
            break;
            case "POST":
                curl_setopt($ch, CURLOPT_POST, true );
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data );
            break;
            default:
                throw new Exception("Error: Invalid HTTP method '$method' $endpoint");
                return null;
        }

        $oRet = new StdClass;
        $oRet->response = json_decode( curl_exec( $ch ) );
        $oRet->status   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $oRet->errors   = curl_error( $ch );

        /* add verbose information to the output for enhanced debugging */
        rewind( $vbh );
        $oRet->verbose = stream_get_contents( $vbh );
        fclose( $vbh );

        curl_close( $ch );
        return $oRet;

    }catch( Exception $e ){
        exit( $e->getMessage() );
    }
}

Когда функция вернется, если вы изучите вывод $oRet->verbose или, как было вызвано, $response->verbose, вы должны увидеть больше информации, которая много раз помогла мне решить проблемы с запросами curl.

Глядя на то, как вы вызываете вышеуказанную функцию, я замечаю это:

`restRequestDispute( $method, $endpoint, "", $content_type, $accessToken );`

не должно быть вместо этого

`restRequestDispute( $method, $endpoint, $params, $content_type, $accessToken );`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...