2

AmazonのSubmitFeedAPIで使用する必要があるMD5ハッシュを計算する方法を知っている人はいますか?私はColdFusionを使用していますが、MD5ハッシュを計算するたびに、Amazonが計算したものと一致することはありません。

Amazonはこのエラーで応答します:

ContentMD5DoesNotMatch

the Content-MD5 HTTP header you passed for your feed (C7EF1CADB27497B46FCD6F69516F96E0) did not match the Content-MD5 we calculated for your feed (x+8crbJ0l7RvzW9pUW+W4A==)

私はColdFusionがハッシュに使用する組み込み関数を使用しています(例hash(myStr))。私が見逃しているステップはありますか?

4

6 に答える 6

2
public any function EncryptSignature(required string argValue,required string publicKey) hint="I create my own signature that I will matching later." {
    local.filters=StructNew();
    local.filters["F:publicKey"]=arguments.publicKey;
    var jMsg=JavaCast("string",arguments.argValue).getBytes("iso-8859-1");
    var thisSecretKey = getDAO().getSecretKey(local.filters).apiSecretKey;
    var jKey=JavaCast("string",thisSecretKey).getBytes("iso-8859-1");
    var key=createObject("java","javax.crypto.spec.SecretKeySpec");
    var mac=createObject("java","javax.crypto.Mac");
    key=key.init(jKey,"HmacSHA1");
    mac=mac.getInstance(key.getAlgorithm());
    mac.init(key);
    mac.update(jMsg);
    return lCase(binaryEncode(mac.doFinal(),'Hex'));
    //return Encrypt(arguments.argValue,getapiUsersDAO().getSecretKey(arguments.publicKey),'HMAC-SHA1');
    }
于 2013-01-15T20:27:30.263 に答える
2

問題は、フィードに先行する必要があることです

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

宣言として追加するだけでは不十分です

var memoryStream = new MemoryStream();
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("AmazonEnvelope",
...

XmlWriterを使用している場合:

using (var xmlWriter = XmlWriter.Create(memoryStream))
{
    doc.WriteTo(xmlWriter);
}

XDocumentをファイルに保存してから、ファイルからストリームを取得する必要があります。この場合のみ、XDocumentは宣言(Save()およびWriteTo()メソッドの設計された動作)を保持します。

    var memoryStream = new MemoryStream();
    doc.Save(memoryStream);

    var file = Path.GetTempFileName();
    using (var fileStream = File.OpenWrite(file))
    {
        var buffer = memoryStream.GetBuffer();
        fileStream.Write(buffer, 0, (int)memoryStream.Length);
    }

    return File.Open(file, FileMode.Open, FileAccess.Read);
于 2015-01-15T20:50:26.250 に答える
1

このオンラインツールを確認しました。そのMD5をbase64エンコーディングで送信する必要があります。現在、16進数でエンコードされています。

これを行うためのColdFusionの方法がわからないのではないかと思います。おそらく、これは、 ColdFusionでのSHAまたはMD5ダイジェストです。

于 2013-01-14T21:55:20.953 に答える
1

これを機能させるために私がしたことは次のとおりです。

<cfset getMD5 = ToBase64(binaryDecode(hash(xmlRequest),'hex'))>

そして、それはアマゾンのMD5ハッシュと一致しました。

于 2013-01-14T22:47:36.823 に答える
1

これはhttp://www.kba.suche-spezialwerkzeug.de/pdf/MWSDeveloperGuide.pdfにある代替のjava-wayです。

public static String computeContentMD5HeaderValue(FileInputStream fis)
        throws IOException, NoSuchAlgorithmException {
    DigestInputStream dis = new DigestInputStream(fis,
            MessageDigest.getInstance("MD5"));
    byte[] buffer = new byte[8192];
    while (dis.read(buffer) > 0)
        ;
    String md5Content = new String(
            org.apache.commons.codec.binary.Base64.encodeBase64(dis.getMessageDigest().digest())
            );
    // Effectively resets the stream to be beginning of the file via a
    // FileChannel.
    fis.getChannel().position(0);
    return md5Content;
}
于 2014-10-27T11:18:01.023 に答える
0

これはあなたの欲望の出力を与えるでしょう。

<cfset binaryValue = binaryDecode( 'C7EF1CADB27497B46FCD6F69516F96E0', "hex" )>
<cfset base64Value = binaryEncode( binaryValue, "base64" )>
<cfdump var="#base64Value#">
于 2013-01-16T11:44:23.480 に答える