강좌게시판

제목 [ci 드라이버] 한국 pg(결제) 드라이버 만들기 (1) -- 수정중
글쓴이 스미 작성시각 2016/02/18 21:35:58
댓글 : 4 추천 : 2 스크랩 : 2 조회수 : 33091   RSS

-- 기본숙지 하면 좋은 링크

드라이버 생성 Creating Drivers

[link] http://www.ciboard.co.kr/user_guide/kr/general/creating_drivers.html

CI 드라이버 사용 Using CodeIgniter Drivers

[link] http://www.ciboard.co.kr/user_guide/kr/general/drivers.html

외국형의 친절한 드라이버 생성및 사용

[link] http://www.kevinphillips.co.nz/news/codeigniter-drivers-tutorial

 

한국에 여러 pg가 있고 각각 모듈이 틀려 매번 코딩할때마다. 새롭게 ci에 붙여서 사용하는 번거롭더군여.

해서 ci 드라이버를 이용하여 각각의 pg,모듈을 드라이버를 사용. Pg사 교체,개발시 간단하게 사용할수 있을거라는 생각이 들었습니다.

일단 검색해보니. 해외 용은 있더군요

[link] https://github.com/thephpleague/omnipay

 

하지만 한국 pg는 보이지 않았습니다. 해서 드라이버를 만들기로 마음먹음


강좌는 2개로 나누어서 올릴계획입니다.

1강좌는 드라이버 생성에 중점을두고

2강좌는 드라이버 추가에 중점을두고 설명하겠습니다.


 

 

드라이버 명은 Paymentgateway 으로 만들겠습니다.

application/config/paymentgateway.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
if (defined('BASE_URL') == false) define('BASE_URL', CI::$APP->config->item('base_url'));

$config['pg_test'] = FALSE;
$config['pg_driver'] = 'dummy';

$config['pg_default_field']['dummy'] = array();

application/libraries/Paymentgateway/Paymentgateway.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Paymentgateway extends CI_Driver_Library {

	protected $valid_drivers = array(
		'dummy'
	);
	protected $_pg_driver = 'dummy';
	protected $_pg_test = false;

	protected $CI;
	function __construct($config = array())
	{
		$this->CI =& get_instance();
		if(empty($config))$config = $this->CI->config->load('paymentgateway', TRUE);
		else{
			$this->CI->config->set_item('paymentgateway', $config);
		}
		$this->CI->load->helper('url');
		$default_config = array(
			'pg_test',
			'pg_driver'
		);
		foreach ($default_config as $key)
		{
			if (isset($config[$key]))
			{
				$param = '_'.$key;
				$this->{$param} = $config[$key];
			}
		}

		// If the specified adapter isn't available, check the backup.
		try{
			if(!$this->is_supported($this->_pg_driver))
			{
				throw new Exception('Paymentgateway driver "'.$this->_pg_driver.'" is unavailable.', 1);
			}
			if(!is_array($this->setDefaultParams($config['pg_default_field'])))
			{
				throw new Exception('Paymentgateway driver "'.$this->_pg_driver.'" is pg_default_field.', 2);
			}
		}
		catch(Exception $e){
			log_message('debug', $e->getMessage().' (error code:'.$e->getCode().')');
			show_error('Invalid driver requested: '.$this->_pg_driver.'(error code:'.$e->getCode().')');
		}
	}
	public function getCompany()
	{
		return $this->{$this->_pg_driver}->_pgCompany;
	}
	public function setDefaultParams()
	{
		$pg_default_field = $this->CI->config->item('pg_default_field','paymentgateway');
		if($pg_default_field==null){
			return FALSE;
		}
		if(!isset($pg_default_field[$this->_pg_driver]) or !is_array($pg_default_field[$this->_pg_driver])) {
			return FALSE;
		}
		return $this->{$this->_pg_driver}->setDefaultParams($pg_default_field[$this->_pg_driver],$this->_pg_test);
	}
	public function setCommand($command=null)
	{
		return $this->{$this->_pg_driver}->setCommand($command);
	}
	public function getCommand($command=null)
	{
		return $this->{$this->_pg_driver}->getCommand($command);
	}
	public function setPG()
	{
		return $this->{$this->_pg_driver}->setPG();
	}

	public function run($pgCommand=null,$pgParams=null)
	{
		return $this->{$this->_pg_driver}->run($pgCommand,$pgParams);
	}

	public function get_validation_rules($type = 'run')
	{
		if (!empty($type)) {
			$this->{$this->_pg_driver}->setCommand($type);
			$check_rules = $this->{$this->_pg_driver}->getCommand() . '_validation_rules';
		}

		$temp_validation_rules = $this->{$this->_pg_driver}->validation_rules;

		// Any insert additions?
		if (
			is_array($this->{$this->_pg_driver}->$check_rules)
			&& !empty($this->{$this->_pg_driver}->$check_rules)
		) {
			// Get the index for each field in the validation rules
			$fieldIndexes = array();
			foreach ($temp_validation_rules as $key => $validation_rule) {
				$fieldIndexes[$validation_rule['field']] = $key;
			}

			foreach ($this->{$this->_pg_driver}->$check_rules as $key => $rule) {
				if (is_array($rule)) {
					$insert_rule = $rule;
				} else {
					// If $key isn't a field name and $insert_rule isn't an array,
					// there's nothing useful to do, so skip it.
					if (is_numeric($key)) {
						continue;
					}

					$insert_rule = array(
						'field' => $key,
						'rules' => $rule,
					);
				}

				// If the field is already in the validation rules, update the
				// validation rule to merge the insert rule (replace empty rules).
				if (isset($fieldIndexes[$insert_rule['field']])) {
					$fieldKey = $fieldIndexes[$insert_rule['field']];
					if (empty($temp_validation_rules[$fieldKey]['rules'])) {
						$temp_validation_rules[$fieldKey]['rules'] = $insert_rule['rules'];
					} else {
						$temp_validation_rules[$fieldKey]['rules'] .= "|{$insert_rule['rules']}";
					}
				} else {
					// Otherwise, add the insert rule to the validation rules
					$temp_validation_rules[] = $insert_rule;
				}
			}
		}

		return $temp_validation_rules;
	}

	public function is_supported($driver)
	{
		static $support = array();

		if ( ! isset($support[$driver]))
		{
			$support[$driver] = $this->{$driver}->is_supported();
		}

		return $support[$driver];
	}

}

