<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */


## カード決済用
# MDK パッケージをインクルード
include_once($LIBRARY_PATH . "/Transaction.php");
include_once($LIBRARY_PATH . "/Config.php");
include_once($LIBRARY_PATH . "/Log_DIOnosupport.php");
define('CONFIG_PATH', $CONFIG_PATH);
define('MERCHANT_ID', $MERCHANT_ID);
define('PASS_PHRASE', $PASS_PHRASE);
define('ENCODE',      $ENCODE);
define('TXN_TYPE',    $TXN_TYPE);
define('PAYTO_URL',   $PAYTO_URL);
define("MSTATUS_FBM","failure-bad-money");


## コンビニ決済用
# MDK パッケージをインクルード
include_once($CVS_PHPLIB_PATH . "/CVS_Transaction.php");
include_once($CVS_PHPLIB_PATH . "/CVS_Config.php");
include_once($CVS_PHPLIB_PATH . "/CVS_Log_DIOnosupport.php");
define('CVS_CONFIG',      $CVS_CONFIG);
define('CVS_MERCHANT_ID', $CVS_MERCHANT_ID);
define('CVS_SIG_KEY',     $CVS_SIG_KEY);
define('CVS_ENCODE',      $CVS_ENCODE);

class Veritrans
{
    // カード決済用
    var $card;

    var $merchant_id;
    var $pass_phrase;
    var $encode;
    var $paytourl;
    var $txn_type;
    var $MIblock;
    var $MI;
    var $MI_SIG;
    var $QUERY_MI;
    var $dt;

    // コンビニ決済用
    var $cvs;

    var $cvs_merchant_id;
    var $cvs_sig_key;
    var $cvs_encode;

    var $card_number;
    var $card_name;
    var $card_exp;

    function Veritrans()
    {
        # トランザクションオブジェクトを作成
        # カード決済用
        $this->card = new Transaction;

        # 設定ファイル jpgwclient.conf によりオブジェクトを設定
        $this->card->setServer(CONFIG_PATH);

        $this->merchant_id = MERCHANT_ID;
        $this->pass_phrase = PASS_PHRASE;
        $this->encode      = ENCODE;
        $this->txn_type    = TXN_TYPE;
        $this->paytourl    = PAYTO_URL;

        # コンビニ決済用
        if (USE_CVS)
        {
	        $this->cvs = new CVS_Transaction;
	        $this->cvs->setServer(CVS_CONFIG);

	        $this->cvs_merchant_id = CVS_MERCHANT_ID;
	        $this->cvs_sig_key     = CVS_SIG_KEY;
	        $this->cvs_encode      = CVS_ENCODE;
		}
    }

    function getOrderid($dt) {
        $this->dt = date('YmdHis');
        if (!empty($dt)) $this->dt = $dt;
        return 'oneshop'. $this->dt;
    }


    function getMi($price, $dt="") {
        # MI メッセージを生成する
        $this->MIblock = array(
          "merchant-id" => $this->merchant_id,
          "txn-type"    => $this->txn_type,
          "order-id"    => $this->getOrderid($dt),
          "price"       => $price,
          "payto"       => $this->paytourl
        );

        $this->MI = $this->card->UrlEncode($this->encode, $this->MIblock);

        return $this->dt;
    }


    function getMiSig($MI="")
    {
        $log =& LogFactory::getLog();
        $log->debug("debug", "Arzon_Logic_Payment#getMiMsg");

        # ページ遷移改竄チェックのため MI の電子署名を作成する
        if (empty($MI)) $mi = $this->MI;
        else            $mi = $MI;

        $this->MI_SIG = $this->card->GetHash($mi, $this->merchant_id, $this->pass_phrase);

        return $this->MI_SIG;
    }

    function checkSignature($price="") {
        # 支払ページからのパラメータを取得
        $query = $this->card->GetQuery($this->encode);
        $this->getMi($query["price"], $query["dt"]);
        $MI_SIG = $query['MI_SIG'];

        $this->card_number = $query['card_number'];
        $this->card_name = $query['card_name'];
        $this->card_exp = sprintf("%02d/%02d", $query['exp_month'], substr($query['exp_year'], -2));
        $signature = $this->getMiSig();

        if ($signature != $MI_SIG) return false;
        return true;
    }


    function getCVSSig ($amount, $dt="") {
		# コンビニ決済未使用の場合はリターン
        if (!USE_CVS) return;

        # リクエストパラメータ配列の作成
        $params = array(
            REQ_ORDER_ID => $this->getOrderid($dt),
            REQ_AMOUNT => $amount,
            REQ_PAY_LIMIT => date("Y/m/d", mktime(0,0,0,date("m"),date("d")+CVS_PAY_LIMIT,date("Y")))
        );

        # URL エンコードを行う
        $params_str = $this->cvs->URLEncode($this->cvs_encode, $params);
        # ページ改ざんを防止するためにハッシュを計算する
        $hash = $this->cvs->genHash($this->cvs_merchant_id, $this->cvs_sig_key, $params_str);

        return $hash;
    }
    function checkCVSSig () {
		# コンビニ決済未使用の場合はリターン
        if (!USE_CVS) return;

        $query = $this->cvs->getQuery($this->cvs_encode);
        # リクエストパラメータ配列の作成
        $params = array(
            REQ_ORDER_ID => $this->getOrderid($query["dt"]),
            REQ_AMOUNT => $query["price"],
            REQ_PAY_LIMIT => date("Y/m/d", mktime(0,0,0,date("m"),date("d")+CVS_PAY_LIMIT,date("Y")))
        );

        # URL エンコードを行う
        $params_str = $this->cvs->URLEncode($this->cvs_encode, $params);
        # ページ改ざんを防止するためにハッシュを計算する
        $hash = $this->cvs->genHash($this->cvs_merchant_id, $this->cvs_sig_key, $params_str);

        if (strlen($hash) <= 0 || $hash != $query['CVS_SIG']) return false;
        return true;
    }

    function jCode ($str) {
        return $this->cvs->jCode($str, ENCODE_UTF8, $this->cvs_encode);
    }
    function setCardinfo(&$number, &$name, &$exp) {
        $number = $this->card_number;
        $name = $this->card_name;
        $exp = $this->card_exp;
    }

    function doCardTransaction(&$r, $txn_type, $request, $info) {
        $r = $this->card->doTransaction($txn_type, $request);
        if (substr_count($r[MSTATUS], MSTATUS_SC) == 0) {
            if (substr_count($r[MSTATUS], MSTATUS_FBM) == 0) {
                // 取引拒否以外のエラーは、エラー画面表示
                // エラーメッセージを削除することで、エラー画面が表示される
                $r[MERRMSG] = "";
            }
            return false;
        }
        return true;
    }

    function doCvsTransaction($cmd_emtry=CMD_ENTRY,  $request) {
        return $this->cvs->doTransaction($cmd_emtry, $request);
    }
}
?>