2016-08-16 4 views
0

アクセスキーと秘密鍵とassociate_tagが正しい答え私はリクエストを送信するときにトラブル を持って、私はこの応答を取得:アマゾンのAPIがMissingClientTokenId

object(SimpleXMLElement)#26 (2) { ["Error"]=> object(SimpleXMLElement)#27 (2) { ["Code"]=> string(20) "MissingClientTokenId" ["Message"]=> string(57) "Request must contain AWSAccessKeyId or X.509 certificate." } ["RequestId"]=> string(36) "3dda37ed-5b92-4b83-a95e-c19db6b4288c" } 

はどこに問題があるとどのように私はそれを解決できますか?

$keywords='Learning PHP, MySQL'; 
$associate_tag = "xxxxxxxxxxxxxxxxxx"; 
$aws_secret_access_key = "xxxxxxxxxxxxxxx"; 
$aws_access_key_id = "xxxxxxxxxxxx"; 
$item_page=10; 
$base_url = 'http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId;=' . '$aws_access_key_id' . '&'; 
//Set parameters for API search, see AWS documentation for a detailed list of parameters 
$url_params = array(
      'Operation'=>'ItemSearch', 
      'ItemPage'=>$item_page, 
      'AssociateTag'=>$associate_tag, 
      'Version'=>'2013-08-01', 
      'ResponseGroup'=>'Images,ItemAttributes,EditorialReview', 
      'SearchIndex'=>'Books', 
      'Keywords'=>rawurlencode($keywords) 
     ); 

     //Sort the URL parameters 
     $url_parts = array(); 
     foreach(array_keys($url_params) as $key) 
      $url_parts[] = $key."=".$url_params[$key]; 
     sort($url_parts); 

     //Build and encode the request URL 
     $url = $base_url . implode('&',$url_parts); 
     $host = parse_url($base_url . implode('&',$url_parts),PHP_URL_HOST); 
     $timestamp = gmstrftime('%Y-%m-%dT%H:%M:%S.000Z'); 
     $url = $url. '&Timestamp;=' . $timestamp; 
     $paramstart = strpos($url,'?'); 
     $workurl = substr($url,$paramstart+1); 
     $workurl = str_replace(",",",",$workurl); 
     $workurl = str_replace(":",":",$workurl); 
     $params = explode("&",$workurl); 
     sort($params); 
     $signstr = "GET\n" . $host . "\n/onca/xml\n" . implode("&",$params); 
     $signstr = base64_encode(hash_hmac('sha256', $signstr, $aws_secret_access_key, true)); 
     $signstr = urlencode($signstr); 
     $signedurl = $url . "&Signature;=" . $signstr; 
     $request = $signedurl;  

     //Send request to AWS 
     $session = curl_init($request); 
     curl_setopt($session, CURLOPT_HEADER, false); 
     curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
     $response = curl_exec($session); 
     curl_close($session); 
     $parsed_xml = simplexml_load_string($response); 
     var_dump($parsed_xml);exit; 

答えて

1

BASE_URL変数がセットになっていない、のように見えます。そして、非常に多くの不必要な ";"コードには、それが好きで修正しようとした: -

$keywords='Learning PHP, MySQL'; 
$associate_tag = "xxxxxxxxxxxxxxxxxx"; 
$aws_secret_access_key = "xxxxxxxxxxxxxxx"; 
$aws_access_key_id = "xxxxxxxxxxxx"; 
$item_page=10; 

$base_url = 'http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId='. $aws_access_key_id .'&'; 

#echo $base_url; 


//Set parameters for API search, see AWS documentation for a detailed list of parameters 
$url_params = array(
     'Operation'=>'ItemSearch', 
     'ItemPage'=>$item_page, 
     'AssociateTag'=>$associate_tag, 
     'Version'=>'2013-08-01', 
     'ResponseGroup'=>'Images,ItemAttributes,EditorialReview', 
     'SearchIndex'=>'Books', 
     'Keywords'=>rawurlencode($keywords) 
    ); 

    //Sort the URL parameters 
    $url_parts = array(); 
    foreach(array_keys($url_params) as $key) 
     $url_parts[] = $key."=".$url_params[$key]; 
    sort($url_parts); 

    //Build and encode the request URL 
    $url = $base_url . implode('&',$url_parts); 
    $host = parse_url($base_url . implode('&',$url_parts),PHP_URL_HOST); 
    $timestamp = gmstrftime('%Y-%m-%dT%H:%M:%S.000Z'); 
    $url = $url. '&Timestamp=' . $timestamp; 
    $paramstart = strpos($url,'?'); 
    $workurl = substr($url,$paramstart+1); 
    $workurl = str_replace(",",",",$workurl); 
    $workurl = str_replace(":",":",$workurl); 
    $params = explode("&",$workurl); 
    sort($params); 
    $signstr = "GET\n" . $host . "\n/onca/xml\n" . implode("&",$params); 
    $signstr = base64_encode(hash_hmac('sha256', $signstr,$aws_secret_access_key, true)); 
    $signstr = urlencode($signstr); 
    $signedurl = $url . "&Signature=" . $signstr; 
    $request = $signedurl; 
    echo $request; 

    //Send request to AWS 
    $session = curl_init($request); 
    curl_setopt($session, CURLOPT_HEADER, false); 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($session); 
    curl_close($session); 
    $parsed_xml = simplexml_load_string($response); 
    var_dump($parsed_xml);exit; 
+0

は今、このエラーを取得し、パラメータ署名 –

+0

SimpleXMLElementオブジェクトを含んでいなければならない要求([エラー] =>のSimpleXMLElementオブジェクト([コード] => MissingParameter [メッセージ] = >リクエストにパラメータSignatureが含まれている必要があります)。[RequestId] => a497f313-a621-4098-97e4-965665d0f316) –

+0

スペースまたは余分な ";" "$ request"変数に格納します。リクエストURLが正しく送信されていません。 –

関連する問題