Заказы Amazon MWS Подпись не совпадает

Когда я запускаю этот код, я получаю ошибку SignatureDoesNotMatch. Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой секретный ключ доступа AWS и метод подписи. Подробности смотрите в сервисной документации.

<?php 
    $param = array();
    $param['AWSAccessKeyId'] = 'AWSAccessKeyId';
    $param['Action'] = 'ListOrders';
    $param['MWSAuthToken'] = 'MWSAuthToken';
    $param['MarketplaceId'] = 'A21TJRUUN4KGV';
    $param['FulfillmentChannel.Channel.1'] = 'MFN';
    $param['PaymentMethod.Method.1'] = 'COD';
    $param['OrderStatus.Status.1'] = 'Pending';
    $param['OrderStatus.Status.2'] = 'PendingAvailability';
    $param['SellerId'] = 'AGNFZGZRZBUP1';
    $param['SignatureMethod'] = 'HmacSHA256';
    $param['SignatureVersion'] = '2';
    $param['CreatedAfter'] = "2017-09-01T13:41:49Z";
    $param['Timestamp'] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
    $param['Version'] = '2013-09-01';
    $secret = 'secret key';

    $url = array();
    foreach ($param as $key => $val) {

        $val = str_replace("%7E", "~", rawurlencode($val));
        $url[] = $key . "=" . $val;
    }

    sort($url);

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

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


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

    $link = "https://mws.amazonservices.in/Orders/2013-09-01?";
    $link .= $arr;
    $link .= "&Signature=" . $signature;
    echo($link); //for debugging - you can paste this into a browser and see if it loads.



    $ch = curl_init($link);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/xml'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    $response = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    echo "<pre>";
    print_r($response);
    print_r($info); 
?>

person lochawala    schedule 13.10.2017    source источник


Ответы (1)


Ваш расчет подписи выглядит нормально. Однако вы вычисляете подпись на основе «POST», но на самом деле вы выполняете GET. Я предполагаю, что это то, что сбрасывает расчет подписи с другой стороны.

person Hazzit    schedule 19.10.2017
comment
я пробовал и GET, и POST, но оба выдавали одну и ту же ошибку совпадения подписи - person lochawala; 20.10.2017
comment
@EdonFreiner Ваша проблема, скорее всего, будет отличаться от проблемы OP, поскольку многое может пойти не так, что все приводит к несоответствию подписи. Вероятно, вам следует открыть свой собственный вопрос, предоставив свой код - person Hazzit; 23.01.2019
comment
@hazzit Спасибо, я уже задавал вопрос здесь. stackoverflow.com/questions/54295491/ - person Edon Freiner; 23.01.2019