1. サービスの概要
1.1. 利用環境
e-SCOTTには、「テスト環境」と「本番環境」が用意されています。
「テスト環境」では、e-SCOTTへの接続テストや弊社が提供するテストケースでの検証が行えます。「本番環境」はテスト用途として利用しないでください。

接続先URLは、決済サービスごとに異なります。
1.2. 基本的な取引の流れと用語
1.2.1. 基本的な取引の流れ
オンラインの取引では、Master電文で取引を開始し、レスポンスされたプロセスIDを使用してProcess電文で後続の処理を行います。
一連の取引例を下表に示します。
|
処理の流れ |
電文種別 |
リクエスト |
レスポンス |
||
|
処理区分 |
プロセスID |
プロセスID |
処理通番 |
||
|
1 |
Master電文 |
与信枠の確保 |
|
AAAAA |
11111 |
|
2 |
Process電文 |
売上計上 |
AAAAA |
|
22222 |
|
3 |
Process電文 |
金額変更 |
AAAAA |
|
33333 |
|
4 |
Process電文 |
取消 |
AAAAA |
|
44444 |
処理区分の規定は、決済サービスによって異なります。
1.2.1.1. プロセスID・プロセスパスワードとは
プロセスIDとプロセスパスワードは、取引を識別するID/パスワードです。
Master電文で処理が成立した場合、e-SCOTTがレスポンスします。
1.2.1.2. 処理区分とは
処理区分は、実行される処理の種別を表す項目です。
各APIリクエストまたは取引データには処理区分が設定され、システムはこの値に基づいて処理内容を判定します。
代表的な処理区分には、与信、与信売上計上、売上計上、取消などがあります。
1.2.1.3. 処理通番とは
処理通番は、処理を識別するコードです。
処理を正常に受け付けた場合、e-SCOTTがレスポンスします。
e-SCOTT全体の処理で一意の値をとります。
処理がエラーになり、再処理を行った場合でも、別の処理通番が付与されます。
1.2.1.4. マーチャントID・マーチャントパスワードとは
マーチャントIDとマーチャントパスワードは、事業者を識別するID/パスワードです。
契約後に別途通知します。
1.2.1.5. 店舗コードとは
マーチャントIDに紐づく店舗を識別するコードです。
取扱商品等によってカード会社との契約や設定が異なる場合に使用します。

別途申請手続きが必要です。
決済サービスによっては店舗コードが使用できない場合があります。
1.3. 電文仕様
1.3.1. 電文フォーマット
BODY部は「key=value」を「&」で結合してください。
1.3.2. POST電文
e-SCOTTがクライアントとなるPOST通信を「POST電文」と呼びます。

2. 接続方式
2.1. e-SCOTTとの接続方法
加盟店とe-SCOTT間は、インターネット経由で接続します。

