2020年5月29日(金) 18:03 JST

ECCUBEにNPカード

EC-CUBE

NPカード用のプラグインが用意されてないため、取りあえず一時的データベースにカード情報等を保存するためのカスタマイズをしました。
カード情報等はあれなもんで、都度手動で削除するという運用です。

まず、ECCUBE 管理画面>基本情報管理>支払方法設定で、クレジットカード(NPカード)を追加する。
データベースに保存するカード情報は、
カードの種類「VISA/MasterCard/JCB/AMEX/DINERS」、カードの使用期限、
カードの番号、カードの名義人名、支払方法「一括払い・リボルビング払い・分割払い・ボーナス一括払い」、
があり、カードの種類で、使える支払い方法が異なってきますので、その分のカラムを「dtb_order」、「dtb_order_temp」(受注情報一時保存)に追加します。
「dtb_order_temp」情報を保持するためのカラムを追加。

//カードの名義人
ALTER TABLE dtb_order_temp ADD COLUMN cardname text;
//カードの種類
ALTER TABLE dtb_order_temp ADD COLUMN cardbrand smallint;
//カードの使用期限 年
ALTER TABLE dtb_order_temp ADD COLUMN card_yy smallint;
//カードの使用期限 月
ALTER TABLE dtb_order_temp ADD COLUMN card_mm smallint;
//カードの支払方法「VISA/MasterCard/JCB」
ALTER TABLE dtb_order_temp ADD COLUMN card_methods smallint;
//カードの支払方法「AMEX」
ALTER TABLE dtb_order_temp ADD COLUMN card_methods_amex smallint;
//カードの支払方法「DINERS」
ALTER TABLE dtb_order_temp ADD COLUMN card_methods_di smallint;
//カードの支払方法 分割回数「VISA/MasterCard/JCB」
ALTER TABLE dtb_order_temp ADD COLUMN card_times smallint;
//カードの支払方法 分割回数「AMEX」
ALTER TABLE dtb_order_temp ADD COLUMN card_times_amex smallint;
//カードの番号
ALTER TABLE dtb_order_temp ADD COLUMN cardnumber text;

「dtb_order」情報を保持するためのカラムを追加。

//カードの名義人
ALTER TABLE dtb_order ADD COLUMN cardname text;
//カードの種類
ALTER TABLE dtb_order ADD COLUMN cardbrand smallint;
//カードの使用期限 年
ALTER TABLE dtb_order ADD COLUMN card_yy smallint;
//カードの使用期限 月
ALTER TABLE dtb_order ADD COLUMN card_mm smallint;
//カードの支払方法「VISA/MasterCard/JCB」
ALTER TABLE dtb_order ADD COLUMN card_methods smallint;
//カードの支払方法「AMEX」
ALTER TABLE dtb_order ADD COLUMN card_methods_amex smallint;
//カードの支払方法「DINERS」
ALTER TABLE dtb_order ADD COLUMN card_methods_di smallint;
//カードの支払方法 分割回数「VISA/MasterCard/JCB」
ALTER TABLE dtb_order ADD COLUMN card_times smallint;
//カードの支払方法 分割回数「AMEX」
ALTER TABLE dtb_order ADD COLUMN card_times_amex smallint;
//カードの番号
ALTER TABLE dtb_order ADD COLUMN cardnumber text;

マスターテーブルを8つ追加

