【发布时间】:2015-11-26 18:36:23
【问题描述】:
在设置对亚马逊MWS的订单部分进行API调用时,我遇到了很多麻烦和沮丧。
当我使用Amazon MWS Scratchpad 时,我能够获得成功的响应,但是当我自己拨打电话时,我得到了错误:
The request signature we calculated does not match the signature you provided.
Check your AWS Secret Access Key and signing method.
Consult the service documentation for details.
我可能是错的,但我认为我实际拨打电话的方式一定有问题,因为即使我使用通过 Scratchpad 创建的确切呼叫,我仍然收到相同的错误。
尽管如此,这是我试图构建请求的代码:
<?php
$secretKey = '<MY SECRET KEY>';
$parameters = array();
// required parameters
$parameters['Action'] = 'ListOrders';
$parameters['AWSAccessKeyId'] = '<MY ACCESS KEY>';
$parameters['MWSAuthToken'] = '<MY AUTH TOKEN>';
$parameters['SellerId'] = '<MY SELLER ID>';
$parameters['SignatureMethod'] = 'HmacSHA256';
$parameters['SignatureVersion'] = '2';
$parameters['Timestamp'] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
$parameters['Version'] = '2013-09-01';
// optional parameters
$parameters['MarketplaceId.Id.1'] = '<MARKETPLACE ID>';
$parameters['CreatedAfter'] = '2015-10-04T04%3A00%3A00Z';
/**
* Calculate String to Sign
*
* @param array $parameters request parameters
* @return String to Sign
*/
function _calculateStringToSign(array $parameters) {
$data = "POST\n";
$data .= "mws.amazonservices.com\n";
$data .= "/Orders/2013-09-01\n";
$data .= _getParametersAsString($parameters);
return $data;
}
/**
* Convert paremeters to Url encoded query string
*/
function _getParametersAsString(array $parameters)
{
uksort($parameters, 'strcmp');
$queryParameters = array();
foreach ($parameters as $key => $value) {
$queryParameters[] = $key . '=' . _urlencode($value);
}
return implode('&', $queryParameters);
}
function _urlencode($value) {
return str_replace('%7E', '~', rawurlencode($value));
}
/**
* Computes RFC 2104-compliant HMAC signature.
*/
function _sign($stringToSign, $secretKey)
{
$hash = 'sha256';
return urlencode(base64_encode(
hash_hmac($hash, $stringToSign, $secretKey, true)
));
}
/**
* Builds up the request.
*/
function buildRequest(array $parameters, $secretKey) {
$endpoint = 'https://mws.amazonservices.com/Orders/2013-09-01';
$signature = _sign(_calculateStringToSign($parameters), $secretKey);
$parameters['Signature'] = $signature;
uksort($parameters, 'strcmp');
return $endpoint . '?' . _getParametersAsString($parameters);
}
下面是实际调用的代码:
$request = buildRequest($parameters, $secretKey);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/39.0.2171.71 Safari/537.36');
$page = curl_exec($ch);
curl_close($ch);
var_dump($page);
我需要帮助确定此脚本的问题所在以及为什么我无法获得成功的响应。
【问题讨论】:
-
您的问题解决了吗?我想我也面临同样的问题(stackoverflow.com/questions/40874090/…)
-
@A.. 这是很久以前的事了,我几乎不记得了。我认为这里的答案很有帮助,我还必须更改参数的顺序。我可以试着找到我今天稍后使用的代码,如果你那时还没有得到它
-
稍后我将更改参数的顺序......但如果你能告诉我你的代码,我将不胜感激!
-
@A.. 我刚刚将我使用的代码复制到了gist。我没有时间去测试或真正去体验它,它是 Laravel 项目的一部分。不确定代码有多好或前一段时间的任何内容,但您应该能够使用它来获得成功的响应。等我有时间再回来看看你有没有得到它
-
非常感谢,今晚我要试试!!如果有效,请回复我的问题,我会给你正确的答案。
标签: php amazon-web-services curl amazon-mws