我正在尝试连接LivePerson Engagement History API,但遇到了一个问题,我认为与生成的签名有关。
首先,API已经提供了必要的消费者密钥、消费者密钥、访问令牌和令牌密钥。因此,我不必去检索它们。为了访问他们的API,我只需要提供授权标头。我使用Postman模拟了所有内容,并且一切都正常工作。问题出现在我尝试在我的类中生成自己的时间戳/随机数/签名时。
以下是从我的类中发送cURL请求的方法:
我实际上可以将Postman中的授权头复制并粘贴到我的
我从他们的服务器收到的响应是
编辑:我忘了查看响应头 - 准确的错误是无效的签名。
首先,API已经提供了必要的消费者密钥、消费者密钥、访问令牌和令牌密钥。因此,我不必去检索它们。为了访问他们的API,我只需要提供授权标头。我使用Postman模拟了所有内容,并且一切都正常工作。问题出现在我尝试在我的类中生成自己的时间戳/随机数/签名时。
以下是从我的类中发送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;
}
我从 https://github.com/BaglerIT/OAuthSimple/blob/master/src/OAuthSimple.php 直接复制了 getNonce
方法。
这是我编写的生成签名的方法(从各种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
变量中,并替换除时间戳/随机数/签名之外的所有内容,这样就可以正常工作。我从他们的服务器收到的响应是
[code] => 0005
,但我在他们的文档中找不到有关响应代码的任何信息。编辑:我忘了查看响应头 - 准确的错误是无效的签名。
Oauth_signature
看起来没问题。但是我收到的响应是bad request 400
。你能帮我解决一下吗? - matheen ulla