0

I am trying to get result from Rest API and URL with parameters. But I am getting error as - string(61) "{"message":"The signature is invalid. Verify and try again."}" I have tried below code for it. It works perfect without URL parameters. Can anyone have solution for the same.

define("CURL_METHOD", "GET");
define("SIGNATURE_METHOD", "HMAC-SHA1");

$consumerKey = 'xxxxxxxxxx';
$consumerSecret = 'xxxxxxxxxx';
$accessToken = 'xxxxxxxx';
$accessTokenSecret = 'xxxxxxxxx';

$url = 'https://www.abcxyz.com/rest/V1/packages/bundles?identifier=abcd';

$data = [
    'oauth_consumer_key' => $consumerKey,
    'oauth_nonce' => md5(uniqid(rand(), true)),
    'oauth_signature_method' => SIGNATURE_METHOD,
    'oauth_timestamp' => time(),
    'oauth_token' => $accessToken,
    'oauth_version' => '1.0',
    'identifier' => 'abcd'
];

$curl_header = getCurlHeaderInfo($url,$data,$consumerSecret,$accessTokenSecret);


function getCurlHeaderInfo($url,$data,$consumerSecret,$accessTokenSecret) {

    ksort($data);

    $data['oauth_signature'] = sign(CURL_METHOD, $url, $data, $consumerSecret, $accessTokenSecret);

    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPGET => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => CURL_METHOD,
        CURLOPT_HTTPHEADER => [
            'Authorization: OAuth ' . http_build_query($data, '', ',')
        ]
    ]);

    $result = curl_exec($curl);
    curl_close($curl);
    var_dump($result);
    exit;
}

function urlEncodeAsZend($value)
{
    $encoded = rawurlencode($value);
    $encoded = str_replace('%7E', '~', $encoded);
    return $encoded;
}

function sign($method, $url, $data, $consumerSecret, $tokenSecret)
{
    $url = urlEncodeAsZend($url);
    $data = urlEncodeAsZend(http_build_query($data, '', '&'));
    $data = implode('&', [$method, $url, $data]);
    $secret = implode('&', [$consumerSecret, $tokenSecret]);
    return $signature = base64_encode(hash_hmac('SHA1', $data, $secret, true));
}
Nitz
  • 145
  • 1
  • 6
  • Try and simply use `urlencode`, instead of that `urlEncodeAsZend` function. This is query string format, not a URL path - https://stackoverflow.com/a/12555438/1427878 – CBroe Jul 13 '23 at 08:55

0 Answers0