手順について

Step1.暗号鍵の入手

Air-Webより以下2つの暗号鍵を取得してください:
  • BROWSER_ENCRYPTION_KEY(ブラウザ暗号鍵):購入者をAir-Webへ遷移させるための鍵
  • MERCHANT_ENCRYPTION_KEY(マーチャント暗号鍵):購入者の支払いを確認するために必要な鍵
暗号鍵を入手する際には以下情報の送信が必要となります:
パラメータ 詳細
MERCHANT_ID マーチャントIDはこちらより確認ください。
MERCHANTHASH MERCHANTHASH、MERCHANT_ID、SETTLEMENT_TYPE、ORDER_IDとAMOUNTを連結しSHA512を使用して生成するハッシュ値です。マーチャントハッシュはこちらに記載のマーチャントハッシュキーご使用ください。
ORDER_ID 取引ID:取引毎にユニークになるように指定してください。
SESSION_ID リクエストごとに採番するユニークなSession ID
AMOUNT 金額 (円)
SETTLEMENT_TYPE '00' = 指定無; '01' = クレジットカード; '02' = コンビニ

APIパラメータの詳細は、こちらより確認いただけます。

Sample Code

<<Source>>/include/ConfirmActionManager.php

private $merchant = new MerchantInfo();
$data = new PurchaseData();
$ch = new HashCodeCreater();

  
$data->setMerchantId($data->getMerchantId());

$data->setOrderId($merchant->createOrderID());
$data->setSessionId($session_id());  
$data->setAmount($form->getAmount());
$data->setSettlementType($form->getSettlementType);
  
$hashCode = $ch->getHash($data->getMerchantId(), $data->getSettlementType(), $data->getOrderId(), $data->getAmount());
$data->setMerchantHash($hashCode);
  
$purchaseData = $this->getPurchaseData($form);
// HTTP POST
$result = $this->sendPOST($purchaseData);
return $result;

<<Source>>/jp/co/veritrans/vtweb/sample/server/action/ConfirmAction.java

Map settlementInfo = new LinkedHashMap();
MerchantConf merchantInfo = MerchantConf.getInfo();

settlementInfo.put("MERCHANT_ID", merchantInfo.getMerchantID());
HashCodeCreater4Merchant hash = new HashCodeCreater4Merchant();
settlementInfo.put("ORDER_ID", orderId);
settlementInfo.put("SESSION_ID", sessionId);
settlementInfo.put("AMOUNT", Integer.parseInt(form.getAmount()));
settlementInfo.put("SETTLEMENT_TYPE", form.getSettlementType());

String hashCode = hash.getHash(merchantInfo.getMerchantID(), form.getSettlementType(), orderId, form.getAmount());
settlementInfo.put("MERCHANTHASH", hashCode);

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), Constants.VTW_ENCODE));
String postData = getPostData(settlementInfo); //POST用に整形したデータを返却する。 - Generate Data in POST format

bw.write(postData);
bw.flush();
bw.close();

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), Constants.VTW_ENCODE));
EncryptionKey ret = new EncryptionKey();
String line;
try {
  while ((line = in.readLine()) != null) {
    if (line.startsWith("MERCHANT_ENCRYPTION_KEY")) {
      String tmp = line.substring(24);
      registKey(orderId, tmp, sessionId);
      ret.setMerchantEncryptionKey(tmp);
    } else if (line.startsWith("BROWSER_ENCRYPTION_KEY")) {
      String tmp = line.substring(23);
      ret.setBrowserEncryptionKey(tmp);
    } else if (line.startsWith("ERROR_MESSAGE")) {
      String tmp = URLDecoder.decode(line.substring(14), Constants.VTW_ENCODE);
      ret.setErrorMessage(tmp);
    }
  }
  return ret;
}
catch (Throwable th) {
  return null;
}

Step2.支払い用ページの表示

次に購入者に対してAir-Webが用意する支払いページを表示させる手順について説明いたします。取得方法については以下を参照してください。

Air-Web 支払い画面イメージ


決済選択 / 決済情報入力画面

確認画面

完了画面

Sample Code

