GMOイプシロンの決済代行システムでテストしてます。その2

GMO イプシロンが提供する決済代行サービスを利用するためにテストを行っているので備忘録としてこちらに残しておこうと思います。
このシステム仕様書が分かりにくいので、テストしながら作っています。

今回は第2回目です。同じように困っている方の一助になれば幸いです。


今回の内容

1回目ではダミーデータを送信してリンク決済を行う URL が含まれた XML を表示するまでを行いました。
今回は、取得した XML ファイルからリダイレクトする URL を取得してページ遷移まで行いましょう。

リンク決済用の URL を XML から取り出す

では、まずは XML から URL を取り出していきましょう。
返ってくる XML は以下のようなものです。

<?xml version="1.0" encoding="UTF-8" ?>
 <Epsilon_result>
  <result result="1" />
  <result redirect="https%3A%2F%2Fbeta.epsilon.jp%2Fcgi-bin%2Forder%2Fmethod_select3.cgi%3Ftrans_code%3D***********" />
  </Epsilon_result>

受け取ったデータから <Epsilon_result> ~ </Epsilon_result> 間のみを検出して結果を配列に入れていきます。

POST でのデータ送信までは第1回の記事を参考にして下さいね。

// POST送信を実行
$epsilon_response = file_get_contents($url, false, stream_context_create($options));

