2017-10-13 3 views
0

Lorsque j'exécute ce code, j'obtiens une erreur SignatureDoesNotMatch La signature de demande que nous avons calculée ne correspond pas à la signature que vous avez fournie. Vérifiez votre clé d'accès secrète AWS et la méthode de signature. Consultez la documentation de service pour plus de détails.La commande Amazon MWS ne correspond pas à la signature

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

Répondre

0

Votre calcul de signature semble correct. Cependant, vous calculez une signature basée sur un "POST", mais vous êtes en train de faire un GET. Je suppose que c'est ce qui jette le calcul de la signature de l'autre côté.

+0

J'ai essayé à la fois GET & POST, mais les deux jeter même signature erreur de correspondance –