亚马逊 MWS ListOrders 从 Scratchpad 请求

2024-02-26

我正在尝试通过 MWS Scratchpad 获取订单列表。 在便签本中一切正常。

HTTP POST 是

POST /Orders/2013-09-01?AWSAccessKeyId=$CHIAVE_ACCESSO
&Action=ListOrders
&SellerId=$SELLER_ID
&SignatureVersion=2
&Timestamp=2016-11-29T18%3A58%3A52Z
&Version=2013-09-01
&Signature=$SIGNATURE
&SignatureMethod=HmacSHA256
&CreatedAfter=2016-10-31T23%3A00%3A00Z
&MarketplaceId.Id.1=APJ6JRA9NG5V4 HTTP/1.1
Host: mws.amazonservices.it
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript)
Content-Type: text/xml

要签名的字符串(在第二个框中)是

POST
mws.amazonservices.it
/Orders/2013-09-01
AWSAccessKeyId=$CHIAVE_ACCESSO&Action=ListOrders&CreatedAfter=2016-10-31T23%3A00%3A00Z&MarketplaceId.Id.1=APJ6JRA9NG5V4&SellerId=$SELLER_ID&Signat    ureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-11-29T18%3A58%3A52Z&Version=2013-09-01

显示暂存器的结果是正确的。

我想做的是通过 PHP 发出请求并详细说明结果。

但是如果我首先尝试将请求放在我的浏览器上,例如

https://mws.amazonservices.it/Orders/2013-09-01?AWSAccessKeyId= https://mws.amazonservices.it/Orders/2013-09-01?AWSAccessKeyId=$CHIAVE_ACCESSO&Action=ListOrders&MarketplaceId=APJ6JRA9NG5V4&SellerId=$SELLER_ID&SignatureMethod=HmacSHA256&SignatureVersion=2&时间戳=2016-11-29T19%3A13%3A01.000Z&版本=2013-09-01&Signature=Q9Xnr9Jhtkze LUAsCFKPln8SS34FkCQRmELE2WiIhPo%3D&CreatedAfter=2016-10-31T23%3A00%3A00Z

the error is error

我用来创建签名的方法是在 stackoverflow 上找到的,如下所示:

$sign  = 'GET' . "\n";
$sign .= 'mws.amazonservices.it' . "\n";
$sign .= '/Orders/2013-09-01' . "\n";
$sign .= $arr;

$signature = hash_hmac("sha256", $sign, $CHIAVE_SEGRETA, true);
$signature = urlencode(base64_encode($signature));

我做错了什么?


参数的顺序很重要。

下面是一些示例代码,应该可以为您提供一个良好的起点。您只需要稍微修改它以适合您的系统。

class AmazonMWS
{
    private $secretKey = '';

    private $parameters = array();

    /**
     * Constructor for the AmazonMWS class.
     * Initializes constants.
     */
    public function __construct() 
    {
        $this->secretKey = Constant::get('SECRET_KEY');

        $this->parameters['AWSAccessKeyId']     = Constant::get('AWSAccessKeyId');
        $this->parameters['MarketplaceId.Id.1'] = Constant::get('MarketplaceId.Id.1');
        $this->parameters['SellerId']           = Constant::get('SellerId');
        $this->parameters['SignatureMethod']    = Constant::get('SignatureMethod');
        $this->parameters['SignatureVersion']   = Constant::get('SignatureVersion');
    }

    public function setListOrders()
    {
        $this->parameters['Action'] = 'ListOrders';
        $this->parameters['Version'] = '2013-09-01';
        $this->parameters['Timestamp'] = $this->getTimestamp();

        // this part should change and depend on the method/parameter.. for now just for testing

        $this->parameters['CreatedAfter'] = '2015-11-01';
    }

    public function listOrders()
    {
        $request = "https://mws.amazonservices.com/Orders/2013-09-01?";
        $request .= $this->getParameterString($this->parameters) . "&Signature=" . $this->calculateSignature($this->calculateStringToSign($this->parameters));

        echo $request;

        return Curl::fetchSSL($request);
    }

    /**
     * Calculates String to sign.
     * 
     * @param array $parameters request parameters
     * @return String to sign
     */
    protected function calculateStringToSign(array $parameters)
    {
        $stringToSign  = 'GET' . "\n";
        $stringToSign .= 'mws.amazonservices.com' . "\n";
        $stringToSign .= '/Orders/2013-09-01' . "\n";
        $stringToSign .= $this->getParameterString($parameters);

        return $stringToSign;
    }

