kicc-easypay
Version:
kicc-easypay is kicc easypay library for Node.js
272 lines (249 loc) • 9.44 kB
JavaScript
/**
* @define joinCode
* JC01 키자니아 삼성제휴
* JC02 현대카드 M포인트 청구할인
* JC03 국민카드 아이사랑 카드할인
* JC04 ARS 신용카드 결제 거래 ONLINE 거래
* JC05 ARS 신용카드 결제 거래 OFFLINE 거래
* JC06 세이브 결제 거래
* JC07 비씨 물품바우처 승인 거래
* JC08 롯데 청구할인
*/
var handlebars = require('handlebars')
var fs = require('fs')
var request = require('./request')
var response = require('./response')
var client = require('./client')
var CONST = {
MODE_MOBILE: 'MOBILE',
MODE_PC: 'PC',
CURRENCY_KRW: '00',
TYPE_PAYMENT: 'PAYMENT',
TYPE_MGR: 'MGR',
TR_CODE_PAYMENT: '00101000',
TR_CODE_MGR: '00201000'
}
/**
* Create Easypay instance
* @method Easypay
* @param {object} opts
* @param {string} opts.id [EP_mall_id, sp_mall_id] 가맹점 ID - KICC에서 부여한 가맹점 ID (필수)
* @param {string} [opts.name] [EP_mall_nm, sp_mall_nm] 가맹점명 - 결제창에 표시될 가맹점명 (옵션)
* @param {string} [opts.ci] [EP_ci_url] 가맹점 CI URL - CI 이미지 파일의 URL (옵션)
* @param {boolean} [opts.test] test 여부.
* @param {string} [opts.client] 클라이언트 파일 위치. (절대경로)
* @param {string} [opts.cert] 인증서 파일 위치. (절대경로)
* @param {string} [opts.logPath] 로그파일 저장위치. (절대경로)
* @param {string} [opts.logLevel] 로그 레벨. 기본값: 1 (옵션)
*/
function Easypay (opts) {
this._mall = Easypay.validate(opts, ['id'], {
name: '',
ci: '',
test: false
})
this._client = client.create({
id: this._mall.id,
path: opts.client || '',
cert: opts.cert || '',
logPath: opts.logPath || '',
logLevel: opts.logLevel || 1,
test: this._mall.test
})
}
/**
* return Easypay payment instance
* @method payment
* @param {string} param.mode PC, MOBILE
* @param {string} param.order_no 가맹점 주문번호 - 가맹점에서 생성하는 유일한 번호 (필수)
* @param {string} param.currency 통화코드 - 00 원화 (필수)
* @param {string} param.return_url 가맹점 callback url - 인증응답 받을 가맹점 URL (필수)
* @param {string} [param.window_type] 윈도우 타입 iframe (layer popup) / popup (옵션)
* @param {string} [param.pay_type] 결제수단 - 결제수단표 참조 11: 신용카드, 21: 계좌이체, 22: 무통장입금, 31: 휴대폰, 50: 선불결제, 60: 간편결제 (옵션)
* @param {string} [param.charset] 가맹점 CharSet - EUC-KR,UTF-8 사용시 대문자 이용 (옵션)
* @param {string} [param.lang_flag] 영어버전여부 - KOR: 국문, ENG: 영문 (옵션)
* @param {string} [param.disp_cash_yn] 현금영수증 화면표시여부 N: 미표시, 그 외: DB조회 (옵션)
* @param {string} param.product_nm 상품명 (필수)
* @param {string} param.product_amt 상품금액 - 결제금액 반드시 숫자만가능 (필수)
* @param {string} [param.product_type] 상품구분 0: 실품, 1: 컨텐츠 (옵션)
* @param {string} [param.product_expr] 서비스기간 YYYYMMDD (옵션)
* @param {string} param.os_cert_flag 해외카드인증구분(=2) 변경불가
* @param {string} [param.quota] 할부개월 (카드코드-할부개월) (옵션)
* @param {string} [param.noinst_flag] 무이자설정 Y: 무이자, N: 일반, DB: NULL (옵션)
* @param {string} [param.noinst_term] 무이자기간 (카드코드-할부개월) (옵션)
* @param {string} [param.set_point_card_yn] 카드사포인트 사용여부(Y/N) (옵션)
* @param {string} [param.point_card] 포인트카드 리스트 (카드코드-더할할부개월) cardSetPointCardYn 값이 Y인 경우 필수. 카드사와 포인트 특약 맺은 부분이 있는 경우 사용. (옵션)
* @param {string} [param.join_cd] 조인코드 (옵션)
* @param {string} [param.kmotion_useyn] 국민앱카드 사용여부(Y/N) (옵션)
* @param {string} [param.cert_type] 인증타입 빈값: 일반, 0: 인증, 1: 비인증 (옵션)
* @param {string} [param.vacct_bank] 가맹점에서 사용할 가상계좌 은행 리스트. 빈값: DB조회 (옵션)
* @param {string} [param.vacct_end_date] 가상계좌 입금마감 일자 YYYYMMDD (옵션)
* @param {string} [param.vacct_end_time] 가상계좌 입금마감 시간 hh24miss (옵션)
* @param {string} [param.memb_user_no] 가맹점 고객관리번호 (옵션)
* @param {string} [param.user_type] 사용자 구분 - 1: 일반, 2: 회원 (옵션)
* @param {string} [param.user_id] 고객ID - 가맹점에서 관리하는 고객 ID (옵션)
* @param {string} [param.user_nm] 고객명 (옵션)
* @param {string} [param.user_mail] 고객 연락처1 '-' 없이 입력 (옵션)
* @param {string} [param.user_phone1] 고객 연락처1 '-' 없이 입력 (옵션)
* @param {string} [param.user_phone2] 고객 연락처2 '-' 없이 입력 (옵션)
* @param {string} [param.user_addr] 고객 주소 (옵션)
* @param {string} [param.user_define1] 예비필드1 (옵션)
* @param {string} [param.user_define2] 예비필드2 (옵션)
* @param {string} [param.user_define3] 예비필드3 (옵션)
* @param {string} [param.user_define4] 예비필드4 (옵션)
* @param {string} [param.user_define5] 예비필드5 (옵션)
* @param {string} [param.user_define6] 예비필드6 (옵션)
*/
Easypay.prototype.createPayment = function (param) {
var required = ['order_no', 'currency', 'return_url', 'product_nm', 'product_amt']
var options = {
pay_type: '',
window_type: 'iframe',
charset: 'UTF-8',
lang_flag: 'KOR',
disp_cash_yn: '',
product_type: '',
product_expr: '',
quota: '',
noinst_flag: '',
noinst_term: '',
set_point_card_yn: '',
point_card: '',
join_cd: '',
kmotion_useyn: '',
cert_type: '',
vacct_bank: '',
vacct_end_date: '',
vacct_end_time: '',
memb_user_no: '',
user_type: '',
user_id: '',
user_nm: '',
user_mail: '',
user_phone1: '',
user_phone2: '',
user_addr: '',
user_define1: '',
user_define2: '',
user_define3: '',
user_define4: '',
user_define5: '',
user_define6: ''
}
var mode = (param.mode || CONST.MODE_PC).toUpperCase()
var values = Easypay.validate(param, required, options)
// osCertFlag: 변경불가정보.
values.os_cert_flag = 2
values.mall_id = this._mall.id
values.mall_nm = this._mall.name
values.ci_url = this._mall.ci
if (mode === CONST.MODE_MOBILE) {
values.window_type = 'submit' // mobile 고정.
}
values.product_amt = Number(values.product_amt)
var data = request.normalize(values, [mode, this._mall.test ? 'TEST' : 'REAL'].join('_'))
data.mode = mode
data.response = response.defaults(mode)
return data
}
/**
* 승인요청
* @method execute
* @param {object} param
* @param {string} param.req_ip
* @param {string} param.tr_cd
* @param {string} param.order_no
* @param {string} param.encrypt_data
* @param {string} param.sessionkey
* @param {string} param.trace_no
* @param {function} cb
*/
Easypay.prototype.execute = function (param, cb) {
this._client.clearMsg()
this._client.execute(param, cb)
}
/**
* 취소 요청
* @method executeUpdate
* @param {object} param
* @param {object} param.req_ip
* @param {object} param.order_no
* @param {object} param.escrow_yn
* @param {object} param.cno
* @param {object} param.msg 취소 사유
* @param {Function} cb
*/
Easypay.prototype.executeCancel = function (param, cb) {
var mgrData = {}
if (param.escrow_yn === 'Y') {
mgrData.mgr_txtype = '61'
mgrData.mgr_subtype = 'ES02'
} else {
mgrData.mgr_txtype = '40'
}
mgrData.org_cno = param.cno
mgrData.order_no = param.order_no
mgrData.req_ip = param.req_ip
mgrData.req_id = 'MALL_R_TRANS'
mgrData.mgr_msg = param.msg || 'DB 처리 실패로 망취소'
param.tr_cd = CONST.TR_CODE_MGR
this._client.clearMsg()
this._client.setReqData('mgr_data', mgrData)
this._client.execute(param, cb)
}
Easypay.validate = function (param, required, options) {
var values = {}
for (var i = 0, length = required.length; i < length; i++) {
if (typeof param[required[i]] === 'undefined') {
throw new Error('missing parameter. (' + required[i] + ')')
}
values[required[i]] = param[required[i]]
}
if (options) {
for (var key in options) {
values[key] = param[key] || options[key]
}
}
return values
}
module.exports = {
create: function (opts) {
return new Easypay(opts)
},
parse: function (param) {
return response.normalize(param)
},
checkType: function (code) {
if (code === '00101000') {
return CONST.TYPE_PAYMENT
} else if (code === '00201000') {
return CONST.TYPE_MGR
} else {
throw new Error('invalid trans code. (' + code + ')')
}
},
CONST: CONST,
/**
* create submit html
* @method createSubmit
* @param {object} opts
* @param {string} opts.action
* @param {object} opts.param
* @param {string} [opts.method] POST (default)
*/
createSubmit: function (opts, cb) {
var data = {
action: opts.action,
param: opts.param,
method: opts.method || 'POST'
}
fs.readFile(__dirname + '/public/submit.html', 'utf-8', function (err, source) {
if (err) {
return cb(err)
}
var template = handlebars.compile(source)
cb(null, template(data))
})
}
}