【課金サービス開発日誌】 決済システムへの接続テストをやってみる

SPONSORED LINK

Pocket

test_top

さて前回の続き。今回はいよいよ決済システムに実際につないでみますよ。

なお、イプシロンさんのシステムを使うと、ユーザーから見た決済の手順は以下のようになります。

ep0

↑ こんな感じね。

カード番号やらを入力する画面はいったんイプシロンさんに飛んで戻ってくる、というフローです。こちら側でカード番号とかを持たないので安心ですよね。

では、決済システムへ接続するプログラム(上図のpay.phpとfinish.php)を作り、実際に接続してみましょう。

具体的な手順は以下のとおりです。なお、今回は全体像をざっくりつかみ、とりあえず接続してみるということでエラー処理とかははしょりまくっています。

  • イプシロンの管理画面で各種設定。
  • pay.phpを作りこむ。
  • finish.phpを作りこむ。
  • テスト環境に接続し、カード番号とかを入力してみる。
  • データがきちんと入っているか管理画面からデータ確認。

ちょっと長くなりますが、順番にいきますよー。

■ まずは各種設定

まずはイプシロンの管理画面から各種設定を行っておきます。

ep1

↑ テスト環境を使うのでこちらから。

ep2

↑ こんな画面になるのでがしがし入力します。

ま、特に迷うところはないですよね。ファイル名は自分がわかりやすいように適宜変えてください。

■ pay.phpを作りこむ

次に支払い画面(pay.php)を作りこんでいきます。なお、イプシロンさんでもサンプルプログラムを用意してくれているのですが・・・PerlなんでPHPで似たようなものを作ってみます。 → PHPのサンプルプログラムが追加されたようです。

面倒なんでソース全貼り付けの術!どんな処理をしているかはコメントを読んでくださいな。

