我正在尝试实现 keek.com API,特别是“搜索 keek”功能(https://developers.keek.com/api/commands/search_keek)。一个搜索词一切正常,但如果我尝试使用两个或多个词搜索词,则会出现错误“4006 Signature Is Invalid”。据我了解,这是因为空格或其他一些非字母字符的 url 编码不正确。这是我的代码,它适用于单词短语,但不适用于多词短语:
$apiKey = Yii::app()->params['keek']['api_key'];
$apiSecret = Yii::app()->params['keek']['api_secret'];
$timestamp = time();
$paramsArr = array(
'auth_api' => $apiKey,
'auth_timestamp' => $timestamp,
'term' => $searchPhrase,
'number' => Yii::app()->params['keek']['keeks_per_page'],
);
// calculate min id (for pagination)
if(isset($socialPageParam[Yii::app()->params['searchEngines']['enginesUrls']['keek']])
&& !empty($socialPageParam[Yii::app()->params['searchEngines']['enginesUrls']['keek']]))
{
$sinceId = min(
$socialPageParam[Yii::app()->params['searchEngines']['enginesUrls']['keek']]
);
if($sinceId)
$paramsArr['since_id'] = $sinceId;
}
// sort alphabeticaly
ksort($paramsArr);
$paramsOfQueryStr = http_build_query($paramsArr);
$paramsOfQueryStr = str_replace(
array('+', '%7E'),
array('%20', '~'),
$paramsOfQueryStr
);
$urlEncodedRequest = rawurlencode($paramsOfQueryStr);
$apiUrl = Yii::app()->params['keek']['api_search_keeks_url'];
$initalAPIurl = rawurlencode($apiUrl);
// forming signature base
$signatureBase = 'GET&' . $initalAPIurl . '&' . $urlEncodedRequest;
// forming signing token
$signingToken = $apiKey . '&' . $timestamp . '&' . $apiSecret;
// forming signature as hashed by sha1 string in binary
$signature = base64_encode(hash_hmac('sha1', $signatureBase, $signingToken, true));
// add signature to headers
$headersArr = array(
"API: $apiKey",
"Timestamp: $timestamp",
"Signature: $signature",
);
// forming full url to call
$fullUrl = $apiUrl . '?' . $paramsOfQueryStr;
// make call to keek's API
$apiRes = Yii::app()->utils->curlGetContent($fullUrl, $headersArr);
var_dump($apiRes);die;
如果知道如何解决此问题,请帮助我。先感谢您。