application/libraries/Paymentgateway/drivers/Paymentgateway_dummy.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class CI_Paymentgateway_dummy extends CI_Driver
{
    //validation rules
    public $validation_rules = array(
		array('field' => 'price', 'label' => '상품결제 금액', 'rules' => 'trim|integer|is_natural_no_zero|max_length[20]')
	);
    public $pay_validation_rules = array(
		array('field' => 'price', 'label' => '상품결제 금액', 'rules' => 'required')
	);
    public $cancel_validation_rules = array();

	public $PG_ROOT = null;
	public $DUMMY = null;
	public $_pgCompany = 'dummy';
	public $_pgCommand = FALSE;
	public $_pgDefaultParams = array();
	public $_pgParams = array();

	public function __construct()
	{
		$CI =& get_instance();
		$this->PG_ROOT = dirname(__FILE__) . '/dummy';
	}

	public function setPG()
	{
		return new stdClass();
	}

	public function setCommand($pgCommand = FALSE)
	{
		$this->_pgCommand = FALSE;
		if (empty($pgCommand)) return FALSE;
        // run 실행시 있는 함수있지 체크
		$this->_pgCommand = method_exists($this, $pgCommand) == TRUE ? $pgCommand : null;
		return $this;
	}

	public function getCommand()
	{
		return $this->_pgCommand;
	}

	public function setDefaultParams($pgDefaultParams = null, $test)
	{
		$this->_pgDefaultParams = array_merge($this->_pgDefaultParams,$pgDefaultParams);
		return $this->_pgDefaultParams;
	}

	public function purgeParams()
	{
		$this->_pgCommand = array();
	}

	public function setParams($pgParams = null)
	{
		if (empty($this->_pgCommand)) return FALSE;
		if (is_array($this->_pgParams) == false) $this->_pgParams = array();
		$this->_pgParams = array_merge($this->_pgParams, $pgParams);
	}

	public function run($pgCommand = null, $pgParams = null)
	{
        // 모듈 선언
		if (!is_object($this->DUMMY)) $this->DUMMY = $this->setPG();
		if (!empty($pgCommand)) {
            // command 선언
			$this->setCommand($pgCommand);
		}
        // command 확인
		if (empty($this->_pgCommand)) return false;

        // 결제 관련값 입력
		if (!empty($pgParams) && is_array($pgParams)) {
			$this->setParams($pgParams);
		}
        // 결제 관련값 확인
		if (empty($this->_pgParams)) return false;

        // command 실행
		return call_user_func(array($this, $this->_pgCommand));
	}

	public function cancel($pgParams = null)
	{
		if (!empty($pgParams) && is_array($pgParams)) {
			$this->setParams($pgParams);
		}
		if (empty($this->_pgParams)) return false;
        // 모듈에 전송
		$this->assign_params($this->_pgParams);
		ob_start();
        // 모듈 실행
		//$this->DUMMY->startAction();
		ob_clean();
        // 모듈 결과값 변경
		$result = $this->sanitize_result();
		return $result;
	}

	public function pay($pgParams = null)
	{
		if (!empty($pgParams) && is_array($pgParams)) {
			$this->setParams($pgParams);
		}
		if (empty($this->_pgParams)) return false;
        // 모듈에 전송
        $this->assign_params($this->_pgParams);
        ob_start();
        // 모듈 실행
        //$this->DUMMY->startAction();
        ob_clean();
        // 모듈 결과값 변경
        $result = $this->sanitize_result();
        return $result;
	}
    // 모듈 전송값 포맷
	public function assign_params($params = null)
	{
		if (!is_object($this->DUMMY)) $this->DUMMY = $this->setPG();
		if (!empty($pgParams) && is_array($pgParams)) {
			$this->setParams($pgParams);
		}
		if (empty($this->_pgParams) or !is_array($this->_pgParams)) return false;
		if (empty($this->_pgDefaultParams) or !is_array($this->_pgDefaultParams)) return false;
		$params = array_merge($this->_pgDefaultParams, $this->_pgParams);
		foreach ($params as $k => $v) {
			$this->DUMMY->{$k} = $v;
		}
	}
    // 모듈 결과값 포맷
	public function sanitize_result()
	{
		if (!is_object($this->DUMMY)) $this->DUMMY = $this->setPG();
		return (array)$this->DUMMY;
	}

	// 사용가능여부 체크
	public function is_supported()
	{
		$required_extensions = array('mcrypt', 'sockets', 'xml', 'openssl', 'iconv');
		foreach ($required_extensions as $ext_name) {
			if (!extension_loaded($ext_name)) {
				log_message('debug', 'Paymentgateway driver "' . $this->_pg_driver . '" "' . $ext_name . '" extension not loaded.');
				return FALSE;
			}
		}
		return TRUE;
	}
}

