読者です 読者をやめる 読者になる 読者になる
WEB拍手ぱちぱちっと
Clap/拍手

01.MENU
Blog  / ブログ
Videos  / 動画
Pictures  / 絵
Game Materials  / 素材
SS(ShortStory)  / 小ネタ

02.MENU
Novels  / 小説
Chat  / チャット
BBS  / 掲示板
Others  / その他
Old Top  / 旧Top

Traffic Jam Products


Amazon API(Product Advertising API)の公式JAVAサンプルが動かなかったので動くようにしました

ごきげんよう、mです。

 

前回の東京出張から交友関係がポンッと増えてホクホクとしておりましたw

勉強会に誘っていただいたりお酒の席に誘っていただけて楽しい時間が増えました。

そこで思ったのが「勇気を出して声をかけてみる」ということが大切だということでしょうかw

パーティー会場などで一人ですと……ぽつーん……と孤立しがちです。

けどそういったところに来る人はオープンな人が多いです。

話しかけたからといって毛虫のごとく嫌われたりするようなことはないのですw

結構みなさん色々なお話をしてくれるものですw

 

TJコレクションJava Servlet / JSP versionがそろそろ完成です

仕事で覚えなければならなくなったJSP

そのついでにTJコレクションを改修していましたがそろそろ完成です!

f:id:m_training:20150226221329p:plain

 

そして今回は!

f:id:m_training:20150226221408p:plain

 

SNSでのログインを実装しております!

SNS連携要素ですね~。

それとゲームでよく見かけるトロフィーと月間ランキングを導入しておりますw

今の土日と来週土日でガッツリと作ってBeta移行、テストを経てリリースとなりそうです。

 

Amazon API(Product Advertising API)の公式JAVAサンプルが動かなかったので動くようにしました

コレクションサービスを作るにあたってAmazon APIを使っています。

ですがAmazonで公開している公式サンプル(http://docs.aws.amazon.com/AWSECommerceService/latest/DG/AuthJavaSampleSig2.html)はそのままでは使えません。

最初

「かんたんかんたん……あれれ……あれっ!?」

とやっておりましたw

 

なぜ動かないかというと、アドレスが日本のアマゾンではないからですw

たったそれだけなのです。

なので……

private String endpoint = "webservices.amazon.com"; // must be lowercase
この部分を
private String endpoint = "ecs.amazonaws.jp";

これでOKですw

簡単ですね。けれど私は少し悩んでしましました(^-^;

 

package collection;

import java.io.UnsupportedEncodingException;

import java.net.URLDecoder;
import java.net.URLEncoder;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import java.util.TimeZone;
import java.util.TreeMap;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class SignedRequestsHelper {
private static final String UTF8_CHARSET = "UTF-8";
private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
private static final String REQUEST_URI = "/onca/xml";
private static final String REQUEST_METHOD = "GET";

private String endpoint = "ecs.amazonaws.jp"; // must be lowercase
private String awsAccessKeyId = "ご自分のIDで";
private String awsSecretKey = "ご自分の";

private SecretKeySpec secretKeySpec = null;
private Mac mac = null;

public SignedRequestsHelper() throws UnsupportedEncodingException {
  byte secretyKeyBytes = awsSecretKey.getBytes(UTF8_CHARSET);
  try{
    secretKeySpec =
    new SecretKeySpec(secretyKeyBytes, HMAC_SHA256_ALGORITHM);
    mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
    mac.init(secretKeySpec);

  } catch (NoSuchAlgorithmException e) {

  } catch (InvalidKeyException e) {

  }
}

public String sign(Map<String, String> params) {
  params.put("AWSAccessKeyId", awsAccessKeyId);
  params.put("Timestamp", timestamp());

  SortedMap<String, String> sortedParamMap =
  new TreeMap<String, String>(params);
  String canonicalQS = canonicalize(sortedParamMap);
  String toSign =
    REQUEST_METHOD + "\n"
    + endpoint + "\n"
    + REQUEST_URI + "\n"
    + canonicalQS;

  String hmac = hmac(toSign);
  String sig = percentEncodeRfc3986(hmac);
  String url = "http://" + endpoint + REQUEST_URI + "?" +
  canonicalQS + "&Signature=" + sig;

  return url;
}

private String hmac(String stringToSign) {
  String signature = null;
  byte data;
  byte[] rawHmac;
  try {
    data = stringToSign.getBytes(UTF8_CHARSET);
    rawHmac = mac.doFinal(data);
    Base64 encoder = new Base64();
    signature = new String(encoder.encode(rawHmac));
  } catch (UnsupportedEncodingException e) {
    throw new RuntimeException(UTF8_CHARSET + " is unsupported!", e);
  }
  return signature;
}

private String timestamp() {
  String timestamp = null;
  Calendar cal = Calendar.getInstance();
  DateFormat dfm = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  dfm.setTimeZone(TimeZone.getTimeZone("GMT"));
  timestamp = dfm.format(cal.getTime());
  return timestamp;
}

private String canonicalize(SortedMap<String, String> sortedParamMap)
{
  if (sortedParamMap.isEmpty()) {
    return "";
  }

  StringBuffer buffer = new StringBuffer();
  Iterator<Map.Entry<String, String>> iter =
  sortedParamMap.entrySet().iterator();

  while (iter.hasNext()) {
    Map.Entry<String, String> kvpair = iter.next();
    buffer.append(percentEncodeRfc3986(kvpair.getKey()));
    buffer.append("=");
    buffer.append(percentEncodeRfc3986(kvpair.getValue()));
    if (iter.hasNext()) {
      buffer.append("&");
    }
  }
  String canonical = buffer.toString();
  return canonical;
}

private String percentEncodeRfc3986(String s) {
  String out;
  try {
    out = URLEncoder.encode(s, UTF8_CHARSET)
    .replace("+", "%20")
    .replace("*", "%2A")
    .replace("%7E", "~");
  } catch (UnsupportedEncodingException e) {
    out = s;
  }
  return out;
  }

}

 

WEB拍手レス!

たくさんの拍手をありがとうございます!

反応をいただけると作者としましてはとても嬉しゅうございますw

 

 

Official LINE Account
友だち追加
@hgf7288s