EC-CUBEで銀行決済モジュールを作る

EC-CUBE店舗のカスタマイズを頼まれました。

銀行決済とクレジットカード決済をつけると。クレジットカード決済は愛媛銀行のものを使い、既存の有償オプションモジュールでは対応できるか分からず、モジュールとして自作することになりました。

銀行決済では購入完了の前に振込先を表示するだけでカスタマイズが簡単なので、そのやり方について書いておきます。

まず無料の決済モジュールを入れてみて調べたところ、モジュールのファイルは
[eccube]/data/downloads/module
([eccube]はインストールしたディレクトリまでの絶対パス
の下に入ることが分かりました。ここにモジュールフォルダを作っておきます。

決済でここのファイルを呼び出すようにするには、DBデータを直接変えるのが一番簡単でした。
dtb_paymentテーブルのmemo03に先ほど作った[eccube]/data/downloads/module/[モジュールディレクトリ名]/c
を入れると決済選択後のload_payment_module.phpがそのファイルをインクルードするわけです。
こちらでも説明しています。
http://d.hatena.ne.jp/red_snow/20090618/1245305496
memo03なんて名前のカラム名を使うところが「えぇ〜〜」な感じです。eccubeというのはコードは割りと読みやすいのですが、基本設計はけっこう行き当たりばったりというか後から実装しただろう部分でおかしなところが残っているようです。修正したくなりますけどぐっと我慢。

インクルードされるファイルでは好きに書いちゃっていいわけですが、とりあえず他と合わせようかと思い

[eccube]/data/downloads/module/[モジュールディレクトリ名]/mu-ginkou.php

<?php
require_once(realpath(dirname( __FILE__)) . "/LC_Page_Mdl_MuGinkou_Helper.php");

$objPage = new LC_Page_Mdl_MuGinkou_Helper();
$objPage->init();
$objPage->process();

としました。

LC_Page_Mdl_MuGinkou_Helper.php]

読み込まれるLC_Page_Mdl_MuGinkou_Helper.phに処理を書いていきます。

<?php
// {{{ requires
// モバイルサイトで読み込まれないのでrequireしておく。
//require_once(CLASS_PATH. "SC_CampaignSession.php");
//require_once(realpath(dirname( __FILE__)). '/LC_Page_Mdl_MuGinkou_Config.php');
//require_once(realpath(dirname( __FILE__)). "/LC_Helper_Send_Payment.php");
//require_once(DATA_PATH. 'module/Request.php');

require_once(CLASS_PATH . "pages/LC_Page.php");

//require_once(realpath(dirname( __FILE__)) . "/include.php");

// モジュールコード

define("MDL_MUGINKOU_CODE", "mdl_mu-ginkou");

class LC_Page_Mdl_MuGinkou_Helper extends LC_Page {

    /**
     * コンストラクタ
     *
     * @return void
     */
    function LC_Page_Mdl_MuGinkou_Helper() {
    }

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
        session_cache_limiter('private-no-expire');
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
		parent::process();
		$objView = (SC_MobileUserAgent::isMobile()) ? new SC_MobileView() : new SC_SiteView();
        $objSiteInfo = $objView->objSiteInfo;
        $objCartSess = new SC_CartSession();
        $objSiteSess = new SC_SiteSession();

		// ユーザユニークIDの取得と購入状態の正当性をチェック


		$uniqid = SC_Utils_Ex::sfCheckNormalAccess($objSiteSess, $objCartSess);

		$this->tpl_uniqid = $uniqid;


		switch($_POST['mode']) {
			// 完了ページへ
			case 'send':
            
				//echo 'send';
	
			$objSiteSess->setRegistFlag();
	
			$this->sendRedirect($this->getLocation(URL_SHOP_COMPLETE), true);
	
           exit;
	
			break;
			// 戻る
	
       case 'return':
		
		// 正常な推移であることを記録しておく
	
           $objSiteSess->setRegistFlag();
	
           $this->sendRedirect($this->getLocation(URL_SHOP_PAYMENT), true);
	
			exit;
	
           break;
			default:
				break;
        }
		$this->tpl_mainpage = MODULE_PATH . MDL_MUGINKOU_CODE. "/ginkou.tpl";	// テンプレートファイルを指定
		$objView->assignobj($this);
		$objView->display(SITE_FRAME);
	}


}
?>

ginkou.tpl

テンプレートファイル

<!--▼CONTENTS-->
<div id="under02column">
  <div id="under02column_shopping">

    <form name="form1" id="form1" method="post" action="<!--{$smarty.server.PHP_SELF|escape}-->">
    <input type="hidden" name="mode" value="send">
    <input type="hidden" name="uniqid" value="<!--{$tpl_uniqid}-->">
    

<p>銀行振込を選択された方は、<span style="color:red;">本日より1週間以内に下記口座に代金をお振込下さい。</span>なお、振込手数料がかかる場合はお客様の負担とさせて頂きますので、あらかじめご了承下さい。</p>
<br />
<p>お振込を確認しましたら、メールでご連絡致します。</p>
<p>※お支払金額等に誤りがある場合には、お電話差し上げる事もございます。</p>
<br />
<p>お支払口座:</p>
<p>○○銀行 ○○支店   普通預金   ○○○○○○○○○○</p>
<br />

    
    <p>
    以上の内容をメモしたうえで、下記「注文完了ページへ」ボタンをクリックしてください。<br />
    </p>

      <div class="tblareabtn">
        <a href="#" onclick="document.form2.submit(); return false;" onmouseover="chgImgImageSubmit('<!--{$TPL_DIR}-->img/common/b_back_on.gif',back03)" onmouseout="chgImgImageSubmit('<!--{$TPL_DIR}-->img/common/b_back.gif',back03)"><img src="<!--{$TPL_DIR}-->img/common/b_back.gif" width="150" height="30" alt="戻る" border="0" name="back03" id="back03"/></a>&nbsp;
        <input type="image" onclick="return fnCheckSubmit();" onmouseover="chgImgImageSubmit('<!--{$TPL_DIR}-->img/common/b_complete_on.gif',this)" onmouseout="chgImgImageSubmit('<!--{$TPL_DIR}-->img/common/b_complete.gif',this)" src="<!--{$TPL_DIR}-->img/common/b_complete.gif" width="150" height="30" alt="注文完了ページへ" border="0" name="next" id="next" />
      </div>
    </form>
    <form name="form2" id="form2" method="post" action="./load_payment_module.php" autocomplete="off">
      <input type="hidden" name="mode" value="return">            
    </form>
  </div>
</div>
<!--▲CONTENTS-->

苦労したのはユーザー用のヘッダ・フッタを表示するところ。最初、テンプレートファイルに直接書いてみたりしたのですが、ソースをみているうちに$objView->display(SITE_FRAME);でだせることが分かりました。
コンテンツ内のテンプレートファイルを指定するには$objView->_smarty->_tpl_vars['tpl_mainpage']を変えればいいので

$this->tpl_mainpage = MODULE_PATH . MDL_MUGINKOU_CODE. "/ginkou.tpl"; // テンプレートファイルを指定
$objView->assignobj($this);
$objView->display(SITE_FRAME);

としてやることで表示できるようになりました。

クレジットカードについても同じようにカード番号入力フォームなど作ってやりました。こちらは省略。