【问题标题】:Need to resolve Yelp Response: "Signature was invalid" using PHP code Sample需要使用 PHP 代码示例解决 Yelp 响应:“签名无效”
【发布时间】:2015-06-20 04:39:35
【问题描述】:

嘿,我正在尝试将 Yelp API 集成到我的 cakephp 网站并收到“签名无效”错误。

我试图在google和stackoverflow的帮助下找出问题的原因,但无法解决

我使用以下代码:

public function bar($hostel_data=array()){

    $term = "bar";
    $location = "Berlin";
    $test1 = $this->search($term, $location);   

    debug($test1 );  die();         
}




function yelpRequest($path) {

    $consumer_key = "xxxxxxx";
    $consumer_secret = "xxxxxxxx";
    $token = "xxxxxxxxx";
    $token_secret = "xxxxxxxxx";

    require APPLIBS.'OAuth'.DS.'oAuth.php';


    $unsigned_url = "http://" . "api.yelp.com" . $path;

    // Token object built using the OAuth library
    $token = new OAuthToken($token, $token_secret);

    // Consumer object built using the OAuth library
    $consumer = new OAuthConsumer($consumer_key, $consumer_secret);

    // Yelp uses HMAC SHA1 encoding
    $signature_method = new OAuthSignatureMethod_HMAC_SHA1();

    $oauthrequest = OAuthRequest::from_consumer_and_token(
        $consumer, 
        $token, 
        'GET', 
        $unsigned_url
    );

     // Sign the request
$oauthrequest->sign_request($signature_method, $consumer, $token);

// Get the signed URL
$signed_url = $oauthrequest->to_url();

debug($signed_url);
//utf8_encode($signed_url);

// Send Yelp API Call
$ch = curl_init($signed_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);


return $data;
}


function search($term, $location) {

$search_path ="/v2/search/";

$url_params = array();
$url_params['term'] = $term ?: $GLOBALS['DEFAULT_TERM'];
$url_params['location'] = $location?: $GLOBALS['DEFAULT_LOCATION'];
$url_params['limit'] = 20;

$search_path = $search_path . "?" . http_build_query($url_params);

$yelpResponse = $this->yelpRequest($search_path);

debug($url_params); debug($yelpResponse); die();
return $yelpResponse;
}

调试($signed_url):

http://api.yelp.com/v2/search/?limit=20&location=Berlin&oauth_consumer_key=qHsEZDzSkqfT8aOxr79Isw&oauth_nonce=60b30afc5087fcc509eb4245d1e9410c&oauth_signature=XFZFpzdg36G0eG42TZKy5Ny9BbU%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1406153682&oauth_token=kqq8iu-whGeYubw3Q8o_fNyzUgDEpnrO&oauth_version=1.0&term=bar

错误响应:

'{"error": {"text": "Signature was invalid", "id": "INVALID_SIGNATURE", "description": "Invalid signature. Expected signature base string: GET\u0026http%3A%2F%2Fapi.yelp.com%2Fv2%2Fsearch%2F\u0026limit%3D20%26location%3DBerlin%26oauth_consumer_key%3DqHsEZDzSkqfT8aOxr79Isw%26oauth_nonce%3D60b30afc5087fcc509eb4245d1e9410c%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1406153682%26oauth_token%3Dkqq8iu-whGeYubw3Q8o_fNyzUgDEpnrO%26oauth_version%3D1.0%26term%3Dbar"}}'

我希望有人可以提供一些帮助或提示如何解决它......

或者有没有好的 cake/php 教程或插件?两天多以来我一直坚持这一点:/

【问题讨论】:

    标签: php cakephp oauth cakephp-2.0 yelp


    【解决方案1】:

    在你的代码中:

    $search_path ="/v2/search/";
    

    还有你的请求 url($signed_url)

      http://api.yelp.com/v2/search/?limit=20&location=Berlin&oauth_consumer_key=qHsEZDzSkqfT8aOxr79Isw&oauth_nonce=60b30afc5087fcc509eb4245d1e9410c&oauth_signature=XFZFpzdg36G0eG42TZKy5Ny9BbU%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1406153682&oauth_token=kqq8iu-whGeYubw3Q8o_fNyzUgDEpnrO&oauth_version=1.0&term=bar
    

    您的网址路径有误。搜索路径应为:

    $search_path ="/v2/search";
    

    请求的url会变成这样:

    http://api.yelp.com/v2/search?limit=20&location=Berlin&oauth_consumer_key=qHsEZDzSkqfT8aOxr79Isw&oauth_nonce=60b30afc5087fcc509eb4245d1e9410c&oauth_signature=XFZFpzdg36G0eG42TZKy5Ny9BbU%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1406153682&oauth_token=kqq8iu-whGeYubw3Q8o_fNyzUgDEpnrO&oauth_version=1.0&term=bar
    

    这是我的代码git repositorydocumentation 的谷歌文档。

    【讨论】:

    • 感谢您的帮助伙计,不幸的是,这似乎不是唯一的错误.. 在您建议更改 url 后仍然得到相同的结果
    • Yelp 连接器使用 0auth1.0a [oauth.net/core/1.0a] 。我认为您的代码在创建签名时出错。创建签名时,所有参数都应按字母顺序排列。我在 java [github.com/jarachanthan/Yelp-connector-1.0.0/blob/master/… . 中做了那部分
    • 抱歉这个愚蠢的问题,但哪些参数应该按字母顺序排列?
    • 所有参数(limit,location,oauth_consumer_key,oauth_nonce,oauth_signature,oauth_signature_method,oauth_timestamp,oauth_token,oauth_version&term)。在这个url参数之后。 v2/搜索?
    • 就我而言,我收到“签名无效”错误,因为我使用的 URL 与我最终使用的 URL 不同。即,它没有参数。一旦我使用带有参数的 URL,这个错误就消失了。
    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多