2016-09-19 10 views
2

このトピックに関する質問は何度も尋ねられていますが、私はすべての問題を解決することはできません。Amazonマーケットプレイスのフィード - MD5ハッシュを計算する際の問題

SenderContentMD5DoesNotMatchthe Content-MD5 HTTP header you passed for your feed did not match the Content-MD5 we calculated for your feed4f0c5178-8971-4322-ba85-aed0bfe81bd0

は、実際に私は、MWSの注文状況を更新しています:私は、次のエラーを取得していますリクエストを送信するとここに私のコードは...

<?php 
define('AWS_ACCESS_KEY_ID','xxxxx'); 
define('AWS_SECRET_ACCESS_KEY','xxxxx'); 
define('MERCHANT_ID','xxxxx'); 
define('MARKETPLACE_ID','xxxxxx'); 

$file = 'test.xml'; 

$feed = ' 
    <?xml version="1.0" encoding="UTF-8"?> 
    <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd"> 
      <Header> 
       <DocumentVersion>1.02</DocumentVersion> 
       <MerchantIdentifier>Mystore</MerchantIdentifier> 
      </Header> 
      <MessageType>OrderFulfillment</MessageType> 
      <Message> 
       <MessageID>123456</MessageID> 
       <OrderFulfillment> 
        <AmazonOrderID>123-1234567-1234567</AmazonOrderID> 
        <MerchantFulfillmentID>1474290171</MerchantFulfillmentID> 
        <FulfillmentDate>2016-09-19T12:23:41+00:00</FulfillmentDate> 
        <FulfillmentData> 
          <CarrierCode>FedEx</CarrierCode> 
          <ShippingMethod>FedEx</ShippingMethod> 
          <ShipperTrackingNumber>1111111</ShipperTrackingNumber> 
        </FulfillmentData> 

       </OrderFulfillment> 
      </Message> 
     </AmazonEnvelope> 
    '; 

$feedHandle = @fopen($file, 'w'); 
fwrite($feedHandle, trim($feed)); 
rewind($feedHandle); 

$params = array(
    'AWSAccessKeyId' => AWS_ACCESS_KEY_ID, 
    'Action' => "SubmitFeed", 
    'Merchant' => MERCHANT_ID, 
    'SignatureVersion' => "2", 
    'Timestamp'=> gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()), 
    'Version'=> "2009-01-01", 
    'SignatureMethod' => "HmacSHA256", 
    'FeedType' => '_POST_ORDER_FULFILLMENT_DATA_', 
    'MarketplaceIdList.Id.1' => MARKETPLACE_ID, 
    'PurgeAndReplace' => 'false', 
); 

$url_parts = array(); 
foreach(array_keys($params) as $key) 
    $url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key])); 

sort($url_parts); 

$url_string = implode("&", $url_parts); 
$string_to_sign = "POST\nmws.amazonservices.com\n/Feeds/2009-01-01\n" . $url_string; 

// Sign the request 
$signature = hash_hmac("sha256", $string_to_sign, AWS_SECRET_ACCESS_KEY, TRUE); 

$signature = urlencode(base64_encode($signature)); 

$url = "https://mws.amazonservices.com/Feeds/2009-01-01" . '?' . $url_string . "&Signature=" . $signature; 

$md5 = base64_encode(md5(trim($feed), true)); 

$httpHeader=array(); 
$httpHeader[]='Transfer-Encoding: chunked'; 
$httpHeader[]='Content-Type: application/x-www-form-urlencoded; charset=utf-8'; 
$httpHeader[]='Content-MD5: ' . $md5; 
$httpHeader[]='Expect:'; 
$httpHeader[]='Accept:'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 15); 
curl_setopt($ch, CURLOPT_USERAGENT, '<MWS_SubmitFeed>/<1.02> (Language=PHP/' . phpversion() . ')'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_INFILE, $feedHandle); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader); 
curl_setopt($ch, CURLOPT_POST, true); 
$response = curl_exec($ch); 
var_dump($response); 
?> 

です。

誰かが問題を整理したり、どこに間違っているかを指摘していただければ幸いです。

答えて

1

xmlをトリミングしてからmd5を計算しています。アマゾンはあなたが送るxmlのトリムをしていないのに対し、したがって、不一致。そこからtrim()を削除します。

+0

ありません運が)、まだ同じエラーを取得し、MD5をエコーするとき、それはそのように出力します。GFhBmvap + b32ZJS7MLvRzQの== – zed

+0

を[OK]を、私は解決策を得ました。 – zed

0

私は解決策を得ました。

fwrite($feedHandle, trim($feed)); 

fwrite($feedHandle, $feed); 

$md5 = base64_encode(md5(trim($feed), true)); 

$md5 = base64_encode(md5(stream_get_contents($feedHandle), true)); 

に: ハッシュ生成コードをSabujハッサンによって示唆これらのラインから)(トリムを削除および変更

Re stream_get_contents($ feedHandle)にtrim($ feed)を置くと、content-md5の正しいハッシュが生成されます。 (トリム除去した後

Note:stream_get_contents($feedHandle) is mentioned in amazon's php library.

関連する問題