· 6 years ago · Oct 04, 2019, 06:50 AM
1/*
2 * Sample Interface for SellerCenter API
3 */
4package com.rocket.sellercenter;
5import java.security.InvalidKeyException;
6import java.security.NoSuchAlgorithmException;
7import java.text.SimpleDateFormat;
8import java.text.DateFormat;
9import java.io.*;
10import java.net.HttpURLConnection;
11import java.net.URL;
12import java.net.URLEncoder;
13import java.util.*;
14import javax.crypto.Mac;
15import javax.crypto.spec.SecretKeySpec;
16
17public class SellercenterAPI {
18 private static final String ScApiHost = "http://api.sellercenter.net/";
19 private static final String HASH_ALGORITHM = "HmacSHA256";
20 private static final String CHAR_UTF_8 = "UTF-8";
21 private static final String CHAR_ASCII = "ASCII";
22 public static void main(String[] args) {
23 Map<String, String> params = new HashMap<String, String>();
24 params.put("UserID", "example@example.com");
25 params.put("Timestamp", getCurrentTimestamp());
26 params.put("Version", "1.0");
27 params.put("Action", "ProductUpdate");
28 final String apiKey = "55f86f79f3b4388507aba8c21a7bfd0d25626551";
29 final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?
30 ><Request><Product><SellerSku>4105382173aaee4</SellerSku><Price>12</Price></Product></Request>";
31 final String out = getSellercenterApiResponse(params, apiKey, XML); // provide XML as an empty string
32 when not needed
33 System.out.println(out); // print out the XML response
34 }
35
36 /**
37 * calculates the signature and sends the request
38 *
39 * @param params Map - request parameters
40 * @param apiKey String - user's API Key
41 * @param XML String - Request Body
42 */
43 public static String getSellercenterApiResponse(Map<String, String> params, String apiKey, String XML) {
44 String queryString = "";
45 String Output = "";
46 HttpURLConnection connection = null;
47 URL url = null;
48 Map<String, String> sortedParams = new TreeMap<String, String>(params);
49 queryString = toQueryString(sortedParams);
50 final String signature = hmacDigest(queryString, apiKey, HASH_ALGORITHM);
51 queryString = queryString.concat("&Signature=".concat(signature));
52 final String request = ScApiHost.concat("?".concat(queryString));
53 try {
54 url = new URL(request);
55 connection = (HttpURLConnection) url.openConnection();
56 connection.setDoOutput(true);
57 connection.setDoInput(true);
58 connection.setInstanceFollowRedirects(false);
59 connection.setRequestMethod("POST");
60 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
61 connection.setRequestProperty("charset", CHAR_UTF_8);
62 connection.setUseCaches(false);
63 if (!XML.equals("")) {
64 connection.setRequestProperty("Content-Length", "" + Integer.toString(XML.getBytes().length));
65 DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
66 wr.writeBytes(XML);
67 wr.flush();
68 wr.close();
69 }
70 String line;
71 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
72 while ((line = reader.readLine()) != null) {
73 Output += line + "\n";
74 }
75 } catch (Exception e) {
76 e.printStackTrace();
77 }
78 return Output;
79 }
80
81 /**
82 * generates hash key
83 *
84 * @param msg
85 * @param keyString
86 * @param algo
87 * @return string
88 */
89 private static String hmacDigest(String msg, String keyString, String algo) {
90 String digest = null;
91 try {
92 SecretKeySpec key = new SecretKeySpec((keyString).getBytes(CHAR_UTF_8), algo);
93 Mac mac = Mac.getInstance(algo);
94 mac.init(key);
95 final byte[] bytes = mac.doFinal(msg.getBytes(CHAR_ASCII));
96 StringBuffer hash = new StringBuffer();
97 for (int i = 0; i < bytes.length; i++) {
98 String hex = Integer.toHexString(0xFF & bytes[i]);
99 if (hex.length() == 1) {
100 hash.append('0');
101 }
102 hash.append(hex);
103 }
104 digest = hash.toString();
105 } catch (UnsupportedEncodingException e) {
106 e.printStackTrace();
107 } catch (InvalidKeyException e) {
108 e.printStackTrace();
109 } catch (NoSuchAlgorithmException e) {
110 e.printStackTrace();
111 }
112 return digest;
113 }
114
115 /**
116 * build querystring out of params map
117 *
118 * @param data map of params
119 * @return string
120 * @throws UnsupportedEncodingException
121 */
122 private static String toQueryString(Map<String, String> data) {
123 String queryString = "";
124 try{
125 StringBuffer params = new StringBuffer();
126 for (Map.Entry<String, String> pair : data.entrySet()) {
127 params.append(URLEncoder.encode((String) pair.getKey(), CHAR_UTF_8) + "=");
128 params.append(URLEncoder.encode((String) pair.getValue(), CHAR_UTF_8) + "&");
129 }
130 if (params.length() > 0) {
131 params.deleteCharAt(params.length() - 1);
132 }
133 queryString = params.toString();
134 } catch(UnsupportedEncodingException e){
135 e.printStackTrace();
136 }
137 return queryString;
138 }
139
140 /**
141 * returns the current timestamp
142 * @return current timestamp in ISO 8601 format
143 */
144 private static String getCurrentTimestamp(){
145 final TimeZone tz = TimeZone.getTimeZone("UTC");
146 final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
147 df.setTimeZone(tz);
148 final String nowAsISO = df.format(new Date());
149 return nowAsISO;
150 }
151}