繁体   English   中英

使用curl将Amazon MWS暂存器提交提要查询转换为API调用

[英]Converting amazon MWS scratchpad submit feed query to API call using curl

最近两天,我尝试在AMAZON API搜索有关SUBMIT FEED "_POST_PRODUCT_DATA_" 我认为标头有问题还是其他问题。 以下是我的代码...

$feed = '<?xml version="1.0" encoding="iso-8859-1"?>
            <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
            <Header>
            <DocumentVersion>1.02</DocumentVersion>
            <MerchantIdentifier>XXX</MerchantIdentifier>
            </Header>
            <MessageType>Product</MessageType>
            <PurgeAndReplace>false</PurgeAndReplace>
            <Message>
            <MessageID>1</MessageID>
            <OperationType>Update</OperationType>
            <Product>
            <SKU>CX-1003</SKU>
            <StandardProductID>
            <Type>ASIN</Type>
            <Value>B000H3ACGW</Value>
            </StandardProductID>
            <Condition>
            <ConditionType>New</ConditionType>
            </Condition>
            </Product>
            </Message>
            </AmazonEnvelope>';

        $feedHandle = @fopen('php://memory', 'rw+');
        fwrite($feedHandle, $feed);
        rewind($feedHandle);

        $param = array(
            'AWSAccessKeyId'=> aws_access_key_id,
            'Action'=>"SubmitFeed",
            'Merchant'=> seller_id,
            'SignatureMethod' => "HmacSHA256",
            'SignatureVersion'=> "2",
            'Timestamp'=> gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()),
            'Version' => "2009-01-01",
            'PurgeAndReplace' => "false",
            'FeedType' => "_POST_PRODUCT_DATA_");
            $md5 = base64_encode(md5(stream_get_contents($feedHandle), true));
            $secret = secret_key;

        $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 .= '/' . "\n";
        $sign .= $arr;

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

        $link  = "https://mws.amazonservices.com/?";
        $link .= $arr . "&Signature=" . $signature;

        $ch = curl_init($link);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml', 'Content-MD5: '.$md5));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        $response = curl_exec($ch);
        $info = curl_getinfo($ch);
        pr($info);
        $resp = simplexml_load_string($response);
        curl_close($ch);
        pr($resp);die;

它显示以下错误。 我不知道O在哪里犯错了。 我需要帮助。 谢谢。

SimpleXMLElement Object
(
[Error] => SimpleXMLElement Object
    (
        [Type] => Sender
        [Code] => SignatureDoesNotMatch
        [Message] => The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
    )
[RequestID] => 0b7e2205-c99a-456d-8e30-715d43e6c115
)

您应尝试使用适用于PHP的官方Amazon Feeds Api: https//developer.amazonservices.com/doc/bde/feeds/v20090101/php.html

您也可以在packagist上找到它的一些分支。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM