O cabeçalho HTTP do Amazon MWS SubmitFeed Content-MD5 não corresponde ao Content-MD5 calculado pela Amazon

Eu sei que esta pergunta não é nova, mas toda a solução que recebo para isso está em PHP ou meu problema é diferente deles.

Estou usando a API de feed do MWS para enviar um arquivo simples para atualizações de preço e quantidade e sempre obter o seguinte erro:

o cabeçalho HTTP do Content-MD5 que você passou para o seu feed não corresponde ao Content-MD5 que calculamos para o seu feed

Gostaria de fazer 3 perguntas aqui: -

O parâmetro ContentMD5Value é opcional, conforme fornecido no documento, mas se eu não tiver passado isso, ele informará que você deve inserir o ContentMD5Value.

Como no doc, oContentFeed que somos dados à Amazônia. Amazon createcontentMD5 para esse arquivo e depois comparacontentMD5 valor com ocontentMD5 valor que enviamos para a Amazon.
Se ambos corresponderem, então tudo bem, caso contrário, ocorrerá um erro. Mas se suponha que eu não envie o arquivo, também ocorrerão os mesmos erros que o MD5 não corresponde. Como isso é possível? Para qual arquivo eles estão calculando o MD5? Porque eu não enviei o arquivoContentFeed.

Se eu enviar ocontentMD5 em um cabeçalho, bem como em parâmetro e enviando oContentFeed no corpo, ainda recebo o erro.

Nota: - Estou enviando ocontentMD5 em um cabeçalho, bem como em um parâmetro no formulário, usando o módulo request e também calculando a assinatura com isso e depois passe ocontentFeed no corpo.

Estou usando JavaScript (Meteor), calculo o md5 usando ocrpyto módulo.
Primeiro, acho que meu MD5 está errado, mas tentei com um site on-line que me forneceria o MD5 para um arquivo MD5.

para o meu arquivo é:

Valor MD5: d90e9cfde58aeba7ea7385b6d77a1f1e
Base64Encodevalue: ZDkwZTljZmRlNThhZWJhN2VhNzM4NWI2ZDc3YTFmMWU =

O arquivo simples que baixei para atualizações de preço e quantidade: -

https://sellercentral.amazon.in/gp/help/13461?ie=UTF8&Version=1&entries=0&

Eu calculei a assinatura também dandoContentMD5Value enquanto calcula a assinatura.

Tipo de feed: '_ POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA_'

Como, li a documentação para a qual passei o cabeçalho MD5 nos cabeçalhos e também enviei como parâmetro.

O documento da Amazon diz:

Anteriormente, o Amazon MWS aceitava o hash MD5 como um cabeçalho Content-MD5 em vez de um parâmetro. Passá-lo como parâmetro garante que o valor MD5 faça parte da assinatura do método, o que impede que qualquer pessoa na rede adultere o conteúdo do feed.

O Amazon MWS ainda aceitará um cabeçalho Content-MD5, independentemente de um parâmetro ContentMD5Value estar incluído ou não. Se um cabeçalho e um parâmetro forem usados e eles não corresponderem, você receberá um erro InvalidParameterValue.

Estou usando orequest módulo para solicitações http.

Estou passando todas as chaves necessárias, identificação do vendedor etc. na forma de módulo de solicitação e passando oFeedContent no corpo.

Tentei enviar o arquivo da seguinte maneira:

O método para submitFeed é: -