<<Source>>/sample/jump.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<?php include("../include_head.php"); ?>
<title><?php echo $lang['JUMP.TITLE'];?></title>
</head>
<body>
  <div class="contents">
    <h1 align="center"><?php echo $lang['JUMP.HEADER'];?></h1>
    <form action="<?= PAYMENT_URL ?>" method="post" onSubmit="document.getElementById('submitBtn').disabled=true;">
      <input type="hidden" name="MERCHANT_ID" value="<?= $merchant->getMerchantID() ?>" /> 
      <input type="hidden" name="ORDER_ID" value="<?= $merchant->getOrderID() ?>" />
      <input type="hidden" name="BROWSER_ENCRYPTION_KEY" value="<?= $merchant->getSettlementKey1A() ?>" />
      <input id="submitBtn" type="submit" value="submit" />
    </form>
  </div>
</body>
</html>

<<Source>>/jsp/self/jump.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
  <%@ include file="include_head.jsp" %>
  <title>お支払手続きへ</title>
  <%
    MerchantConf info = MerchantConf.getInfo();
    String sessionID = session.getId();
    String key1a = (String)request.getAttribute("SETTLEMENT_KEY1A");
    String merchantId = (String)request.getAttribute("MERCHANT_ID");
    String orderId = (String)request.getAttribute("ORDER_ID");
  %>
  </head>
  <body>
    <div class="contents">
      <h1 align="center">お支払手続きへ</h1>
      <form action="<%= info.getVtWebSettlementUrl() %>" method="post"  onsubmit="document.getElementById('submitBtn').disabled=true;">
        <input type="hidden" name="MERCHANT_ID" value="<%= merchantId %>" />
        <input type="hidden" name="ORDER_ID" value="<%= orderId %>" />
        <input type="hidden" name="BROWSER_ENCRYPTION_KEY" value="<%= key1a %>" />
        <input id="submitBtn" type="submit" value="submit" />
      </form>
    </div>
  </body>
</html>

Step3.支払い終了後の誘導

購入者の支払いが完了すると事前に指定された決済完了通知URLに対してAir-Webより取引IDおよび決済結果を通知いたします。また同時に購入者およびECサイトに対して結果通知メールを配信いたします。決済完了通知URLは、Air-Web設定より確認ください。
ご注意:
ECサイトにてすべての通知要求を検証いただく必要がございます。検証いただくパラメータはORDER_IDMERCHANT_ENCRYPTION_KEYとなります。両パラメータがマーチャントデータベース内部のものと一致していることを確認ください。

Sample Code

<<Source>>/sample/DoPostActionAW.php

// AWからのRequestの内容確認 - Validate request's content
$result = $KeyValidate->resultCheck();

// チェック結果を表示
header("text/html; charset=" . AW_HTML_ENCODE);
if ($result) {
  $KeyValidate->updateKeyBox();
  echo "OK\n";
} else {
  echo "ERR\n";
}

<<Source>>/jp/co/veritrans/airweb/sample/server/DoPostActionAW.java

ResultDataBean databean = new ResultDataBean();

// リクエストをマップに格納 - Validate request's content
databean.setOrderId(orderId);
databean.setmStatus(URLDecoder.decode(request.getParameter(Constants.AWRES_M_STATUS), Constants.AW_ENCODE));
databean.setmErrMsg(URLDecoder.decode(request.getParameter(Constants.AWRES_M_ERR_MSG), Constants.AW_ENCODE));
databean.setvResultCode(URLDecoder.decode(request.getParameter(Constants.AWRES_V_RESULT_CODE),
    Constants.AW_ENCODE));
ResultCheck rcheck = new ResultCheck();
boolean checkflag;
checkflag = rcheck.resultCheck(databean);

// AWへ返信 - Return result
if (checkflag) {
  key.put(Constants.AWRES_M_STATUS, databean.getmStatus());
  key.put(Constants.AWRES_M_ERR_MSG, databean.getmErrMsg());
  key.put(Constants.AWRES_V_RESULT_CODE, databean.getvResultCode());

  keyBox.setBox(orderId, key);
  response.setContentType(CONTENT_TYPE);
  ServletOutputStream out = response.getOutputStream();

  out.println("OK");
} else {
  response.setContentType(CONTENT_TYPE);
  ServletOutputStream out = response.getOutputStream();

  out.println("ERR");
}