2017-06-13 12 views
8

में मैं Yelp API v3 (फ्यूजन) के साथ शुरू हो रही हूँ। मैंने एक ऐप बनाया है, क्लाइंट आईडी और क्लाइंट सीक्रेट मिला है।एक्सेस करना Yelp एपीआई पीएचपी

मैं समझता हूँ कि मैं Yelp एपीआई से एक टोकन प्राप्त और फिर व्यापार आईडी json डेटा पुनः प्राप्त का उपयोग कर की जरूरत है।

मैं निम्नलिखित PHP कोड मिल गया है:

$postData = "grant_type=client_credentials&". 
      "client_id=YOURCLIENTID&". 
      "client_secret=SECRET"; 
$ch = curl_init(); 

//set the url 
curl_setopt($ch,CURLOPT_URL, "https://api.yelp.com/oauth2/token"); 
//tell curl we are doing a post 
curl_setopt($ch,CURLOPT_POST, TRUE); 
//set post fields 
curl_setopt($ch,CURLOPT_POSTFIELDS, $postData); 
//tell curl we want the returned data 
curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE); 
$result = curl_exec($ch); 

//close connection 
curl_close($ch); 

if($result){ 
    $data = json_decode($result); 
    echo "Token: ".$data->access_token; 
} 

मैं अपने आईडी में प्रवेश किया और गुप्त है, लेकिन एक रिक्त पृष्ठ मिल गया। मैं और क्या भुल रहा हूं?

+0

'var_dump ($ परिणाम)' खाली है? – brianforan

+0

@brianforan यह आउटपुट करता है: बूल (झूठा) – santa

+0

मैं इसे पहले पोस्टमैन पर जांचता हूं और सुनिश्चित करता हूं कि अनुरोध स्वयं ही काम कर रहा है, फिर जब मुझे यकीन है कि मैं php पर स्विच करूंगा या जो भी भाषा मैं उपयोग कर रहा हूं कोशिश करके देखो। दुर्भाग्य से मैं अन्यथा बहुत मदद नहीं कर रहा हूँ। – brianforan

उत्तर

4

एपीआई के 3 संस्करण हैं, आप निर्दिष्ट नहीं करते कि आप किस संस्करण को लक्षित कर रहे हैं, वी 1, वी 2, या येल्प फ़्यूज़न (वी 3?), लेकिन वी 2 के रूप में देखकर सेवानिवृत्त होने की प्रक्रिया में है (उदाहरण के लिए, वे नए प्रोग्रामर को V2 के लिए एक्सेस टोकन के लिए साइन अप करने की अनुमति नहीं देंगे), मुझे लगता है कि आपका मतलब फ़्यूज़न है।

डॉक्स के अनुसार, यह, https://api.yelp.com/oauth2/token के लिए एक अनुरोध बनाने के लिए अपने client_id और client_secret का उपयोग कर (है कि आप जब एक नई एप्लिकेशन को पंजीकृत मिलता है) से शुरू होता है, और एक हार्डकोडेड grant_type = client_credentials - और अपने कोड क्या करता है कि, जब कर्ल अनुरोध डीबगिंग, हमेशा CURLOPT_VERBOSE का उपयोग करें - - लेकिन यह नहीं ठीक से यूआरएल एनकोड client_id और client_secret, हो सकता है कि तुम क्यों रिक्त पृष्ठ मिल रहे हैं (और इसका मतलब है कि अपने आप में है कि आप CURLOPT_VERBOSE का उपयोग कर डिबगिंग नहीं कर रहे हैं करता है हम न अगर यह जुड़ा हुआ है और एक http 204 ठीक कोई सामग्री है, या एक 500 आंतरिक सर्वर त्रुटि मिल गया है, या यदि आपके कनेक्शन की एकमुश्त ब्लॉक किया गया था पता है, लेकिन CURLOPT_VERBOSE आपको बता होगा।), जब आप OAuth2/टोकन uRL से ACCESS_TOKEN मिलता है, यह आता है जेएसओएन प्रारूप में एन्कोड किया गया, इसे डीकोड करने के लिए json_decode का उपयोग करें।

जब आप उस टोकन मिला है, आगे API कॉल के लिए, autentication के http हेडर Authorization: Bearer TOKEN निर्धारित किया है।