// レスポンスの文字コードを念のため、UTF-8に変換しておく
$epsilon_response = mb_convert_encoding($epsilon_response, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

/*
応答はリンク決済を行うURLがXML形式で返ってくる
以下例)
<?xml version="1.0" encoding="UTF-8" ?>
<Epsilon_result>
  <result result="1" />
  <result redirect="https%3A%2F%2Fbeta.epsilon.jp%2Fcgi-bin%2Forder%2Fmethod_select3.cgi%3Ftrans_code%3D*************" />
</Epsilon_result>
*/

// GMO EpsilonのCGIから返ってきたXMLを解析して$resultに結果を格納する
$rows = explode("\n", $epsilon_response);
$data_flag = false;
$result = array();
foreach($rows as $row){
	if(preg_match('/<Epsilon_result>/', $row)){
		$data_flag = true;
	} elseif(preg_match('/<\/Epsilon_result>/', $row)){
		$data_flag = false;
	} elseif($data_flag){
		if(preg_match_all('/<result ([a-zA-Z0-9]+?)="(\S+?)".*?>/', $row, $matches, PREG_SET_ORDER)){
			foreach($matches as $match){
				$result[$match[1]] = urldecode($match[2]);
			}
		}
	}
}

file_get_contents() 関数で POST 送信すればレスポンスデータが返り値として使えます。
このレスポンスデータを mb_convert_encoding() 関数で UTF-8 にしておきます。
リンク決済のリダイレクトだけなら日本語は含まれませんが、ほかのところで日本語が返ってくるのでここでも流用できるようにエンコードしておきます。

このデータを扱いやすいように行ごとに分割して配列に格納しておきます。
<Epsilon_result> という文字が含まれる行が見付かるまでは、何も処理をせずに次の行からデータの取得をはじめます。
</Epsilon_result> が見付かればデータ取得を終了します。

データは <result> というタグの属性値として埋め込まれているので、属性名を添字とした連想配列に代入します。
この時、属性値は URL エンコードされているので urldecode() 関数ででコードします。

リンク決済を行うURLにページ遷移させる

リンク決済を行う GMO イプシロンのページ URL が取得できたので、結果を簡単にチェックしてページを移動させます。
ページの移動には header の Location に URL をセットすればOKです。

// 結果が正常(result="1")でリンク決済URLが取得できれば画面遷移させる
if($result['result'] == '1' && preg_match('|^https://|', $result['redirect'])){
	header('Location: '. $result['redirect']);
	exit;
}

正常に処理できたことを表す result = “1” とリダイレクト先のプロトコルが “https” であることを確認して移動します。
処理に失敗すると何も返ってこないか失敗を表す result=”0″ が返ってきます。
必要に応じて処理を行って下さい。

ここまでをまとめたコード

第1回と第2回を合わせると以下のコードになります。

<?php

/*********************************
// GMO Epsilon リンク決済テスト //
*********************************/

// テスト環境用の送信URL
$url = 'https://beta.epsilon.jp/cgi-bin/order/receive_order3.cgi';

// 送信用の仮データ
$data = array(
	'contract_code'     => '********',   // 契約コード 8byte
	'user_id'           => 'testuser001',   // ユーザID (使用可能文字:[a-zA-Z0-9.-+/@]{1,64})
	'user_name'         => '山本大介',   // ユーザ名 (EUC or S-JIS, 64byteまで)
	'user_mail_add'     => 'hogehoge@gmail.com',   // メールアドレス (半角英数字.-_@ 128byte以下)
	'item_code'         => 'test-0001',   // 商品コード、おそらく何でもよい (使用可能文字:[a-zA-Z0-9.-+/]{1,64}, 0のみは禁止)
	'item_name'         => 'あいちのかおり10kg / 他2点',   // 商品名 (EUC or S-JIS, 64byteまで)
	'order_number'      => rand(0,99999999),   // オーダー番号 (重複しないユニークな番号)
	'st_code'           => '11110-0000-00000-00000-00000-00000-00000',   // 決済区分 クレカとコンビニ、ジャパン銀行の場合は'11110-0000-00000-00000-00000-00000-00000'
	'mission_code'      => '1',   // 課金区分 (都度課金の場合は'1', 定期購入は2~)
	'item_price'        => '99999',   // 価格
	'process_code'      => '1',   // 処理区分 (都度課金の場合は'1')
	'memo1'             => 'めも(1)',   // メモ、自由に設定できる (EUC or S-JIS, 128byteまで)
	'memo2'             => 'メモ(2)',   // メモ、自由に設定できる (EUC or S-JIS, 128byteまで)
	'xml'               => '1',   // 応答形式 (0 or 1 -> 1:XML, 0:不明)
	'conveni_code'      => '',   // コンビニ払いの指定 (11:セブンイレブン、21ファミリーマート、31:ローソン、32:セイコーマート、33:ミニストップ)
	'user_tel'          => '***********',   // ユーザの電話番号
	'conveni_limit'     => '',   // コンビニ払いの期限設定 (未指定の場合は管理画面の期限、指定する場合の書式は'YYYY-MM-DD')
	'delivery_code'     => '99',   // 配送区分 ('99'固定)
	'consignee_postal'  => '*******',   // 送り先の郵便番号 (任意)
	'consignee_name'    => 'オクリサキ ダイスケ',   // 送り先の名前 (任意) (EUC or S-JIS, 64byteまで)
	'consignee_address' => '静岡県掛川市***',   // 送り先の住所 (任意) (全角半角48文字以下)
	'consignee_tel'     => '**********',   // 送り先の電話番号 (任意)
	'orderer_postal'    => '*******',   // 注文主の郵便番号 (任意)
	'orderer_address'   => '静岡県掛川市***',   // 注文主の名前 (任意)
	'orderer_name'      => 'チュウモンヌシ ダイスケ',   // 注文主の名前 (任意)
	'orderer_tel'       => '***********',   // 注文主の電話番号 (任意)
	'lang_id'           => 'ja',   // 決済画面の言語設定 (ja:日本語、en:英語)
	'currency_id'       => 'JPY',   // 決済通貨 ('JPY'固定で大丈夫)
	'version'           => '2',   // 決済CGIのバージョン指定 (1:推奨文字コード->EUC, 2推奨文字コード->UTF-8)
	'page_type'         => '12'   // 表示形式 ('12'固定、オーバーレイ表示の場合のみ必須)
);

// データをURLエンコードした形に成形
$content = http_build_query($data);

// file_get_contens関数でPOST送信する準備
$options = array('http' => array(
	'method'  => 'POST',
	'content' => $content
));

// POST送信を実行
$epsilon_response = file_get_contents($url, false, stream_context_create($options));
$epsilon_response = mb_convert_encoding($epsilon_response, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

/*
応答はリンク決済を行うURLがXML形式で返ってくる
以下例)
<?xml version="1.0" encoding="UTF-8" ?>
<Epsilon_result>
  <result result="1" />
  <result redirect="https%3A%2F%2Fbeta.epsilon.jp%2Fcgi-bin%2Forder%2Fmethod_select3.cgi%3Ftrans_code%3D*************" />
</Epsilon_result>
*/

// GMO EpsilonのCGIから返ってきたXMLを解析して$resultに結果を格納する
$rows = explode("\n", $epsilon_response);
$data_flag = false;
$result = array();
foreach($rows as $row){
	if(preg_match('/<Epsilon_result>/', $row)){
		$data_flag = true;
	} elseif(preg_match('/<\/Epsilon_result>/', $row)){
		$data_flag = false;
	} elseif($data_flag){
		if(preg_match_all('/<result ([a-zA-Z0-9]+?)="(\S+?)".*?>/', $row, $matches, PREG_SET_ORDER)){
			foreach($matches as $match){
				$result[$match[1]] = urldecode($match[2]);
			}
		}
	}
}

// 結果が正常(result="1")でリンク決済URLが取得できれば画面遷移させる
if($result['result'] == '1' && preg_match('|^https://|', $result['redirect'])){
	header('Location: '. $result['redirect']);
	exit;
}

?>

まとめ

以上、GMO イプシロンの決済システムからリンク決済のページへのリダイレクトまでをまとめました。

今回はここまでとしてます。ご質問等あればコメントなどでお願いします。

コメント

  • hetemlサーバーでイプシロンを利用していますが、
    hetemlが新サーバーに強制移行になり、これまで使っていたイプシロンが提供するコードでは動かない事態になり、とても焦っている中、こちらの記事に出会いました。

    シンプルなコードで動作するようになり、とても助かりましたm_ _m本当にありがとうございます!!!

    • > ともおさん
      コメントありがとうございます。
      お役に立てて良かったです。
      どんなサーバでも動くようにと思って作ったので嬉しいコメントです!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)