'Connection to Amazon Selling Partner API with curl

I have to add more details in my question, so here is my try to get orders from my seller central account:

    $host                   = 'sellingpartnerapi-na.amazon.com';     // is this the right URL for REST API to get Orders from my seller central account?  
    $accessKey      = 'AK...YOX.........';
    $secretKey      = 'K...........';
    $region             = 'us-east-1'; 
    $service            = 'execute-api';
    
    
    $requestUrl = 'https://sandbox.sellingpartnerapi-na.amazon.com/orders/v0/orders'; // '<full url>';
    $uri = '/orders/v0/orders'; // '<method path>';
    $httpRequestMethod = 'GET'; // '<http verb>';
    
    

I used this sample files: https://github.com/avi-wish/aws4-signature-php unfortunately there is no example URL for variable $host

If I test the connection, this is my response:

Response:403

{
  "errors": [
    {
      "message": "Access to requested resource is denied.",
     "code": "Unauthorized",
     "details": "Access token is missing in the request header."
    }
  ]
}

I found a possible solution here:

https://github.com/amzn/selling-partner-api-docs/issues/52#issuecomment-713522351

but it's not working for me.

Is that necessary to create a IAM User before? Here is the way I created it:
https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md#registering-your-selling-partner-api-application

I think a lot of people have the same problem. Hope someone can give me a hint.

after getting the access token, the curl return the error :

[message] => Access to requested resource is denied.                    [code] => MissingAuthenticationToken



function get_orders(){
        $this->host = 'https://sellingpartnerapi-na.amazon.com/orders/v0/orders';
        debug('>>get list of orders');
        $data = "x-amz-date&access_token={$this->access_token}";

        $curl = curl_init($this->host . '/orders/v0/orders');
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json;charset=UTF-8')
            );
        
        $result = curl_exec($curl);
        curl_close($curl);
        $obj = json_decode($result,true);
        debug($obj);
    }


Solution 1:[1]

Unfortunately you give very little information about what you want to do. There are two ways to authorize the SP-API that is set via the grant-type.

I suppose you want to authorize yourself and not a vendor.

Then you have to send your request to the following endpoint:

api.amazon.com/auth/o2/token

You have to specify the $host with api.amazon.com.

The request method will be POST.

You pass the parameters to the http Body: grant_type, refresh_token, client_id, client_secret

Please have a look at the following link:

Connecting to the Selling Partner API

After you have done all this the same way, you will get the following answer:

{
"access_token":"Atza|IwEBIJR-9fxxxxxxxxxxxxxxxxxxxxxx",
"refresh_token":"Atzr|IwEBIxxxxxxxxxxxxxxxxxxxxxxxx",
"token_type":"bearer",
"expires_in":3600
}

Now you can use the access_token to sign your requests. In the following, I also recommend you to use my post from another answer to sign a request and successfully send a request.

Answer: 64858116

Solution 2:[2]

public function GetAcessToken()
    {
        $RefeshToken = $this->RefreshToken;

        $data = "grant_type=refresh_token" 
        ."&refresh_token=". $RefeshToken
        ."&client_id=".$this->ClientID
        ."&client_secret=".$this->ClientSecret;

        $curl = curl_init($this->UrlForAmazonToken);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/x-www-form-urlencoded;charset=UTF-8')
        );
        
        $result = curl_exec($curl);
        curl_close($curl);
        $obj = json_decode($result,true);
        
        $this->AccessToken =  $obj['access_token'] ;
 
        return $this->AccessToken;
    }

It works for me.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kai
Solution 2 Flair