Я пытаюсь подключиться к API истории взаимодействия LivePerson , и я столкнулся с проблемой, которая, по моему мнению, связана с генерируемой подписью.
Прежде всего, API уже предоставляет необходимый ключ потребителя, секрет потребителя, токен доступа и секрет токена.Так что мне не нужно проходить через процесс их извлечения.Чтобы получить доступ к их API, я просто должен предоставить заголовок аутентификации .Я все испортил, используя Почтальон, и все работает правильно.Проблема в том, когда я пытаюсь сгенерировать свою собственную метку времени / одноразовый номер / подпись в моем классе.
Вот метод из моего класса, который отправляет запрос cURL:
private function execute($options = array())
{
if (!isset($options['url'])) {
return;
}
$ch = curl_init($options['url']);
$method = (isset($options['method'])) ? $options['method'] : 'GET';
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if (isset($options['auth']) && $options['auth']) {
$timestamp = round(microtime(true) * 1000);
$nonce = $this->getNonce(11);
$version = "1.0";
$signatureMethod = "HMAC-SHA1";
$signature = $this->generateSignature($options, $timestamp, $nonce, $signatureMethod, $version);
$authHeader = "Authorization: OAuth oauth_consumer_key=\"{$this->consumerKey}\",oauth_token=\"{$this->accessToken}\",oauth_signature_method=\"{$signatureMethod}\",oauth_timestamp=\"{$timestamp}\",oauth_nonce=\"{$nonce}\",oauth_version=\"{$version}\",oauth_signature=\"{$signature}\"";
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
$authHeader,
"Content-Type: application/json"
));
}
if (isset($options['body']) && !empty($options['body'])) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($options['body']));
}
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
Метод getNonce
, который я скопировал почти напрямую из https://github.com/BaglerIT/OAuthSimple/blob/master/src/OAuthSimple.php.
Вот метод, который я написал для генерации подписи (которая была собрана из различных публикаций SO и других источников):
protected function generateSignature($request, $timestamp, $nonce, $signatureMethod, $version)
{
$base = $request['method'] . "&" . rawurlencode($request['url']) . "&"
. rawurlencode("oauth_consumer_key=" . rawurlencode($this->consumerKey)
. "&oauth_nonce=" . rawurlencode($nonce)
. "&oauth_signature_method=" . rawurlencode($signatureMethod)
. "&oauth_timestamp=" . $timestamp
. "&oauth_version=" . $version);
$key = rawurlencode($this->consumerSecret) . '&' . rawurlencode($this->tokenSecret);
$signature = base64_encode(hash_hmac('sha1', $base, $key, true));
return $signature;
}
Я действительно могу скопировать и вставить заголовок авторизации из Postman в мой $authHeader
переменная, и заменить все, кроме отметки времени / nonce / signature, и это работает.
Ответ, который я сейчас получаю от их сервера, [code] => 0005
, но я не могу найти в их документах ничего о кодах ответов.
Редактировать: я пропустил просмотр ответазаголовок - точная ошибка неверной подписи.