Я пытаюсь получить список навыков в моей учетной записи разработчика Alexa, используя API управления навыками (SMAPI).
У меня есть следующий HTML / javascript:
<BODY> <a href id="LoginWithAmazon"> <img border="0" alt="Login with Amazon" src="http://img.ruphp.com/javascript/btnLWA_gry_312x64.png" width="156" height="32" /> </a> <div id="amazon-root"></div> <script type="text/javascript"> var client_id = "<client id>"; window.onAmazonLoginReady = function() { amazon.Login.setClientId(client_id); }; (function(d) { var a = d.createElement('script'); a.type = 'text/javascript'; a.async = true; a.id = 'amazon-login-sdk'; a.src = 'https://api-cdn.amazon.com/sdk/login1.js'; d.getElementById('amazon-root').appendChild(a); })(document); document.getElementById('LoginWithAmazon').onclick = function() { options = { scope : 'profile postal_code alexa::ask:skills:readwrite alexa::ask:models:readwrite alexa::ask:skills:test', interactive: 'always', response_type: 'code' }; amazon.Login.authorize(options, '<login page url>'); return false; }; </script> </BODY>
Затем он вызывает страницу входа в систему, чтобы получить соответствующий токен доступа:
$grant_type = 'authorization_code'; $client_id = $GLOBALS['client_id']; //your client id $client_secret = $GLOBALS['client_secret']; //your client secret $data = array( "grant_type"=>"authorization_code", "code" => $code, "client_id"=> $client_id, "client_secret"=> $client_secret ); $postvars = ''; foreach($data as $key=>$value) { $postvars .= $key . "=" . $value . "&"; } $ch = curl_init('https://api.amazon.com/auth/o2/token'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded;charset=UTF-8')); $result = curl_exec($ch); curl_close($ch); $result_arr = json_decode($result, true); if (isset($result_arr['error']) == true){ //there was an error obtaining the auth token var_dump($result); die('Error: There was an error authenticating with Amazon. Can you please start over again? Click <a href="index.php">here</a> to start again.'); } return $result_arr;
Я могу использовать access_token в $ result_arr для получения информации о профиле, но когда я использую его для получения списка навыков:
// exchange the access token for list of skills $c = curl_init('https://api.amazonalexa.com/v0/skills/'); curl_setopt($c, CURLOPT_HTTPHEADER, array('Authorization: ' . $access_token)); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_VERBOSE, 1); curl_setopt($c, CURLOPT_POST, 1); $r = curl_exec($c); curl_close($c); var_dump($r);
Я получаю Пользователь не согласился на эту операцию
Я должен упустить что-то основное здесь. У меня создалось впечатление, что область в первоначальном запросе: profile postal_code alexa::ask:skills:readwrite alexa::ask:models:readwrite alexa::ask:skills:test
будет достаточно, чтобы дать доступ. Я подтвердил, что учетная запись Amazon показывает, что приложение имеет доступ к вышеуказанным разрешениям.