Php Amazon Marketplace提要-计算MD5哈希时的问题

Php Amazon Marketplace提要-计算MD5哈希时的问题,php,xml,curl,hash,amazon-mws,Php,Xml,Curl,Hash,Amazon 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 v

我知道与这个话题相关的问题已经被问了很多次,我已经读了所有的书,但仍然无法解决我的问题。这是我的密码

<?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);
?>
AWS\u访问\u密钥\u ID,
“操作”=>“提交种子”,
“商户”=>商户ID,
'SignatureVersion'=>“2”,
'Timestamp'=>gmdate(“Y-m-d\TH:i:s.\\0\\0\\0\\Z”,time()),
“版本”=>“2009-01-01”,
“SignatureMethod”=>“HmacSHA256”,
“FeedType”=>“\u POST\u订单\u履行\u数据”,
'MarketplaceIdList.Id.1'=>MARKETPLACE\u Id,
“PurgeAndReplace”=>“false”,
);
$url_parts=array();
foreach(数组_键($params)作为$key)
$url\u parts[]=$key。"=" . str_replace('%7E','~',rawurlencode($params[$key]);
排序($url\u部分);
$url\u string=内爆(&,$url\u部分);
$string_to_sign=“POST\nmws.amazonservices.com\n/Feeds/2009-01-01\n”$url_字符串;
//签署请求
$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\u字符串。“&Signature=”$签名;
$md5=base64_编码(md5(修剪($feed),true));
$httpHeader=array();
$httpHeader[]=“传输编码:分块”;
$httpHeader[]='Content-Type:application/x-www-form-urlencoded;字符集=utf-8';
$httpHeader[]=“Content-MD5:”$md5;
$httpHeader[]=“预期:”;
$httpHeader[]=“接受:”;
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_超时,15);
curl_setopt($ch,CURLOPT_USERAGENT,'/(Language=PHP/'.phpversion());
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch,CURLOPT_infle,$feedHandle);
curl_setopt($ch,CURLOPT_HTTPHEADER,$HTTPHEADER);
curl_setopt($ch,CURLOPT_POST,true);
$response=curl\u exec($ch);
var_dump($response);
?>
当我提交请求时,我收到以下错误:

SenderContentMD5DoesNotMatcht您为提要传递的Content-MD5 HTTP标头与我们为提要4F0C5178-8971-4322-ba85-aed0bfe81bd0计算的Content-MD5不匹配

实际上,我正在更新MWS上的订单状态


如果有人能解决问题或指出我的错误,我们将不胜感激

您正在对xml进行修剪,然后计算
md5
。而amazon并没有对您发送的xml进行任何修改。因此不匹配。从那里移除
trim()

我找到了解决方案。 从Sabuj Hassan建议的这些行中删除trim(),并修改哈希生成代码:

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

将trim($feed)替换为stream_get_contents($feedHandle),它将为content-md5生成正确的哈希

注意:亚马逊的php库中提到了stream\u get\u内容($feedHandle)


不走运,在删除trim()之后,仍然会得到相同的错误,当回显md5时,它会这样打印:GFhBmvap+b32ZJS7MLvRzQ==好,我得到了解决方案。
fwrite($feedHandle, $feed);
$md5 = base64_encode(md5(trim($feed), true));  
$md5 = base64_encode(md5(stream_get_contents($feedHandle), true));