    /**
     * Gets the query parameters as a String sorted in natural-byte order.
     * 
     * @param array $parameters request parameters
     * @return String of parameters
     */
    protected function getParameterString(array $parameters)
    {
        $url = array();
        foreach ($parameters as $key => $val) {
            $key = $this->urlEncode($key);
            $val = $this->urlEncode($val);
            $url[] = "{$key}={$val}";
        }
        sort($url);

        $parameterString = implode('&', $url);

        return $parameterString;
    }

    /**
     * Computes RFC 2104-compliant HMAC signature.
     *
     * @param String to sign
     */
    protected function calculateSignature($stringToSign)
    {
        $signature = hash_hmac("sha256", $stringToSign, $this->secretKey, true);
        return urlencode(base64_encode($signature));
    }

    /**
     * URL encodes a string.
     */
    protected function urlEncode($string)
    {
        return str_replace("%7E", "~", rawurlencode($string));
    }

    /**
     * Gets the current date as ISO 8601 timestamp
     */
    protected function getTimestamp()
    {
        return gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

亚马逊 MWS ListOrders 从 Scratchpad 请求 的相关文章

  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 如何在php中使用preg添加html属性

    我正在寻找在 php 中编写一个脚本来扫描 html 文档并根据它找到的内容向元素添加新标记 更具体地说 我是扫描文档并为每个元素搜索CSS标记 float right left 如果找到它 它会添加align right left 基于它
  • 如何在html中制作多行类型的文本框?

  • Zend Framework Zend_Form 装饰器: 位于按钮元素内部?

    我有一个像这样创建的按钮元素 submit new Zend Form Element Button submit submit gt setLabel My Button submit gt setDecorators array Vie
  • php下拉菜单人口

    我正在尝试编写一个 php 脚本 该脚本将根据主下拉菜单的选择填充第二个下拉菜单 我想使用 jquery 来完成所有非页面刷新的事情 但我发现现有的所有东西都很难理解和修改 你知道有什么写得很好且易于理解的东西吗 或者可能是现有的教程 下面
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d
  • 检查文件权限

    我怎样才能检查file permissions 无需通过运行操作系统特定命令passthru or exec Use 文件权限 http php net fileperms功能 clearstatcache echo substr spri
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • Windows iis 7.0 上的 APC 不稳定

    我的 IIS 非常不稳定 因为它总是由于某种与 APC 相关的原因而重新启动 服务器的规格如下 Intel R Xeon CPU 3GHZ 3GHZ 2GB RAM 64bit APC 和服务器规格 3 1 7 dev PHP Versio
  • 监听文件夹和文件(更改)

    可以直接在 PHP 或 Node 上监听文件夹和文件的更改 通过事件 还是我需要创建自己的方法来执行此操作 Example 我需要听文件夹 user 如果我将一些文件添加到该目录中 PHP 或 Node 会收到信息并运行PathEvent
  • 接口中的构造方法

    接口中的构造方法不好吗 为什么人们认为有人想要实例化接口 我们想要做的是强制实现者实现构造函数 就像其他接口方法一样 接口就像一个合同 假设我有一个接口 Queue 并且我想确保实现者创建一个带有一个参数的构造函数 该构造函数创建一个单例队
  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • 如何在 Carbon Laravel 中添加日期和另一个日期?

    在我的 laravel 项目中 我想将日期时间增加到前一个日期时间 这是我的代码 expire order 0 gt expire date new Carbon now gt addMonths 6 这两行的结果是 2018 01 28
  • AWS ElasticSearch Service - 从 CF 模板设置加密选项

    我正在创建一个云形成模板来在AWS中配置elasticsearch服务域 我想将加密下的此属性设置为 true 域的所有流量都需要 HTTPS 但我无法在 AWS 文档中找到执行此操作的方法 用于设置加密属性的其他选项 例如 启用静态数据加
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f

随机推荐

  • 使用自签名证书进行代码签名软件

    目前 我们公司使用 Verisign Symantec 的数字证书对我们的软件进行代码签名 我们公司有人试图说服我们使用自签名证书 而不是从 Verisign Symantec 购买的证书 部分是作为 降低成本 的过程 尽管它们对于 2 3
  • 在运行时突出显示 WebDriver 中的元素

    有人可以帮忙吗 在 WebDriver 中执行测试期间 如何突出显示以下类中的所有 Web 元素 使用 Selenium RC 时 一切都非常简单 但使用 WebDriver 时我却遇到了困难 如果有人能为我提供一些我可以尝试的代码 以及该
  • .NET 集合类的渐近复杂度

    是否有任何关于 NET 集合类方法的渐近复杂性 big O 和其他 的资源 Dictionary
  • 为什么 Asp.Net Core 身份验证方案是强制性的

    我对 Asp Net Core 中似乎强制使用身份验证方案这一事实感到非常沮丧 我的目标是构建一个 API 我不想了解有关客户端的任何信息 我已经构建了自定义身份验证和授权 效果很好 我没有使用身份或cookie 但是 如果没有有效的身份验
  • 如何使用 Angular 过滤器对数据进行分组?

    我有一份球员名单 每个球员都属于一个组 如何使用过滤器列出每个组的用户 name Gene team team alpha name George team team beta name Steve team team gamma name
  • jdk1.6内存布局

    我使用的是jdk1 6 我配置了 Xmx 2G Xms 2G 新尺寸 最大新尺寸 660m 我启用了详细GC 我看到了这一点 但我不明白 PSYoungGen total 608256K used 32440K eden space 540
  • 我应该有多少个 DBContext

    使用实体 我目前拥有 dbcontext 其中包含每个表 我想知道是否每个人都这样做 或者例如每个模块都有一个上下文 对我来说 dbcontext 是一种将模型映射到数据库的连接 并且由于只有一个数据库 所以我只需要一个 在我深入讨论之前
  • 防止登录请求泛滥的简单方法?

    如果我的网站使用 POST 表单进行登录 有什么快速 简单的方法可以防止恶意客户端向我的 Web 服务器发送大量 POST 请求 试图暴力破解我的用户帐户 PHP MySQL Apache 防止暴力破解比乍看起来要棘手 解决方案是组合控制
  • 对象、类、函数

    我想知道 JavaScript 对象 类和函数之间有什么区别 我认为类和函数是对象类型是正确的吗 类和函数的区别是什么 或者它们真的是同一件事 只是它们的术语根据它们的使用方式而变化 function func alert foo a fu
  • vscode 选择不寻常的自动完成选项

    在使用最新版本的 Visual Studio Code 时 我正在编辑 JavaScript 文件 并且经常希望将输出记录到控制台 我创建了一个用户片段 以便更容易自动完成 但我发现自动完成中获得的默认选项是下面红色突出显示的选项 而不是绿
  • 重载不明确(int -> int64_t 与 int -> double)

    为什么是隐式转换int to int64 t vs int to double模糊的 我本以为积分重载会优先于浮点积分 include
  • 无法将 X 用作 Y,因为该名称已在使用中,即使尚未使用

    我使用的是 PHP 5 4 并且具有类似于以下内容的 PSR 0 类结构 A Library Session php namespace A Library class Session 我的 应用程序 Session php namespa
  • Kendo UI 指令要求 jQuery 在 AngularJS 之前可用。请在文档中的 Angular 之前包含 jquery

    我有一个带有角度应用程序的 Mvc 有两个布局文件 登录布局 默认布局 主布局 单击 影片 按钮时 调用 影片控制器 和 影片动作 public ActionResult Movie return View 它使用 mainlayout 文
  • 如何编写具有默认值和选项的 tcl 程序?

    我正在尝试编写一个 tcl 程序 它执行以下操作 proc myProc arg1 def1 arg2 def2 tcl gt myProc arg1 val1 arg2 val2 arg1 variable has val1 arg2 v
  • Maven Buildnumber 插件 - Git

    Maven Buildnumber 插件似乎还不能与 GIT 一起使用 暂时有解决办法吗 我最近从 SVN 切换到 GIT 发现这是一个简单的过渡 但这是我目前唯一没有做的事情 Walter 我使用这个 Maven 插件 https git
  • 茉莉花角度单元测试'无法读取未定义的'属性'

    我刚刚开始学习角度单元测试 但是 对具有 http 调用的函数的此测试失败 我已经指出了问题 但我无法解决它 我知道这是一个简单的问题 控制器 Get data from URL vm getJson function var url ht
  • Process.Start,WorkingDirectory,从一个exe启动另一个

    我希望你能明白我的问题 不知道我是否能用英语正确描述它 但我会尝试 情况 文件夹结构 MainFolder Sub1 Sub2 2个exe文件 MainFolder MainProg exe和 Sub2 SecondProg exe Mai
  • 具有主备集群 POD 的 Kubernetes 服务

    很抱歉没有保持简短 因为任何此类尝试都会让我错过问题的一些重要细节 我有一个旧版 Java 应用程序 它在集群环境中以主动 备用模式工作 通过预定义端口公开某些 RESTful Web 服务 如果我的应用程序集群中有两个节点 则在任何时间点
  • ng-reflect-model 显示错误的值,但输入正确

    输入值为01020304050607080900010203040506 并且输入显示了正确的值 但是 当我检查ng reflect model时 该值是010203040506070809000102030405 ngModel 有长度限
  • 亚马逊 MWS ListOrders 从 Scratchpad 请求

    我正在尝试通过 MWS Scratchpad 获取订单列表 在便签本中一切正常 HTTP POST 是 POST Orders 2013 09 01 AWSAccessKeyId CHIAVE ACCESSO Action ListOrde