2017-08-28 41 views
0

我在重新定價與亞馬遜MWS API PHP捲曲的產品問題,有錯誤 發件人ContentMD5DoesNotMatch 你通過,你就輸不匹配的Content-MD5 HTTP頭內容-MD5計算我們爲您feed4bad39e1-7479-4ebb-ae94-76e2eed742cb亞馬遜MWS提交供稿平面文件的產品重新定價的問題

這裏是完整的代碼

的fwrite($寫, 「SKU \ tprice」);

while($row = mysql_fetch_assoc($rsSql)) 
{ 
    fwrite($write,"\n".$row['seller_sku']."\t".$row['current_price']); 
} 

fclose($write); 

$file = 'prices.tsv'; 
$fo = fopen($file,'r'); 

$httpHeader=array(); 
$httpHeader[]='Transfer-Encoding: chunked'; 
$httpHeader[]='Content-Type: text/tab-separated-values'; 
$httpHeader[]='Content-MD5: ' . base64_encode(md5(trim($file))); 
$httpHeader[]='Expect:'; 
$httpHeader[]='Accept:'; 

$curl_options=array(
CURLOPT_UPLOAD=>true, 
CURLOPT_INFILE=>$fo, 
CURLOPT_RETURNTRANSFER=>true, 
CURLOPT_POST=>true, 
// CURLOPT_PORT=>443, 
// CURLOPT_SSLVERSION=>3, 
CURLOPT_SSL_VERIFYHOST=>false, 
CURLOPT_SSL_VERIFYPEER=>false, 
CURLOPT_FOLLOWLOCATION=>1, 
CURLOPT_PROTOCOLS=>CURLPROTO_HTTPS, 
CURLINFO_HEADER_OUT=>TRUE, 
CURLOPT_HTTPHEADER=>$httpHeader, 
CURLOPT_CUSTOMREQUEST=>'POST', 
CURLOPT_VERBOSE=>true, 
// CURLOPT_HEADER=>true, 
); 


$param = array(); 
$param['AWSAccessKeyId'] = AWSKEY; 
$param['Action']   = 'SubmitFeed'; //CHANGE THIS 
$param['SellerId']   = SELLERID; 
$param['SignatureMethod'] = 'HmacSHA256'; 
$param['SignatureVersion'] = '2'; 
$param['ContentMD5Value'] = base64_encode(md5(trim($file))); 
$param['Timestamp']  = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()); 
$param['Version']   = '2009-01-01'; 
$param['MarketplaceId'] = MARKETPLACE; 
$param['FeedType'] = "_POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA_"; 
$param['PurgeAndReplace'] = 'true'; 


$secret = SECRETKEY; 

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

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

} 

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

$sign = 'POST' . "\n"; 
$sign .= 'mws.amazonservices.com' . "\n"; 
$sign .= '/Feeds/2009-01-01' . "\n"; 
$sign .= $arr; 

$signature = hash_hmac("sha256", $sign, $secret, true); 
$signature = urlencode(base64_encode($signature)); 
$link = "https://mws.amazonservices.com/Feeds/2009-01-01?"; 
$link .= $arr . "&Signature=" . $signature; 

$ch = curl_init($link); 
curl_setopt_array($ch,$curl_options); 
$response=curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

$xml = simplexml_load_string("$response"); 
echo $response; 

回答

0

您的代碼將計算MD5文件的的,而不是其內容。

base64_encode(md5(trim($file))); <-- $file is actually the filename! 

而且,你不應該修剪從文件的內容什麼,你需要二進制MD5傳遞到編碼器:

base64_encode(md5($filecontents,true)); 

base64_encode(md5_file($filename,true));