dummy 라는 모듈은 없습니다. 말그대로 드라이버 기본형태와 개발 테스트를 용의 하게 하기위하여 만들었습니다.

application/controllers/Pay_test.php

<?php if(!defined('BASEPATH'))exit('Nodirectscriptaccessallowed');

class Pay_test extends CI_Controller {

        public function index()
        {
                
                $this->load->driver('paymentgateway');
                $this->load->library('form_validation');

                $payData = array(
                        'good_name' => '결제 테스트',                // 상품명
                        'price' => '1000',                            // 금액
                        'buyer_name' => '홍길동',                // 구매자명
                        'card_number' => '12312315674',    // 신용카드번호
                        'auth_field1' => '19991225',                // 생년월일
                        'auth_field2' => '00',                // 신용카드 비밀번호 앞 2자리
                        'card_exp_year' => '99',            // 신용카드 유효기간-년 (YY)
                        'card_exp_month' => '12',                // 신용카드 유효기간-월 (MM)
                        'card_kind' => '1',                // 카드종류(개인-0,법인-1)
                );
                $this->form_validation->set_data($payData)->set_rules($this->paymentgateway->get_validation_rules('pay'));

                if ($this->form_validation->run() == FALSE)
                {
                        echo $this->form_validation->error_string();
                        exit();
                }
             $pgResult = $this->paymentgateway->run('pay', $payData);
             print_r($pgResult);
        }
}

 

해당 강의는 입력중입니다. 22일 까지는 2강까지 마무리하여 많은 분들에게 도움이 되도록하겠습니다.

추후 파일들은 upload 하도록 하겠습니다.

 다음글 [ci 드라이버] 한국 pg(결제) 드라이버 만들기 (... (5)
 이전글 심플하게 hook 사용 방법 (3)

댓글

변종원(웅파) / 2016/02/18 22:08:09 / 추천 0
굿입니다. 2강도 기대하고 있겠습니다. ^^
kaido / 2016/02/19 09:12:25 / 추천 0

이런건 일단 추천!

드라이버는 생각 안 해봤었는데 이번 기회에 마스터 해놔야겠네요.

한대승(불의회상) / 2016/02/19 09:34:08 / 추천 0

와우 기대되는 강좌 입니다. ^^

참고로 드라이버는 php 인터페이스가 지원되지 않는 4.x 시절에 만들어진 CI 에서는 인터페이스를 지원하기 위한 궁여지책인것 같습니다.

7.0으로 업그레이드 되었고 CI 4.0 에서 다양한 변화를 기대해 봅니다.

누구야 / 2016/03/21 12:10:23 / 추천 0

좋은 정보 감사합니다!!

굉장하군요 ㅡ/.,ㅡㅋ