AmazonマーケットプレイスWebサービス (Amazon MWS) では、フィードの送信とレポートの受信を行うアプリケーションを開発する際には、MD5によるチェックサムの計算と検証を行う必要があります。フィードを送信する際には、HTTPのContent-MD5ヘッダの値として、フィードの内容を元に計算したMD5チェックサムをAmazonに送信しなければなりません。Amazon MWSは同様に、送信されたフィード内容でMD5チェックサムを計算し、送信者のContent-MD5ヘッダの値と比較して受信したデータの不正検出を行います。不正が検出された場合、Amazon MWSは次のエラーを返します。
the Content-MD5 HTTP header you passed for your feed (*****) did not match the Content-MD5 we calculated for your feed (*****)
Amazon MWSにContent-MD5 ヘッダを含むフィードを送信するための基本的なプロセスは以下の通りです。
- Amazon MWSにフィードを送信する前に、送信するフィードをディスクに保管します。文字列としてメモリー内での処理も可能ですが、フィード容量がメモリー容量をオーバーする危険性があり、ファイルによる処理をお勧めします。
- ファイル内容のMD5チェックサムを計算します。
- SubmitFeed リクエストを作成し、2.で計算したMD5チェックサムをContent-MD5に設定し、ファイルをストリームとしてリクエストに添付します。
- リクエストを送信します。
次のJavaコードは、Amazon MWSのJavaクライアントライブラリーを使用したサンプルになります。MarketplaceWebServiceClientクラスのSubmitFeedFromFileメソッドでフィード送信しています。この場合、Content-MD5ヘッダは自動的に生成されます。
package com.amazonaws.mws.samples;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.amazonaws.mws.*;
import com.amazonaws.mws.model.*;
public class SubmitFeedSample {
public static void main(String... args) {
MarketplaceWebService service = new MarketplaceWebServiceClient(
"<アクセスキーID>",
"<秘密キー>",
"MWSSubmitFeedSample", "201105",
new MarketplaceWebServiceConfig()
.withServiceURL("https://mws.amazonservices.jp"));
SubmitFeedRequest request = new SubmitFeedRequest()
.withMarketplace("<マーケットプレイスID>")
.withMerchant("<出品者ID>")
.withFeedType("_POST_INVENTORY_AVAILABILITY_DATA_");
FileInputStream strFile;
try {
strFile = new FileInputStream("C:\\temp\\mws_inventory_feed.xml");
request.setFeedContent(strFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
SubmitFeedResponse response = service.submitFeedFromFile(request);
if (response.isSetSubmitFeedResult()) {
SubmitFeedResult submitFeedResult = response
.getSubmitFeedResult();
if (submitFeedResult.isSetFeedSubmissionInfo()) {
FeedSubmissionInfo feedSubmissionInfo = submitFeedResult
.getFeedSubmissionInfo();
System.out
.println(feedSubmissionInfo.getFeedSubmissionId());
System.out.println(feedSubmissionInfo.getFeedType());
System.out.println(feedSubmissionInfo.getSubmittedDate());
System.out.println(feedSubmissionInfo
.getFeedProcessingStatus());
}
}
if (response.isSetResponseMetadata()) {
ResponseMetadata responseMetadata = response
.getResponseMetadata();
if (responseMetadata.isSetRequestId()) {
System.out.println(responseMetadata.getRequestId());
}
}
} catch (MarketplaceWebServiceException ex) {
System.out.println("Caught Exception: " + ex.getMessage());
}
}
}
Amazon MWSのJavaクライアントライブラリーを使用せず、独自に開発する場合、次のようなフィードファイルのFileInputStreamを引数にとり、MD5チェックサムを計算して文字列として返すメソッドを使用できます。
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()));
//重要! FileChannelを利用し、 ストリームを最初のポジションへリセットします
fis.getChannel().position( 0 );
return md5Content;
}
上記のサンプルを参考に、独自プログラムの開発にお役立てください。
レポートを受信するアプリケーションでも同様に、MD5チェックサムを利用して、受信したレポートの不正検証を行うことができます。また、下記のURLより、最新のクライアントライブラリーをダウンロードし利用するようお勧めします。
https://developer.amazonservices.jp/doc/bde/feeds/v20090901/java.html
お使いのライブラリーのバージョンは、src/com/amazonaws/mws/MarketplaceWebServiceClient.java ファイルから、下記の変数の値により確認できます。
private static final String mwsClientLibraryVersion = "2010-11-01";