//カードの種類
CREATE TABLE mtb_card_brand (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの使用期限 年
CREATE TABLE mtb_card_yy (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの使用期限 月
CREATE TABLE mtb_card_mm (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの支払方法「VISA/MasterCard/JCB」
CREATE TABLE mtb_card_methods (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの支払方法「AMEX」
CREATE TABLE mtb_card_methods_amex (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの支払方法「DINERS」
CREATE TABLE mtb_card_methods_di (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの支払方法 分割回数「VISA/MasterCard/JCB」
CREATE TABLE mtb_card_methods_times (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);
//カードの支払方法 分割回数「AMEX」
CREATE TABLE mtb_card_methods_times__amex (
  id smallint,
  name text,
  rank smallint NOT NULL DEFAULT 0,
  PRIMARY KEY (id )
);

作成したテーブルに値を登録する。「システム設定>マスターデータ管理」で開くことになる。

//mtb_card_brand
INSERT INTO mtb_card_brand (id, name, rank) VALUES (1, 'VISA', 0);
INSERT INTO mtb_card_brand (id, name, rank) VALUES (2, 'MasterCard', 1);
INSERT INTO mtb_card_brand (id, name, rank) VALUES (3, 'JCB', 2);
INSERT INTO mtb_card_brand (id, name, rank) VALUES (4, 'AMEX', 3);
INSERT INTO mtb_card_brand (id, name, rank) VALUES (5, 'DINERS', 4);
//mtb_card_yy
INSERT INTO mtb_card_yy (id, name, rank) VALUES (1, '2012', 0);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (2, '2013', 1);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (3, '2014', 2);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (4, '2015', 3);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (5, '2016', 4);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (6, '2017', 5);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (7, '2018', 6);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (8, '2019', 7);
INSERT INTO mtb_card_yy (id, name, rank) VALUES (9, '2020', 8);
//mtb_card_mm
INSERT INTO mtb_card_mm (id, name, rank) VALUES (1, '1', 0);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (2, '2', 1);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (3, '3', 2);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (4, '4', 3);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (5, '5', 4);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (6, '6', 5);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (7, '7', 6);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (8, '8', 7);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (9, '9', 8);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (10, '10', 9);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (11, '11', 10);
INSERT INTO mtb_card_mm (id, name, rank) VALUES (12, '12', 11);
//mtb_card_methods
INSERT INTO mtb_card_methods (id, name, rank) VALUES (1, '一括払い', 0);
INSERT INTO mtb_card_methods (id, name, rank) VALUES (2, 'リボルビング払い', 1);
INSERT INTO mtb_card_methods (id, name, rank) VALUES (3, '分割払い', 2);
INSERT INTO mtb_card_methods (id, name, rank) VALUES (4, 'ボーナス一括払い', 3);
//mtb_card_methods_amex
INSERT INTO mtb_card_methods_amex (id, name, rank) VALUES (1, '一括払い', 0);
INSERT INTO mtb_card_methods_amex (id, name, rank) VALUES (2, '分割払い', 1);
INSERT INTO mtb_card_methods_amex (id, name, rank) VALUES (3, 'ボーナス一括払い', 2);
//mtb_card_methods_di
INSERT INTO mtb_card_methods_di (id, name, rank) VALUES (1, '一括払い', 0);
INSERT INTO mtb_card_methods_di (id, name, rank) VALUES (2, 'リボルビング払い', 1);
INSERT INTO mtb_card_methods_di (id, name, rank) VALUES (3, 'ボーナス一括払い', 2);
//mtb_card_times
INSERT INTO mtb_card_times (id, name, rank) VALUES (1, '2', 0);
INSERT INTO mtb_card_times (id, name, rank) VALUES (2, '3', 1);
INSERT INTO mtb_card_times (id, name, rank) VALUES (3, '5', 2);
INSERT INTO mtb_card_times (id, name, rank) VALUES (4, '6', 3);
INSERT INTO mtb_card_times (id, name, rank) VALUES (5, '10', 4);
INSERT INTO mtb_card_times (id, name, rank) VALUES (6, '12', 5);
INSERT INTO mtb_card_times (id, name, rank) VALUES (7, '15', 6);
INSERT INTO mtb_card_times (id, name, rank) VALUES (8, '18', 7);
INSERT INTO mtb_card_times (id, name, rank) VALUES (9, '20', 8);
INSERT INTO mtb_card_times (id, name, rank) VALUES (10, '24', 9);
//mtb_card_times_amex
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (1, '3', 0);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (2, '5', 1);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (3, '6', 2);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (4, '10', 3);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (5, '12', 4);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (6, '15', 5);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (7, '18', 6);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (8, '20', 7);
INSERT INTO mtb_card_times_amex (id, name, rank) VALUES (9, '24', 8);

「商品購入/お支払い方法・お届け時間等の指定」にカード情報を追加
data/class/pages/shopping/LC_Page_Shopping_Payment.phpに下記事項を追記

    function init() {
        parent::init();
        $this->tpl_onload = 'fnCheckInputPoint();';
        $this->tpl_title = 'お支払方法・お届け時間等の指定';
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrPref = $masterData->getMasterData('mtb_pref');
        $this->arrCardbrand = $masterData->getMasterData('mtb_card_brand');
        $this->arrCardyy = $masterData->getMasterData('mtb_card_yy');
        $this->arrCardmm = $masterData->getMasterData('mtb_card_mm');
        $this->arrCardmethods = $masterData->getMasterData('mtb_card_methods');
        $this->arrCardmethodsamex = $masterData->getMasterData('mtb_card_methods_amex');
        $this->arrCardmethodsdi = $masterData->getMasterData('mtb_card_methods_di');
        $this->arrCardtimes = $masterData->getMasterData('mtb_card_times');
        $this->arrCardtimesamex = $masterData->getMasterData('mtb_card_times_amex');
    }

    function lfInitParam(&$objFormParam, $deliv_only, &$arrShipping) {
        $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
        $objFormParam->addParam('ポイント', 'use_point', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK', 'ZERO_START'));
        $objFormParam->addParam('その他お問い合わせ', 'message', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('ポイントを使用する', 'point_check', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '2');
        if ($deliv_only) {
            $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
        } else {
            $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('ご利用クレジットカード', 'cardbrand', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
        $objFormParam->addParam('名義人', 'cardname', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
	$objFormParam->addParam('カード番号', 'cardnumber', CREDIT_NUM_LEN1, 'n', array('MIN_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('有効期限月', 'card_mm', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('有効期限年', 'card_yy', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('有効期限年', 'card_yy', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('お支払い方法(VISA/MasterCard/JCB)', 'card_methods', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('お支払い方法(AMEX)', 'card_methods_amex', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('お支払い方法(DINERS)', 'card_methods_di', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('分割回数(VISA/MasterCard/JCB)', 'card_times', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('分割回数(AMEX)', 'card_times_amex', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));

            foreach ($arrShipping as $val) {
                $objFormParam->addParam('お届け時間', 'deliv_time_id' . $val['shipping_id'], INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
                $objFormParam->addParam('お届け日', 'deliv_date' . $val['shipping_id'], STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
            }
        }

        $objFormParam->setParam($arrParam);
        $objFormParam->convParam();
    }

フロントページにカード情報入力欄を追記
data/Smarty/templates/default/shopping/payment.tpl

お届け時間の指定

の上に入力できるように下記を挿入

       

お届け時間の指定

「商品購入/ご入力内容のご確認」に カード情報を追加
data/class/pages/shopping/LC_Page_Shopping_Confirm.phpに下記を追記

    function init() {
        parent::init();
        $this->tpl_title = 'ご入力内容のご確認';
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrPref = $masterData->getMasterData('mtb_pref');
        $this->arrSex = $masterData->getMasterData('mtb_sex');
        $this->arrMAILMAGATYPE = $masterData->getMasterData('mtb_mail_magazine_type');
        $this->arrReminder = $masterData->getMasterData('mtb_reminder');
        $this->arrCardbrand = $masterData->getMasterData("mtb_card_brand",
                                array( "id", "name", "rank" ) );
        $this->arrCardyy = $masterData->getMasterData("mtb_card_yy",
                                array( "id", "name", "rank" ) );
        $this->arrCardmm = $masterData->getMasterData("mtb_card_mm",
                                array( "id", "name", "rank" ) );
        $this->arrCardmethods = $masterData->getMasterData("mtb_card_methods",
                                array( "id", "name", "rank" ) );
        $this->arrCardmethodsamex = $masterData->getMasterData("mtb_card_methods_amex",
                                array( "id", "name", "rank" ) );
        $this->arrCardmethodsdi = $masterData->getMasterData("mtb_card_methods_di",
                                array( "id", "name", "rank" ) );
        $this->arrCardtimes = $masterData->getMasterData("mtb_card_times",
                                array( "id", "name", "rank" ) );
        $this->arrCardtimesamex = $masterData->getMasterData("mtb_card_times_amex",
                                array( "id", "name", "rank" ) );
        $this->httpCacheControl('nocache');
    }

フロントページ「商品購入/ご入力内容のご確認」に
お支払方法でクレジットカード(NPカード)が選択されている場合のみ表示するよう
data/Smarty/templates/default/shopping/confirm.tplに追記

        

お支払方法・配送方法・その他お問い合わせ

 
お支払方法
ご利用クレジットカード ※ご利用クレジットカードを選択して下さい。
カード番号 ※カード番号を入力して下さい。
名義人 ※カード名義人を入力して下さい。
有効期限 月/※有効期限を入力して下さい。
お支払い詳細方法 ※お支払い詳細方法を入力して下さい。
分割回数 ※分割払いの場合は分割回数を必ず入力して下さい。
配送方法
その他お問い合わせ

カード情報をメールに反映させる(カード番号は除いています。)
data/class/helper/SC_Helper_Mail.php に追加

//50行目あたりに追加
    function __construct() {
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrMAILTPLPATH =  $masterData->getMasterData('mtb_mail_tpl_path');
        $this->arrPref = $masterData->getMasterData('mtb_pref');
        $this->arrCardbrand = $masterData->getMasterData('mtb_card_brand');
        $this->arrCardyy = $masterData->getMasterData('mtb_card_yy');
        $this->arrCardmm = $masterData->getMasterData('mtb_card_mm');
        $this->arrCardmethods = $masterData->getMasterData('mtb_card_methods');
        $this->arrCardmethodsamex = $masterData->getMasterData('mtb_card_methods_amex');
        $this->arrCardmethodsdi = $masterData->getMasterData('mtb_card_methods_di');
        $this->arrCardtimes = $masterData->getMasterData('mtb_card_times');
        $this->arrCardtimesamex = $masterData->getMasterData('mtb_card_times_amex');
    }

//181行目あたりに追加
        // 都道府県変換
        $arrTplVar->arrPref = $this->arrPref;
        // カード種類変換
        $arrTplVar->arrCardbrand = $this->arrCardbrand;
        // カード有効期限(年)変換
        $arrTplVar->arrCardyy = $this->arrCardyy;
        // カード有効期限(月)変換
        $arrTplVar->arrCardmm = $this->arrCardmm;
        // 支払い詳細方法変換
        $arrTplVar->arrCardmethods = $this->arrCardmethods;
        // 支払い詳細方法変換
        $arrTplVar->arrCardmethodsamex = $this->arrCardmethodsamex;
        // 支払い詳細方法変換
        $arrTplVar->arrCardmethodsdi = $this->arrCardmethodsdi;
        // 分割方法変換
        $arrTplVar->arrCardtimes = $this->arrCardtimes;
        // 分割方法変換
        $arrTplVar->arrCardtimesamex = $this->arrCardtimesamex;
        // カード名義変換
        $arrTplVar->cardname = $arrOrder['cardname'];

PC用メール data/Smarty/templates/default/mail_templates/order_mail.tpl 34行目あたりに下記追加


ご利用カードの種類:
有効期限: 月/ 年
カードの名義:
お支払い詳細方法:
お支払い分割回数:

以上で完了ですが、クレジット情報を入力する画面では、ユーザビリティを考慮して
javascript等で、入力を制御するカスタマイズをしたほうがいいですね。 とりあえずは、クレジットカード(NPカード)のラジオボタンを押下時にクレジットカード情報入力フォームを 出す感じで運用しています。
カード情報の流出は大変なことになりますので、上記で運用する場合はくれぐれも注意して下さい。