使用 curl 连接到 Amazon Selling Partner API

Posted

技术标签:

【中文标题】使用 curl 连接到 Amazon Selling Partner API【英文标题】:Connection to Amazon Selling Partner API with curl 【发布时间】:2021-02-03 00:18:54 【问题描述】:

我必须在我的问题中添加更多详细信息,所以这是我尝试从我的卖家中心帐户获取订单:

    $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>';
    
    

我使用了这个示例文件:https://github.com/avi-wish/aws4-signature-php 不幸的是,没有变量 $host 的示例 URL

如果我测试连接,这是我的回应:

Response:403


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

我在这里找到了一个可能的解决方案:

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

但它不适合我。

之前是否需要创建 IAM 用户?这是我创建它的方式:https://github.com/amzn/selling-partner-api-docs/blob/main/guides/developer-guide/SellingPartnerApiDeveloperGuide.md#registering-your-selling-partner-api-application

我想很多人都有同样的问题。希望有人能给我提示。

获取访问令牌后,curl返回错误:

[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);
    

【问题讨论】:

“什么都没有发生”非常模糊。您需要提供更多线索。 嗨,我在我的问题中添加了更多详细信息。 【参考方案1】:

不幸的是,您很少提供有关您想做的事情的信息。有两种方法可以授权通过grant-type 设置的 SP-API。

我想您想授权自己而不是供应商。

然后您必须将您的请求发送到以下端点:

api.amazon.com/auth/o2/token

您必须使用api.amazon.com 指定$host。

请求方法为POST

您将参数传递给 http 正文: grant_typerefresh_tokenclient_idclient_secret

请查看以下链接:

Connecting to the Selling Partner API

用同样的方法做完这一切后,你会得到以下答案:


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

现在您可以使用 access_token 来签署您的请求。 在下文中,我还建议您使用我在另一个答案中的帖子来签署请求并成功发送请求。

Answer: 64858116

【讨论】:

谢谢,它一直工作到现在。我在上面用新代码写了一个答案,因为我尝试在第二步中获取订单。【参考方案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;
    

它对我有用。

【讨论】:

quang hai : 谢谢你提供这么好的代码。如果可能的话,给我看一个例子来获得订单。再次感谢您。

以上是关于使用 curl 连接到 Amazon Selling Partner API的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon Redshift 连接到数据库

尝试使用 Postgres 连接到数据库,但无法将 Amazon 服务器上的地址转换为 Amazon 数据库

无法使用 MySQL 工作台连接到 Amazon RDS

Java 连接到 Amazon Redshift

将 IntelliJ 连接到 Amazon Redshift

尝试使用 SQLWorkbench 连接到 Amazon Redshift 时出现操作超时错误