यहां मेरा कोड है, एपीआई के साथ खेल रहा है, लॉग इन कर रहा है (एक प्राधिकरण_टोकन प्राप्त कर रहा है), फिर dentistry-for-kids-and-adults-canyon-country पर व्यवसाय जानकारी प्राप्त कर रहा है। दुर्भाग्य से, व्यवसाय खोज एपीआई टूटा हुआ लगता है, क्योंकि यह कोशिश करने के लिए केवल 500 आंतरिक सर्वर त्रुटियों को लौटाता है। भी मैं https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php से hhb_curl उपयोग कर रहा हूँ के रूप में कर्ल (चारों ओर एक सुविधा आवरण CURLOPT_VERBOSE का ख्याल रखता है और उस में डिबग जानकारी डाल करने के लिए एक फ़ाइल देने, तेजी से स्थानान्तरण के लिए CURLOPT_ENCODING की स्थापना, प्रत्येक curl_setopt की वापसी मान की जाँच, एक अपवाद है, तो किसी भी फेंक कर्ल विकल्पों को सेट नहीं किया जा सका और मुझे बता रहा है कि कौन सा विकल्प सेट करने में असफल रहा, आदि) - और यदि आप इस कोड का परीक्षण करना चाहते हैं, तो क्लाइंट_आईडी और क्लाइंट_सेक्रेट को प्रतिस्थापित करना सुनिश्चित करें, जैसा कि मैंने यहां पोस्ट किया है नकली है (लेकिन है जो अक्षम कर देता है SSL प्रमाणपत्र सत्यापन(), और enabl - एक ही लंबाई और सामान्य संरचना, इस कोड https://gist.github.com/divinity76/c43e8ceb803969def0c0369b8ec6de4b)

<?php 
declare(strict_types = 1); 
// hhb_.inc.php from https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php 
require_once ('hhb_.inc.php'); 
$hc = new hhb_curl ('https://api.yelp.com/oauth2/token', true); 
$hc->setopt_array (array (
     CURLOPT_POST => true, 
     CURLOPT_POSTFIELDS => http_build_query (array (
       'grant_type' => 'client_credentials', // << hardcoded 
       'client_id' => 'Q3sE0uuprHlZx3UbjPlnXX', 
       'client_secret' => 'Q3sE0uuprHlZx3UbjPlnXXQ3sE0uuprHlZx3UbjPlnXXQ3sE0uuprHlZx3UbjPln' 
     )) 
)); 
$hc->exec(); 
hhb_var_dump ($hc->getStdErr(), $hc->getStdOut()); 
$json = $hc->getResponseBody(); 
$parsed = json_decode ($json, true); 
if (! isset ($parsed ['access_token'])) { 
    throw new \RuntimeException ('failed to get access token!'); 
} 
$access_token = $parsed ['access_token']; 
$hc->setopt_array (array (
     CURLOPT_HTTPGET => true, 
     CURLOPT_URL => 'https://api.yelp.com/v3/businesses/' . urlencode ('dentistry-for-kids-and-adults-canyon-country'), 
     CURLOPT_HTTPHEADER => array (
       'Authorization: Bearer ' . $access_token 
     ) 
)); 
$hc->exec(); 
hhb_var_dump ($hc->getStdErr(), $hc->getStdOut()); 
$json = $hc->getResponseBody(); 
$parsed = json_decode ($json, true); 
hhb_var_dump ($parsed); 

/* 
* the business search api seems to be severly broken, giving me 500 Internal Server Errors all the time... 
* $hc->setopt_array (array (
* CURLOPT_POST => true, 
* CURLOPT_POSTFIELDS => http_build_query (array (
* //'location' => "375 Valencia St, San Francisco" 
* //somewhere in San Francisco. 
* 'latitude'=>'37.7670169511878', 
* 'longitude'=>'-122.42184275' 
* 
*)), 
* CURLOPT_URL => 'https://api.yelp.com/v3/businesses/search', 
* CURLOPT_HTTPHEADER => array (
* 'Authorization: Bearer ' . $access_token 
*) 
*)); 
* $hc->exec(); 
* hhb_var_dump ($hc->getStdErr(), $hc->getStdOut()); 
* $json = $hc->getResponseBody(); 
* $parsed = json_decode ($json, true); 
* hhb_var_dump ($parsed); 
*/ 

भी द्वारा उत्पन्न पता है कि hhb_curl के लिए 2 पैरामीटर :: __ निर्माण $insecureAndComfortableByDefault कहा जाता है हो सकता है एस संपीड़ित स्थानान्तरण (क्योंकि यह एक समस्या हो सकती है, Google "एसएसएल अपराध भेद्यता"), और डिफ़ॉल्ट रूप से अक्षम है ("डिफ़ॉल्ट रूप से सुरक्षित" होने के प्रयास में), लेकिन मैं आमतौर पर विकास की आसानी के लिए इसे

पर रखता हूं
+0

कूल, इस उदाहरण के लिए धन्यवाद। मुझे कुछ त्रुटियां मिल रही हैं। सबसे पहले यह मुझे चेतावनी देता है: असमर्थित घोषित 'सख्त_ प्रकार' ... और जब मैं इसे टिप्पणी करता हूं तो यह कहता है: पार्स त्रुटि: वाक्यविन्यास त्रुटि, अप्रत्याशित ':', '/' में /mypath/hhb_.inc.php में '4' की उम्मीद है मेरा PHP संस्करण 5.3.6 – santa

+0

@ सांता यह कोड PHP7 में लिखा गया है। https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php5.php पर एक PHP5 संस्करण है, लेकिन आज 5.3 का उपयोग करने वाला कोई भी पागल है। 5.3 में कई ज्ञात भेद्यताएं हैं जिन्हें कभी तय नहीं किया जाएगा (मेरे सिर के शीर्ष से, unserialize() में कोड निष्पादन भेद्यताएं हैं, और बहुत कम POST पैरामीटर भेजकर एक डीओएस भेद्यता है जहां php 100% cpu पर घंटों तक लटकाएगा), आपको वास्तव में PHP 5.6 में अपग्रेड करना चाहिए। पिछड़ा-संगतता समस्या न्यूनतम है (मेरे सिर के शीर्ष से, ईरेग/ईरेगी कार्यों को प्रतिस्थापित करने की आवश्यकता है) – hanshenrik

+0

5.6 31 दिसंबर 2018 तक सुरक्षा समर्थित है, और इसमें बहुत सारे प्रदर्शन सुधार और वाक्य रचनात्मक चीनी (जैसे लघु सरणी वाक्यविन्यास [] , वैरिएडिक फ़ंक्शंस, $ v = function() {};) - और मैंने 5.3 पर php5 संस्करण का परीक्षण नहीं किया है, केवल 5.5 – hanshenrik

0

यह सुनिश्चित नहीं है कि मुझे hhb_.inc.php के बारे में अलग-अलग त्रुटियां क्यों मिल रही हैं, इसलिए मैंने स्वयं को कुछ एक साथ जोड़ दिया। ऐसा लगता है कि अगर वहां अन्य नौसिखियां संघर्ष कर रही हैं तो काम करना प्रतीत होता है। बस अपने खुद के मूल्यों के साथ client_id और client_secret अद्यतन करें। जब आप डेवलपर के रूप में Yelp के साथ अपना ऐप पंजीकृत करते हैं तो आप उन्हें प्राप्त करते हैं।

$postData = "grant_type=client_credentials&". 
 
    "client_id=MyClientIDl94gqHAg&". 
 
    "client_secret=SomEcoDehIW09e6BGuBi4NlJ43HnnHl4S7W5eoXUkB"; 
 

 

 
// GET TOKEN 
 
$curl = curl_init(); 
 

 
//set the url 
 
curl_setopt($curl,CURLOPT_URL, "https://api.yelp.com/oauth2/token"); 
 
//tell curl we are doing a post 
 
curl_setopt($curl,CURLOPT_POST, TRUE); 
 
//set post fields 
 
curl_setopt($curl,CURLOPT_POSTFIELDS, $postData); 
 
//tell curl we want the returned data 
 
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE); 
 
$result = curl_exec($curl); 
 

 
if($result){ 
 
    $data = json_decode($result); 
 
} 
 

 
// GET RESTAURANT INFO 
 
curl_setopt_array($curl, array(
 
    CURLOPT_URL => "https://api.yelp.com/v3/businesses/north-india-restaurant-san-francisco", 
 
    CURLOPT_RETURNTRANSFER => true, 
 
    CURLOPT_ENCODING => "", 
 
    CURLOPT_MAXREDIRS => 10, 
 
    CURLOPT_TIMEOUT => 30, 
 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
 
    CURLOPT_CUSTOMREQUEST => "GET", 
 
    CURLOPT_HTTPHEADER => array(
 
     "authorization: Bearer ".$data->access_token 
 
    ), 
 
)); 
 

 
$response = curl_exec($curl); 
 
$err = curl_error($curl); 
 

 
//close connection 
 
curl_close($curl); 
 

 
if ($err) { 
 
    echo "cURL Error #:" . $err; 
 
} else { 
 
    echo $response; 
 
}

संबंधित मुद्दे