Amazon Product Advertising API (PA API) 是亚马逊提供的用于访问其产品数据的接口,允许开发者获取产品信息、价格、评论等内容。为了保护API安全,亚马逊要求所有请求必须经过签名验证。
以下是使用Java签署Amazon Product Advertising API请求的完整示例代码:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;
public class AmazonAPISigner {
private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
private static final String AWS4_HMAC_SHA256 = "AWS4-HMAC-SHA256";
private static final String ISO8601_FORMAT = "yyyyMMdd'T'HHmmss'Z'";
private static final String DATE_FORMAT = "yyyyMMdd";
public static void main(String[] args) throws Exception {
String accessKey = "YOUR_ACCESS_KEY";
String secretKey = "YOUR_SECRET_KEY";
String region = "us-west-2";
String service = "ProductAdvertisingAPI";
// 示例请求参数
Map<String, String> params = new HashMap<>();
params.put("Operation", "ItemSearch");
params.put("Keywords", "Harry Potter");
params.put("SearchIndex", "Books");
params.put("ResponseGroup", "Images,ItemAttributes,Offers");
// 生成签名请求
SignedRequestHelper helper = new SignedRequestHelper(accessKey, secretKey, region, service);
String url = helper.sign(params);
System.out.println("Signed URL: " + url);
}
static class SignedRequestHelper {
private final String accessKey;
private final String secretKey;
private final String region;
private final String service;
public SignedRequestHelper(String accessKey, String secretKey, String region, String service) {
this.accessKey = accessKey;
this.secretKey = secretKey;
this.region = region;
this.service = service;
}
public String sign(Map<String, String> params) throws Exception {
// 添加必要参数
params.put("Service", service);
params.put("AWSAccessKeyId", accessKey);
params.put("Timestamp", timestamp());
params.put("SignatureVersion", "2");
params.put("SignatureMethod", "HmacSHA256");
// 对参数进行排序
TreeMap<String, String> sortedParams = new TreeMap<>(params);
// 创建规范查询字符串
String canonicalQS = canonicalize(sortedParams);
// 创建待签字符串
String stringToSign = stringToSign(canonicalQS);
// 计算签名
String signature = sign(stringToSign, secretKey);
// 将签名添加到查询字符串
return "http://webservices.amazon.com/onca/xml?" + canonicalQS + "&Signature=" + URLEncoder.encode(signature, StandardCharsets.UTF_8.name());
}
private String timestamp() {
SimpleDateFormat df = new SimpleDateFormat(ISO8601_FORMAT);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
return df.format(new Date());
}
private String canonicalize(TreeMap<String, String> sortedParamMap) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : sortedParamMap.entrySet()) {
if (sb.length() > 0) {
sb.append("&");
}
sb.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8))
.append("=")
.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
}
return sb.toString();
}
private String stringToSign(String canonicalQS) {
return "GET\nwebservices.amazon.com\n/onca/xml\n" + canonicalQS;
}
private String sign(String data, String key) throws NoSuchAlgorithmException, InvalidKeyException {
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), HMAC_SHA256_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(rawHmac);
}
}
}
原因:
解决方案:
原因:
解决方案:
原因:
解决方案:
通过以上方法和代码示例,您可以成功地在Java中实现Amazon Product Advertising API的请求签名。
没有搜到相关的文章