I have already checked this post but not working for me: API request works with cURL but not with Guzzle?
PHP Script to access token works perfectly for me
Initialization
$_consumerKey = "consumer key";
$method = "POST";
$endpoint = 'https://api.twitter.com/oauth/request_token';
$callbackUrl = "https://localhost/script/test.php";
$authorizationParams = array(
'oauth_callback' => $callbackUrl,
'oauth_consumer_key' => $_consumerKey,
'oauth_nonce' => md5( microtime() . mt_rand() ),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
Prepare Signature
function getSignature( $method, $endpoint, $authorizationParams, $urlParams = array() ) {
$authorizationParams = array_merge( $authorizationParams, $urlParams );
uksort( $authorizationParams, 'strcmp' );
foreach ( $authorizationParams as $key => $value ) {
$authorizationParams[$key] = rawurlencode( $key ) . '=' . rawurlencode( $value );
}
$signatureBase = array(
rawurlencode( $method ),
rawurlencode( $endpoint ),
rawurlencode( implode( '&', $authorizationParams ) ),
);
$signatureBaseString = implode( '&', $signatureBase );
$signatureKey = array(
rawurlencode("consumer token"),
""
);
$signatureKeyString = implode('&', $signatureKey);
return base64_encode(hash_hmac('sha1', $signatureBaseString, $signatureKeyString, true));
}
convert array to string
function getAuthorizationString( $authorizationParams ) {
$authorizationString = 'Authorization: OAuth';
$count = 0;
foreach ( $authorizationParams as $key => $value ) { // loop over authorization params array
$authorizationString .= !$count ? ' ' : ', ';
$authorizationString .= rawurlencode( $key ) . '="' . rawurlencode( $value ) . '"';
$count++;
}
return $authorizationString;
}
$authorizationParams['oauth_signature'] = getSignature( $method, $endpoint, $authorizationParams );
$apiParams = array(
'method' => $method,
'endpoint' => $endpoint,
'authorization' => getAuthorizationString( $authorizationParams )
);
Curl Request
$curlOptions = array(
CURLOPT_URL => $apiParams['endpoint'],
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
$apiParams['authorization'],
'Expect:'
)
);
$curlOptions[CURLOPT_POST] = TRUE;
$ch = curl_init();
curl_setopt_array( $ch, $curlOptions );
$apiResponse = curl_exec( $ch );
print_r($apiResponse);
Now when I try to replace curl with Guzzle Http, I get following error. Notice the error details, It said callback url is not same as registered in app. But I am using same callback url and same was used in CURL
Fatal error: Uncaught GuzzleHttpExceptionClientException: Client
error:POST https://api.twitter.com/oauth/request_tokenresulted in
a403 Forbiddenresponse: Callback URL not approved
for this client application. A (truncated…) in
C:xampphtdocsscriptvendorguzzlehttpguzzlesrcExceptionRequestException.php:113
Stack trace: #0
C:xampphtdocsscriptvendorguzzlehttpguzzlesrcMiddleware.php(69):
GuzzleHttpExceptionRequestException::create(Object(GuzzleHttpPsr7Request),
Object(GuzzleHttpPsr7Response), NULL, Array, NULL) #1
C:xampphtdocsscriptvendorguzzlehttppromisessrcPromise.php(204):
GuzzleHttpMiddleware::GuzzleHttp{closure}(Object(GuzzleHttpPsr7Response))
#2 C:xampphtdocsscriptvendorguzzlehttppromisessrcPromise.php(153):
GuzzleHttpPromisePromise::callHandler(1,
Object(GuzzleHttpPsr7Response), NULL) #3
C:xampphtdocsscriptvendorguzzlehttppromisessrcTaskQueue.php(48):
GuzzleHttpPromisePromise::GuzzleHttp in
C:xampphtdocsscriptvendorguzzlehttpguzzlesrcExceptionRequestException.php
on line 113
Curl Code
$client = new GuzzleHttpClient();
$response = $client->request('POST', $apiParams['endpoint'], [
'headers' => [
'Content-Type' => 'application/json',
"Authorization" => "OAuth " . $apiParams['authorization']
]
]);
$result = json_decode($response->getBody()->getContents(), true);