<?php
// イプシロンテスト環境への接続用プログラム(注文画面)
// created by Gen Taguchi on 2009/11/04
// 
// POSTだったら以下を処理
if ($_SERVER['REQUEST_METHOD']=="POST") {
  // 通信にPEARを使います。「pear install HTTP_Request」などでインストールしておいてください。
  require_once "HTTP/Request.php";
  // 通信データを組み立てていきます。
  // テスト環境接続用のURLはイプシロンさんからもらってください。
  $req =& new HTTP_Request("http://............");
  $req->setMethod(HTTP_REQUEST_METHOD_POST);
  // イプシロンさんからもらう契約コード。XXXXXは適当に置き換えてください。
  $req->addPostData("contract_code", "XXXXX");
  // 結果をXMLでもらいます。
  $req->addPostData("xml", 1);
  // 以下はFormから。
  $req->addPostData("user_id", $_POST['user_id']);
  $req->addPostData("user_name", $_POST['user_name']);
  $req->addPostData("user_mail_add", $_POST['user_mail_add']);
  $req->addPostData("item_code", $_POST['item_code']);
  $req->addPostData("item_name", $_POST['item_name']);
  $req->addPostData("order_number", $_POST['order_number']);
  $req->addPostData("st_code", $_POST['st_code']);
  $req->addPostData("mission_code", $_POST['mission_code']);
  $req->addPostData("item_price", $_POST['item_price']);
  $req->addPostData("process_code", $_POST['process_code']);
  $req->addPostData("memo1", $_POST['memo1']);
  $req->addPostData("memo2", $_POST['memo2']);
  // 接続して結果を取得します。結果はXMLで返ってきます。
  if (!PEAR::isError($req->sendRequest())) {
    $xml = $req->getResponseBody();
  }
  // 結果を取り出すための正規表現パターン。
  $p_result = '!<result result="(0|1)" \/>!i';
  $p_redirect = '!<result redirect="([^"]*)" \/>!i';
  $p_error_code = '!<result err_code="([0-9]+)" \/>!i';
  $p_error_detail = '!<result err_detail="([^"]*)" \/>!i';
  // 処理結果を取り出します。
  $result = preg_match($p_result, $xml, $m1) ? $m1[1] : NULL;
  // 処理がOKだったらリダイレクト、NGだったらエラー表示。
  if ($result==1) {
    $redirect = preg_match($p_redirect, $xml, $m2) ? urldecode($m2[1]) : NULL;
    header("Location: $redirect");
  } else {
    $error_code = preg_match($p_error_code, $xml, $m3) ? $m3[1] : NULL;
    $error_detail = preg_match($p_error_detail, $xml, $m4) ? mb_convert_encoding(urldecode($m4[1]), "UTF-8", "sjis") : NULL;
    echo "ErrCode: $error_code, ErrMsg: $error_detail "; exit;
  }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="jp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>【イプシロン接続テスト】 注文画面</title>
</head>
<body>
<h1>ご注文はこちらから</h1>
<p>商品名:ACTOIN*PADベーシックプラン</p>
<p>価格:1円</p>
<form action="<?= $_SERVER['PHP_SCRIPT']; ?>" method="post">
<!-- 以下はサンプルデータです。本番では動的に生成してください。 -->
<!-- ユーザーのID。初回課金で重複するとエラーなのでランダム値にしています。 -->
<input type="hidden" name="user_id" value="ap-<?= sprintf("%03d", rand(1,999)); ?>" />
<!-- ユーザーの名前 -->
<input type="hidden" name="user_name" value="Gen Taguchi" />
<!-- ユーザーのメアド -->
<input type="hidden" name="user_mail_add" value="taguchi@gmail.com" />
<!-- 商品のID -->
<input type="hidden" name="item_code" value="AP-01" />
<!-- 商品の名前 -->
<input type="hidden" name="item_name" value="actionpad_basic_plan" />
<!-- 商品ID(重複するとエラー)。テスト用にランダムな数値を算出しています。 -->
<input type="hidden" name="order_number" value="<?= rand(1,10000); ?>" />
<!-- 決済区分。クレジットカードはこれで。 -->
<input type="hidden" name="st_code" value="10000-0000-00000" />
<!-- 課金区分。「1」は1回課金です。 -->
<input type="hidden" name="mission_code" value="1" />
<!-- 価格。1円で。 -->
<input type="hidden" name="item_price" value="1" />
<!-- 処理区分。「1」は初回課金です。 -->
<input type="hidden" name="process_code" value="1" />
<!-- 任意のメモをつけることもできます。 -->
<input type="hidden" name="memo1" value="" />
<input type="hidden" name="memo2" value="" />
<input type="submit" value="カード決済画面へ" />
</form>
</body>
</html>

処理があまいところも多々ありますが、とりあえず動くので細かいところはご勘弁。

■ finish.phpを作りこむ

次に決済が完了したあとの画面を作ります。

こちらもざっくりソースをば。

<?php
// イプシロンテスト環境への接続用プログラム(決済完了画面)
// created by Gen Taguchi on 2009/11/04
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="jp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>【イプシロン接続テスト】 決済完了画面</title>
</head>
<body>
<h1>ありがとうございました!</h1>
<p>処理コード:<?= $_GET['trans_code']; ?></p>
<p>ユーザーID:<?= $_GET['user_id']; ?></p>
<p>注文ID:<?= $_GET['order_number']; ?></p>
</body>
</html>

GETでいろいろ飛んでくるので表示しているだけですが、適宜プログラムでユーザー名やら料金やらを表示してあげてください。処理完了のメールを飛ばすといったことも必要ですね。

■ 接続テストをしてみる!

さて、ここまで来たら接続テストをしてみます。pay.phpにアクセスしてみますよ。

or_1

↑ ここからアクセス!

or_2

↑ カード決済画面来た!ここはテストなので適当な値を入力してみます。

or_3

↑ 無事にfinish.phpが来たよ!

■ データが入っているか確認する

さて、画面上ではうまくいったようですが、ちゃんとデータが入っているか、今度はイプシロンの管理画面から確認してみましょう。

ep3

↑ こちらから・・・。

ep4

↑ 検索条件を指定して・・・。

ep5

↑ お、ちゃんと入っていますね!

以上、テスト環境に接続するまでを紹介してみました。だいぶはしょりましたが、全体像はつかんでいただけたのでは。他にもかなり複雑なことができますが、まずはシンプルな処理でテストしてみるのがいいのではないでしょうかね。

とりあえず一回動かして流れをつかめば、あとはキャンセル処理やらカード番号の変更処理やらもわかりやすくなるかと。

マニュアルは種類も多いし、処理コード表やエラーコード表を読み解かなくてはいけないので途中で心が折れそうになりますがw、がんばってチャレンジしてみてください。

ツイッターもやっています!

SPONSORED LINK

  1. No comments yet.

  1. No trackbacks yet.