2.1.1. 通信プロトコル
オンラインの処理で使用するプロトコルは、下記のとおりです。
|
スキーム |
HTTPS |
||
|
SSL/TLS |
TLS1.2 |
||
|
メソッド |
POST |
||
|
MIME タイプ |
リクエスト |
application/x-www-form-urlencoded |
|
|
レスポンス |
text/plain |
||
2.1.2. 文字コード
加盟店とe-SCOTT間で使用する文字コードは、下記のとおりです。
| 処理方法 | 文字コード | 改行コード | 形式 |
|---|---|---|---|
| オンライン | UTF-8 | CR+LF | - |
| ファイル | UTF-8(BOMなし) | CR+LF | CSV(カンマ区切り) |
| 加盟店管理画面 (ファイルのアップロード/ダウンロード) | Shift_JIS | CR+LF | CSV(カンマ区切り) |
2.1.3. SSL証明書
2.1.3.1. e-SCOTTへのリクエスト
ルート証明書「Security Communication Root CA2」を導入の上接続してください。
ポートは443番を使用します。
2.1.3.2. e-SCOTTからのPOST電文
POST電文では、下記のSSL証明書が利用できます。
なお、「SNI(Server Name Indication)」は有効化しています。
| SSL証明書(A~F) | SSL証明書(G~S) | SSL証明書(T~Z) |
|---|---|---|
| ACM Certificate AddTrust AOL Baltimore Cert Plus CERTNM Cybertrust Deutsche Telekom Digi Cert EnTrust | GeoTrust Global Sign GTE cybertrust global KEYNECTIS QuoVadis RapidSSL SECOM Sectigo Sonera Starfield SwissSign | Telesec Global Thawte Trust Center UTN-USERFirst Verisign |
SSL証明書を更新する場合は、必ず事前にテスト環境で確認してください。
上記のSSL証明書でエラーが発生した場合は、弊社までお問い合わせください。
2.1.4. POST電文へのレスポンス
POST電文を正常に受信した場合、HTTPステータスコード200をレスポンスしてください。
2.1.5. 接続IPアドレスの制限
e-SCOTTに接続するIPアドレスを制限したい場合は契約後にお渡しする加盟店管理画面でIPアドレスの登録を行ってください。
2.2. 電文の暗号化(AES暗号化)
2.2.1. 電文の暗号化
エンドユーザの画面を介して送受信する電文は、暗号化および復号が必要になります。
2.2.2. 暗号化の手段
暗号化は共通鍵暗号方式で行います。
|
アルゴリズム |
AES(Advanced Encryption Standard) |
|
暗号利用モード |
CBC(Cipher Block Chaining) |
|
パディング方式 |
PKCS5 Padding |
AES暗号化鍵およびIV(Initialization Vector=初期化ベクトル)は、弊社が発行します。
2.2.3. AES暗号化の手順
電文にセットする値に対して、URLエンコードを実施する
「パラメーター名=値」形式で、「&」で連結する
連結した値に対して、AES暗号化処理を実施する
暗号化処理を行った値に対して、Base64エンコードを実施する
Base64エンコードした値に対して、URLエンコードを実施する
URLエンコードがブラウザー側で実施される場合、本手順は不要です。URLエンコードした値をパラメーター「EncryptValue」にセットする
リクエストに「MerchantId」「OperateId」「EncryptValue」をセットし、電文を送信する
2.2.4. AES復号の手順
受信した電文に対して、URLデコードを実施する
URLデコードがブラウザー側で実施される場合、本手順は不要です。URLデコードした値からパラメーター「EncryptValue」の値を取得する
「EncryptValue」の値に対して、Base64デコードを実施する
Base64デコードした値に対して、AES復号処理を実施する
AES復号した値を「&」で分割する
手順5で取得した値に対して、URLデコードを実施する
3. 留意事項
3.1. 取引データの保持期間
取引データの保持期間は、原則7か月です。7か月を経過した取引の確認や後続処理はできません。
3.2. エンドユーザの利用端末制限
エンドユーザ環境と通信が発生するトークン決済、クレジットカード決済サービス 三者間画面サービス(リンク型画面決済)、クレジットカード決済サービス 3Dセキュアサービスについては、フィーチャーフォンは対応しておりません。
4. 参考資料
4.1. サンプルプログラム
4.1.1. 電文送信(Java)
4.1.1.1. メインプログラム
メインプログラム(JAVA)
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
/**
* 【電文の送信】
* 電文を送信し、レスポンス内容を標準出力に出力します。
*
*/
public class Postdata {
/**
* main メソッド
*
* @param args コマンドラインパラメーター
*/
public static void main(String[] args) {
// request パラメーターを設定
ArrayList<ParamBean> paramList = new ArrayList<ParamBean>();
paramList.add(new ParamBean("MerchantId", "userid"));
paramList.add(new ParamBean("MerchantPass", "passwd"));
paramList.add(new ParamBean("TransactionDate", "20091225"));
paramList.add(new ParamBean("OperateId", " [各処理OperateId] "));
paramList.add(new ParamBean("MerchantFree1", ""));
paramList.add(new ParamBean("MerchantFree2", ""));
paramList.add(new ParamBean("MerchantFree3", ""));
paramList.add(new ParamBean("●●", ""));
paramList.add(new ParamBean("▼▼", ""));
try {
// サーバー接続オブジェクトを作成
SLNConnection gc = new SLNConnection();
// 接続先URL アドレスを設定
gc.setConnectionURL(" [接続先URL] ");
// タイムアウト時間を設定(単位秒)
gc.setConnectionTimeOut(90);
// request を送信
String responseList = gc.sendRequest(paramList);
// 受信した内容を出力
System.out.println(responseList);
} catch (MalformedURLException e) {
// URL が違います。
System.out.println("URL の指定が間違っています。");
} catch (ProtocolException e1) {
// Protocol エラー
System.out.println("接続プロトコルの指定が間違っています。");
} catch (SocketTimeoutException e3) {
// タイムアウトエラー
System.out.println("通信がタイムアウトしました。");
} catch (Exception e) {
// エラー
System.out.println("エラーが発生しました。");
}
}
}
4.1.1.2. 接続クラス
接続クラス(JAVA)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* 【e-SCOTT 統合決済インターフェイス接続クラス】
*
*/
public class SLNConnection {
/**
* 接続先URL アドレス
*/
private String connectionURL;
/**
* 通信タイムアウト時間(s)
*/
private int connectionTimeOut = 600;
/**
* 指定されたパラメーターをPOST 送信し、response 結果を返します。
*
* @param paramList request パラメーター
* @return 応答電文項目毎の配列
* @throws Exception
*/
public List<ParamBean> sendRequest(List<ParamBean> paramList)
throws Exception {
// 送信文字列を作成
StringBuffer sendParams = new StringBuffer();
for (int i = 0; i < paramList.size(); i++) {
// 一つのパラメーターを取り出す
ParamBean param = paramList.get(i);
// 最初のパラメーターでなければ「&」を付加
if (i > 0) {
sendParams.append("&");
}
// パラメーターを連結
sendParams.append(param.getKey() + "=" + param.getValue());
}
HttpURLConnection conn = null;
try {
// 接続先URL
URL url = new URL(connectionURL);
// コネクション生成(まだ未接続)
conn = (HttpURLConnection) url.openConnection();
// POST メソッドを使用
conn.setRequestMethod("POST");
// ContentType を設定
conn.setRequestProperty(
"Content-Type",
"application/x-www-form-urlencoded; charset=utf-8"
);
// Body の長さを設定
conn.setRequestProperty(
"Content-Length",
Integer.toString(sendParams.length())
);
// 出力できるように設定
conn.setDoOutput(true);
// タイムアウト時間を設定(ms 単位)
conn.setConnectTimeout(connectionTimeOut * 1000);
conn.setReadTimeout(connectionTimeOut * 1000);
// パラメーターを書き出す
OutputStreamWriter writer = new OutputStreamWriter(
conn.getOutputStream(),
"UTF-8"
);
writer.write(sendParams.toString());
writer.close();
// 接続
conn.connect();
// response を受け取る
BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream())
);
String responseList = reader.readLine();
return responseList;
} catch (MalformedURLException e) {
// URL が違います。
throw e;
} catch (ProtocolException e1) {
// Protocol エラー
throw e1;
} catch (SocketTimeoutException e3) {
// タイムアウトエラー
throw e3;
} catch (IOException e2) {
// 入出力エラー
throw e2;
} finally {
// 接続を閉じる
if (conn != null) {
conn.disconnect();
}
}
}
/**
*通信タイムアウト時間(s)を取得します。
* @return 通信タイムアウト時間(s)
*/
public int getConnectionTimeOut() {
return connectionTimeOut;
}
/**
* 通信タイムアウト時間(s)を設定します。
* @param connectionTimeOut 通信タイムアウト時間(s)
*/
public void setConnectionTimeOut(int connectionTimeOut) {
this.connectionTimeOut = connectionTimeOut;
}
/**
* 接続先URL アドレスを取得します。
* @return 接続先URL アドレス
*/
public String getConnectionURL() {
return connectionURL;
}
/**
* 接続先URL アドレスを設定します。
* @param connectionURL 接続先URL アドレス
*/
public void setConnectionURL(String connectionURL) {
this.connectionURL = connectionURL;
}
}
4.1.2. 電文送信(PHP)
4.1.2.1. メインプログラム
メインプログラム(PHP)
<?php
// インクルードファイル
// PHP インクルードパス上にファイルが存在している前提
require_once("SLNConnection.inc");
// 変数初期化
$gc = null;
$param_list = array();
$response_list = array();
// request パラメーターを設定
$param_list['MerchantId'] = urlencode("userid");
$param_list['MerchantPass'] = urlencode("passwd");
$param_list['TransactionDate'] = urlencode("20091225");
$param_list['OperateId'] = urlencode(" [各処理OperateId] ");
$param_list['MerchantFree1'] = urlencode("");
$param_list['MerchantFree2'] = urlencode("");
$param_list['MerchantFree3'] = urlencode("");
$param_list['●●'] = urlencode("");
$param_list['▼▼'] = urlencode("");
// 処理開始
try {
// サーバー接続クラスインスタンス生成
$gc = new SLNConnection();
// 接続先URL アドレスを設定
$gc->set_connection_url(" [接続先URL] ");
// 接続タイムアウト時間を設定(単位秒)
$gc->set_connection_timeout(90);
// リクエスト送信
$response_list = $gc->send_request($param_list);
// 受信した内容を出力
echo $response_list;
} catch (SLNConnectionError $e) {
// エラー出力
echo $e->get_exception();
}
?>}4.1.2.2. 接続クラス
接続クラス(PHP)
<?php
//クラス定義 : SLNConnection
class SLNConnection
{
// プロパティ定義
// 接続先URL アドレス
private $connection_url;
// 通信タイムアウト
private $connection_timeout;
// メソッド定義
// コンストラクタ
// 引数: なし
// 戻り値: なし
function __construct()
{
// プロパティ初期化
$this->connection_url = "";
$this->connection_timeout = 600;
}
// 接続先URL アドレスの設定
// 引数: 接続先URL アドレス
// 戻り値: なし
function set_connection_url($connection_url = "")
{
$this->connection_url = $connection_url;
}
// 接続先URL アドレスの取得
// 引数: なし
// 戻り値: 接続先URL アドレス
function get_connection_url()
{
return $this->connection_url;
}
// 通信タイムアウト時間(s)の設定
// 引数: 通信タイムアウト時間(s)
// 戻り値: なし
function set_connection_timeout($connection_timeout = 0)
{
$this->connection_timeout = $connection_timeout;
}
// 通信タイムアウト時間(s)の取得
// 引数: なし
// 戻り値: 通信タイムアウト時間(s)
function get_connection_timeout()
{
return $this->connection_timeout;
}
// リクエスト送信クラス
// 引数: リクエストパラメーター(要求電文)配列
// 戻り値: レスポンスパラメーター(応答電文)配列
function send_request(&$param_list = array())
{
$rValue = array();
// パラメーターチェック
if (empty($param_list) === false) {
// 送信先情報の準備
$url = parse_url($this->connection_url);
// HTTP データ生成
$http_data = "";
reset($param_list);
while (list($key, $value) = each($param_list)) {
$http_data .= (($http_data !== "") ? "&" : "") . $key . "=" . $value;
}
// HTTP ヘッダ生成
$http_header = "POST " . $url['path'] . " HTTP/1.0" . "\r\n" .
"User-Agent:SLN_PAYMENT_CLIENT_PG_PHP_VERSION_1_0" . "\r\n" .
"Content-Type:application/x-www-form-urlencoded" . "\r\n" .
"Content-Length:" . strlen($http_data);
// POST データ生成
$http_post = $http_header . "\r\n\r\n" . $http_data;
// 送信処理
$errno = 0;
$errstr = "";
$hm = array();
// ソケット通信接続
$fp = @fsockopen('ssl://' . $url['host'], 443, $errno, $errstr, $this->connection_timeout);
if ($fp !== false) {
// 接続後タイムアウト設定
$result = socket_set_timeout($fp, $this->connection_timeout);
if ($result === true) {
// データ送信
fwrite($fp, $http_post);
// 応答受信
$response_data = "";
while (!feof($fp)) {
$response_data .= fgets($fp, 4096);
}
// ソケット通信情報を取得
$hm = stream_get_meta_data($fp);
// ソケット通信切断
$result = fclose($fp);
if ($result === true) {
if ($hm['timed_out'] !== true) {
// レスポンスデータ生成
$rValue = $response_data;
} else {
// エラー: タイムアウト発生
throw new SLNConnectionError("通信中にタイムアウトが発生しました");
}
} else {
// エラー: ソケット通信切断失敗
throw new SLNConnectionError("SLN との切断に失敗しました");
}
} else {
// エラー: タイムアウト設定失敗
throw new SLNConnectionError("タイムアウト設定に失敗しました");
}
} else {
// エラー: ソケット通信接続失敗
throw new SLNConnectionError("SLN への接続に失敗しました");
}
} else {
// エラー: パラメーター不整合
throw new SLNConnectionError("リクエストパラメーターの指定が正しくありません");
}
return $rValue;
}
}
// クラス定義: SLNConnectionError
class SLNConnectionError extends exception
{
// コンストラクタ
function __construct($_error)
{
$this->error = $_error;
}
// 例外結果取得
function get_exception()
{
return $this->error;
}
}
?>4.1.3. 電文送信(VB.NET)
4.1.3.1. メインプログラム
メインプログラム(VB.NET)
Imports System.Windows.Forms
Imports System.Net
Public Class FormRequests
Inherits System.Windows.Forms.Form
#Region " Windows フォーム デザイナで生成されたコード "
Public Sub New ()
MyBase.New ()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub
' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer
' メモ : 下記のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents ButtonAuthorize As System.Windows.Forms.Button
Friend WithEvents ButtonPut As System.Windows.Forms.Button
Friend WithEvents ButtonGet As System.Windows.Forms.Button
Friend WithEvents ButtonDel As System.Windows.Forms.Button
Friend WithEvents ButtonLs As System.Windows.Forms.Button
Friend WithEvents ButtonClose As System.Windows.Forms.Button
< System.Diagnostics.DebuggerStepThrough() > Private Sub InitializeComponent()
Me.Label1 = New System.Windows.Forms.Label
Me.ButtonAuthorize = New System.Windows.Forms.Button
Me.ButtonPut = New System.Windows.Forms.Button
Me.ButtonGet = New System.Windows.Forms.Button
Me.ButtonDel = New System.Windows.Forms.Button
Me.ButtonLs = New System.Windows.Forms.Button
Me.ButtonClose = New System.Windows.Forms.Button
Me.SuspendLayout()
'Label1
'
Me.Label1.Font = New System.Drawing.Font("MS UI Gothic", 14.25 !, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, CType(128, Byte))
Me.Label1.Location = New System.Drawing.Point(40, 16)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(520, 24)
Me.Label1.TabIndex = 0
Me.Label1.Text = "e-SCOTT 統合決済インターフェイス接続テスト"
Me.Label1.TextAlign = System.Drawing.ContentAlignment.TopCenter
'
'ButtonAuthorize
'
Me.ButtonAuthorize.Location = New System.Drawing.Point(176, 64)
Me.ButtonAuthorize.Name = "ButtonAuthorize"
Me.ButtonAuthorize.Size = New System.Drawing.Size(224, 24)
Me.ButtonAuthorize.TabIndex = 1
Me.ButtonAuthorize.Text = "電文の送信"
'
'ButtonClose
'
Me.ButtonClose.Location = New System.Drawing.Point(244, 304)
Me.ButtonClose.Name = "ButtonClose"
Me.ButtonClose.Size = New System.Drawing.Size(88, 24)
Me.ButtonClose.TabIndex = 6
Me.ButtonClose.Text = "閉じる"
'
'FormRequests
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(592, 350)
Me.Controls.Add(Me.ButtonClose)
Me.Controls.Add(Me.ButtonLs)
Me.Controls.Add(Me.ButtonDel)
Me.Controls.Add(Me.ButtonGet)
Me.Controls.Add(Me.ButtonPut)
Me.Controls.Add(Me.ButtonAuthorize)
Me.Controls.Add(Me.Label1)
Me.Name = "FormRequests"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "FormRequests"
Me.ResumeLayout(False)
End Sub
#End Region
#
'---------------------------------------------------------------------
' フォームを閉じます。
'---------------------------------------------------------------------
Private Sub ButtonClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
ButtonClose.Click
Close()
End Sub
'---------------------------------------------------------------------
' 電文を送信し、レスポンス内容を表示します。
'---------------------------------------------------------------------
Private Sub ButtonAuthorize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
ButtonAuthorize.Click
'request パラメーターを設定
Dim paramList As Collection = New Collection
paramList.Add(New ParamBean("MerchantId", "userid"))
paramList.Add(New ParamBean("MerchantPass", "passwd"))
paramList.Add(New ParamBean("TransactionDate", "20091225"))
paramList.Add(New ParamBean("OperateId", " [各処理OperateId] "))
paramList.Add(New ParamBean("MerchantFree1", ""))
paramList.Add(New ParamBean("MerchantFree2", ""))
paramList.Add(New ParamBean("MerchantFree3", ""))
paramList.Add(New ParamBean("●●", ""))
paramList.Add(New ParamBean("▼▼", ""))
Try
'必要な変数宣言
Dim responseList As String
Dim rows As Integer
Dim gc As SLNConnection = New SLNConnection
'接続先URL アドレスを設定
gc.ConnectionURL = " [接続先URL] "
‘タイムアウト時間を設定(単位秒)
gc.ConnectionTimeOut = 90
'request を送信
rows = gc.SendRequest(paramList, responseList)
Dim outString As String
outString + = responseList
'受信したパラメーターを出力
MessageBox.Show(outString, "レスポンス内容")
Catch we As WebException
'タイムアウト等のエラーを表示
MessageBox.Show(we.Message, "エラー")
End Try
End Sub
End Class4.1.3.2. 接続クラス
接続クラス(VB.NET)
iImports System.Web
Imports System.Text
'---------------------------------------------------------------------
'request パラメーターを送受信する構造体の宣言
'---------------------------------------------------------------------
Public Structure ParamBean
Private keyString As String
Private valueString As String
'コンストラクタ
Sub New (ByVal key As String, ByVal value As String)
keyString = key
valueString = value
End Sub
'パラメーターキーのプロパティ
Public Property Key() As String
Get
Return keyString
End Get
Set (ByVal Value As String)
keyString = Value
End Set
End Property
'パラメーター値のプロパティ
Public Property Value() As String
Get
Return valueString
End Get
Set (ByVal Value As String)
valueString = Value
End Set
End Property
End Structure
'---------------------------------------------------------------------
'指定されたパラメーターをPOST 送信し、パラメーターの数を返します。
'---------------------------------------------------------------------
Public Class SLNConnection
'接続先URL アドレス
Public Shared ConnectionURL As String
'通信タイムアウト時間(s)
Public Shared ConnectionTimeOut As Integer = 600
Public Function SendRequest(ByVal paramList As Collection, ByRef retList As Collection) As Integer
'文字コードを指定する
Dim encoding As Encoding = encoding.GetEncoding("utf-8")
'POST 送信する文字列を作成
Dim postString As String
Dim i As Integer = 0
For Each paramBean As ParamBean In paramList
'最初のパラメーターでなければ「&」を付加
If i > 0 Then
postString + = "&"
End If
'パラメーターを連結(System.Web.dll を参照設定に追加する必要があります)
postString + = paramBean.Key + "=" + HttpUtility.UrlEncode(paramBean.Value, encoding)
i + = 1
Next
'バイト型配列に変換
Dim postDataBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(postString)
'WebRequest の作成(System.dll を追加する必要があります)
Dim req As System.Net.HttpWebRequest = System.Net.WebRequest.Create(ConnectionURL)
'メソッドにPOST を指定
req.Method = "POST"
'ContentType を"application/x-www-form-urlencoded"にする
req.ContentType = "application/x-www-form-urlencoded"
'POST 送信するデータの長さを指定
req.ContentLength = postDataBytes.Length
'タイムアウト時間を設定
req.Timeout = ConnectionTimeOut * 1000
req.ReadWriteTimeout = ConnectionTimeOut * 1000
'データをPOST 送信するためのStream を取得
Dim reqStream As System.IO.Stream = req.GetRequestStream()
'送信するデータを書き込む
reqStream.Write(postDataBytes, 0, postDataBytes.Length)
reqStream.Close()
'サーバーからの応答を受信するためのWebResponse を取得
Dim res As System.Net.WebResponse = req.GetResponse()
'応答データを受信するためのStream を取得
Dim resStream As System.IO.Stream = res.GetResponseStream()
'受信した情報からパラメーターを抽出
Dim lineString As String
Dim reqReader As New System.IO.StreamReader(resStream, encoding)
'Response データを取り出す
lineString = reqReader.ReadLine()
'ResponseStream を閉じる
reqReader.Close()
'受信したパラメーターの数を戻り値として返す
SendRequest = retList.Count
End Function
End Class4.1.4. AES暗号化
4.1.4.1. 暗号化(Java)
暗号化(Java)
// URL エンコード
merchantPass = URLEncoder.encode(merchantPass, "UTF-8");
transactionDate = URLEncoder.encode(transactionDate, "UTF-8");
// ※以下略
// 「パラメーター名=値」形式を「&」で連結
sb = new StringBuilder();
sb.append("MerchantPass");
sb.append("=");
sb.append(merchantPass);
sb.append("&");
sb.append("TransactionDate");
sb.append("=");
sb.append(transactionDate);
// ※以下略
// AES 暗号化
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encKey.getBytes(), "AES"), ivSpec);
b = cipher.doFinal(value.getBytes());
// Base64 エンコード
encValue = new String(Base64.encodeBase64(b, false));
// URL エンコード
encValue = URLEncoder.encode(encValue, "UTF-8");4.1.4.2. POSTによるリダイレクト(HTML)
POSTによるリダイレクト(HTML)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body onload="javascript:document.forms['redirectForm'].submit();">
<form action="【API 取得先 URL】" method="post" id="redirectForm">
<input type="hidden" name="MerchantId" value="【マーチャントID】" />
<input type="hidden" name="EncryptValue" value="【暗号化電文】" />
<input type="hidden" name="OperateId" value="18Auth" />
</form>
</body>
</html>4.1.5. AES復号
4.1.5.1. AES復号(Java)
AES復号(Java)
// URL デコード
encValue = req.getParameter("EncryptValue");
encValue = URLDecoder.decode(encValue, "UTF-8");
// Base64 デコード
b = Base64.decodeBase64(encValue.getBytes());
// AES 暗号化
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(encKey.getBytes(), "AES"), ivSpec);
value = new String(cipher.doFinal(b));
// 「&」で分割
paramArray = value.split("&");
// 「=」で分割し、パラメーター値を取得する
for (String param : paramArray) {
String[] val = param.split("=");
if (val.length >= 2) {
// URL デコード
paramValue = URLDecoder.decode(val[1], "UTF-8");
}
}