submitFeed : function(){
    console.log("submitFeedAPI running..");
    app  = mwsReport({auth: {sellerId:'A4TUFSCXD64V3', accessKeyId:'AKIAJBU3FTBCJUIZWF', secretKey:'Eug7ZbaLljtrnGKGFT/DTH23HJ' }, marketplace: 'IN'});
    app.submitFeedsAPI({FeedType:'_POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA_'},Meteor.bindEnvironment(function(err,response){
        if(err){
            console.log("error in submit feed...")
            console.log(err)
        }
        else{
            console.log("suuccess submit feed....")
            console.log(response);
        }
    }))

O método que chama o Amazon submitFeedAPI é: -

    var submitFeedsAPI =  function(options, callback){
        console.log("submitFeedsAPI running...");
    var fileReadStream = fs.createReadStream('/home/parveen/Downloads/test/testting.txt');
        var contentMD5Value = crypto.createHash('md5').update(file).digest('base64');

    var reqForm = {query: {"Action": "SubmitFeed", "MarketplaceId": mpList[mpCur].id, "FeedType":options.FeedType,"PurgeAndReplace":false,"ContentMD5Value":contentMD5Value}}; 
            mwsReqProcessor(reqForm, 'submitFeedsAPI', "submitFeedsAPIResponse", "submitFeedsAPIResult", "mwsprod-0000",false,file, callback);
    }


also try

    var fileReadStream = fs.createReadStream('/home/parveen/Downloads/test/testting.txt');
    var base64Contents = fileReadStream.toString('base64');
    var contentMD5Value = crypto.createHash('md5').update(base64Contents).digest('base64');

A função mwsReqProcessor é a seguinte: -

 mwsReqProcessor = function mwsReqProcessor(reqForm, name, responseKey, resultKey, errorCode,reportFlag,file, callback) {

        reqOpt = {
            url: mwsReqUrl,
            method: 'POST',
            timeout: 40000,
            body:{FeedContent: fs.readFileSync('/home/parveen/feedContentFile/Flat.File.PriceInventory.in.txt')},
            json:true,
            form: null,
            headers: {
                // 'Transfer-Encoding': 'chunked',
                //'Content-Type': 'text/xml',
               // 'Content-MD5':'ZDkwZTljZmRlNThhZWJhN2VhNzM4NWI2ZDc3YTFmMWU=',
                // 'Content-Type': 'text/xml; charset=iso-8859-1'
                'Content-Type':'text/tab-separated-values;charset=UTF-8'
            },
        }
        reqOpt.form = mwsReqQryGen(reqForm);
        var r = request(reqOpt, function (err, res, body){
            console.log(err)
            console.log(res)
        })
        // var form  = r.form();
        //form.append('FeedContent',fs.createReadStream('/home/parveen/feedContent//File/Flat.File.PriceInventory.in.txt'))
    }

Método para geração mwsReqQryGen: -

mwsReqQryGen = function mwsReqQryGen(options) {
    var method     = (options && options.method) ? ('' + options.method) : 'POST',
        host       = (options && options.host)   ? ('' + options.host)   : mwsReqHost,
        path       = (options && options.path)   ? ('' + options.path)   : mwsReqPath,
        query      = (options && options.query)  ? options.query         : null,


        returnData = {
          "AWSAccessKeyId": authInfo.accessKeyId,
          "SellerId": authInfo.sellerId,
          "SignatureMethod": "HmacSHA256",
          "SignatureVersion": "2",
          "Timestamp": new Date().toISOString(),
           "Version":"2009-01-01",
        },
        key;

    if(query && typeof query === "object")
      for(key in query)
        if(query.hasOwnProperty(key)) returnData[key] = ('' + query[key]);

    if(authInfo.secretKey && method && host && path) {

      // Sort query parameters
      var keys = [],
          qry  = {};

      for(key in returnData)
        if(returnData.hasOwnProperty(key)) keys.push(key);

      keys = keys.sort();
      for(key in keys)
        if(keys.hasOwnProperty(key)) qry[keys[key]] = returnData[keys[key]];
      var sign = [method, host, path, qs.stringify(qry)].join("\n");
      console.log("..................................................")
      returnData.Signature = mwsReqSignGen(sign);

    }
//console.log(returnData); // for debug

return returnData;

};

Eu também tentei com o seguinte: -

reqOpt = {
    url: mwsReqUrl,
    method: 'POST',
    timeout: 40000,
    json:true,
    form: null,
    body:  {FeedContent: fs.createReadStream('/home/parveen/feedContentFile/Flat.File.PriceInventory.in.txt')},
    headers: {
        // 'Transfer-Encoding': 'chunked',
        //'Content-Type': 'text/xml',
       // 'Content-MD5':'ZDkwZTljZmRlNThhZWJhN2VhNzM4NWI2ZDc3YTFmMWU=',
        //   'Content-Type': 'text/xml; charset=iso-8859-1'
    },
}

Eu também tentei sem JSON e enviei diretamente o fluxo de leitura de arquivo no corpo, ou seja:

reqOpt = {
    url: mwsReqUrl,
    method: 'POST',
    timeout: 40000,
    form: null,
    body:  fs.createReadStream('/home/parveen/feedContentFile/Flat.File.PriceInventory.in.txt'),
    headers: {
        // 'Transfer-Encoding': 'chunked',
        //'Content-Type': 'text/xml',
     //   'Content-MD5':'ZDkwZTljZmRlNThhZWJhN2VhNzM4NWI2ZDc3YTFmMWU=',
        //   'Content-Type': 'text/xml; charset=iso-8859-1'
    },
}

Mas o mesmo erro ocorre sempre:

o cabeçalho HTTP do Content-MD5 que você passou para o seu feed não corresponde ao Content-MD5 que calculamos para o seu feed

Quero saber onde estou errado ou qual é a maneira correta de enviar a API do feed e enviar o arquivo usando o módulo de solicitação.

Eu também tentei com o código fornecido no MWS para gerar o MD5, mas o mesmo erro ocorreu a cada vez.

Meu arquivo .txt da seguinte maneira:

sku price   quantity
TP-T2-00-M      2

Qualquer ajuda é muito apreciada

questionAnswers(4)

yourAnswerToTheQuestion