2014-07-23 2 views
3

Эй, я пытаюсь интегрировать Yelp API в мой сайт cakephp и получить ошибку «Подпись была недействительной».Необходимо разрешить ответ Yelp: «Подпись была недействительной» с использованием кода PHP Пример

Я попытался выяснить причину моего вопроса с помощью 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"}}' 

Надеюсь, кто-то может помочь или подсказку, как его решить ...

Или есть хороший учебник для торта/php или плагина для него? Im застрял на это, так как более двух дней:/

ответ

3

В вас код:

$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 

EROR в URL вашего пути. Путь поиска должен быть:

$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 repository для кода и Google Docs для documentation.

+1

Спасибо за помощь, чувак, к сожалению, это не единственная ошибка .. все равно получите то же самое после предлагаемого изменения в URL-адресе – BokaJakoB

+1

Разъем Yelp использует 0auth1.0a [http://oauth.net/core/1.0a ]. Я думаю, что в вашей кодовой ошибке при создании Подписи. При создании Подписи все параметры должны быть в алфавитном порядке. Я сделал эту часть в java [https://github.com/jarachanthan/Yelp-connector-1.0.0/blob/master/yelp-connector/yelp-connector-1.0.0/src/main/java/org/wso2 /carbon/connector/GenerateSignature.java]. –

+0

извините за глупый вопрос, но какие параметры должны быть в алфавитном порядке? – BokaJakoB

Смежные вопросы