亚马逊网络服务中的签名不匹配

我正在为AMAZON WEB SERVICES编写一个PHP代码。 这是我的代码。

<?php

function amazonEncode($text) {
    $encodedText = "";
    $j = strlen($text);
    for ($i = 0; $i < $j; $i++) {
        $c = substr($text, $i, 1);
        if (!preg_match("/[A-Za-z0-9-_.~]/", $c)) {
            $encodedText .= sprintf("%%%02X", ord($c));
        } else {
            $encodedText .= $c;
        }
    }
    return $encodedText;
}

function amazonSign($url, $secretAccessKey) {
    // 0. Append Timestamp parameter
    $url .= "&Timestamp=" . gmdate("Y-m-dTH:i:sZ");
    // 1a. Sort the UTF-8 query string components by parameter name
    $urlParts = parse_url($url);
    parse_str($urlParts["query"], $queryVars);
    ksort($queryVars);
    // 1b. URL encode the parameter name and values
    $encodedVars = array();
    foreach ($queryVars as $key => $value) {
        $encodedVars[amazonEncode($key)] = amazonEncode($value);
    }
    // 1c. 1d. Reconstruct encoded query
    $encodedQueryVars = array();
    foreach ($encodedVars as $key => $value) {
        $encodedQueryVars[] = $key . "=" . $value;
    }
    $encodedQuery = implode("&", $encodedQueryVars);
    // 2. Create the string to sign
    $stringToSign = "GET";
    $stringToSign .= "n" . strtolower($urlParts["host"]);
    $stringToSign .= "n" . $urlParts["path"];
    $stringToSign .= "n" . $encodedQuery;
    // 3. Calculate an RFC 2104-compliant HMAC with the string you just created,
    //    your Secret Access Key as the key, and SHA256 as the hash algorithm.
    if (function_exists("hash_hmac")) {
        $hmac = hash_hmac("sha256", $stringToSign, $secretAccessKey, TRUE);
    } elseif (function_exists("mhash")) {
        $hmac = mhash(MHASH_SHA256, $stringToSign, $secretAccessKey);
    } else {
        die("No hash function available!");
    }
    // 4. Convert the resulting value to base64
    $hmacBase64 = base64_encode($hmac);
    // 5. Use the resulting value as the value of the Signature request parameter
    // (URL encoded as per step 1b)
    $url .= "&Signature=" . amazonEncode($hmacBase64);
    echo $url;
}

$url = 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=something&AssociateTag=something&Operation=ItemSearch&Keywords=Mustang&SearchIndex=Blended&Condition=Collectible&Timestamp=2016-08-08T12%3A00%3A00Z&Version=2013-08-01';
$SECRET_KEY = 'my_secret_key';
$url = amazonSign($url, $SECRET_KEY);
?>

此代码返回一个URL。 我在浏览器中使用该URL,以便我可以获取我的搜索结果,但使用该URL会给我这个错误。

SignatureDoesNotMatch我们计算的请求签名与您提供的签名不匹配。 检查您的AWS秘密访问密钥和签名方法。 详细信息请参阅服务文档。

我正在使用这些作为AWSAccessKeyIdSECRET_KEY

在这里输入图像描述


这可能是$stringToSign .= "n"应该是$stringToSign .= "n"但这可能不是唯一的问题。 如果您使用Amazon的官方PHP SDK而不是依赖自定义脚本,那么问题就会减少。


您看到的错误通常是错误的访问密钥或秘密访问密钥。 或者问题可能是非UTF-8编码的字符串。 一旦我UTF-8编码它,错误将消失。 或者如果您使用空值发送元数据,则无法工作。 或者如果您没有提供Content-Length参数,也可能发生此类问题。

链接地址: http://www.djcxy.com/p/38999.html

上一篇: Signature does not match in Amazon Web Services

下一篇: AWS SignatureDoesNotMatch