var ws; var ws2; var conninfo; //status : 현재 상태 var status = 5; var sendbuf; var rtndata; String.prototype.NCbyteLength = function(){ var l=0; for(var idx = 0; idx < this.length; idx++){ var c = escape(this.charAt(idx)); if(c.length == 1) l++; else if(c.indexOf("%u") != -1) l += 3; else if(c.indexOf("%") != -1) l += c.length/3; //JDK20210205 : UTF-8기준. EUC-KR은 /2로 수정 필요. } return l; }; function NCpad(n,width) { n = n + ''; return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n; } function POSSEND(port, type, senddata, callback) { //port: 로컬 데몬 PORT, type : (PCAT -> postocat , VCAT -> NVCAT) , senddata : 거래 요청 데이터, callback : 응답 CallBack 함수 //svrport = "50001"; if(status != 5) return ; status = 0; sendbuf = make_send_data(type,senddata); conninfo = "ws://localhost:" + port + "/" + type; if ("WebSocket" in window) { ws = new WebSocket(conninfo); ws.onopen = function(event) { //연결성공 status = 1; ws_send_data(ws,sendbuf); }; ws.onerror = function(event) { //연결실패 status = 6; //callback(-1,""); return false; }; ws.onmessage = function(event) { //응답수신 status = 3; ws_disconnect(ws); parse_recv_data(event.data,callback); //callback(0,event.data); }; ws.onclose = function(event) { status = 5; //연결종료 }; } else { //브라우저가 webSocket을 지원하지 않음. return false; } } function ReqStop(port,type) { if(status != 1 && status != 2) return; port = Number(port) + 1; //Stop 포트번호 1 높음 conninfo = "ws://localhost:" + port + "/" + type; if ("WebSocket" in window) { ws2 = new WebSocket(conninfo); ws2.onopen = function(event) { //연결성공 ws_send_data(ws2,make_send_data(type,"STOP")); }; ws2.onerror = function(event) { //연결실패 return false; }; ws2.onmessage = function(event) { //응답수신 status = 3; //ws_disconnect(ws2); //parse_recv_data(event.data,callback); //callback(0,event.data); }; ws2.onclose = function(event) { ws_disconnect(ws2); status = 6; //연결종료 }; } else { //브라우저가 webSocket을 지원하지 않음. return false; } } function ws_disconnect(aws) { status = 4; aws.close(); } function ws_send_data(aws,sendbuf) { status = 2; aws.send(sendbuf); return false; } function make_send_data(type, senddata) { var m_sendmsg; var m_totlen; var m_bodylen; m_bodylen = senddata.NCbyteLength(); m_totlen = 12 + m_bodylen; return NCpad(m_totlen,4) + type + " " + NCpad(m_bodylen,4) + senddata; } function parse_recv_data(recvdata, callback) { var rtndata; var bodylen; bodylen = recvdata.substr(12,4); if(recvdata.substr(8,4) != "0000") { //오류코드 매핑!! /* //NVCAT 1 : 정상 -1 : NVCAT 실행 중이 아님 -2 : 거래금액이 존재하지 않음 -3 : 환경정보 읽기 실패 -4 : NVCAT 연동오류 실패 -5 : 기타 응답데이터 오류 -6 : 카드리딩 타임아웃 -7 : 사용자 및 리더기 취소 -8 : FALLBACK 거래요청 -9 : 기타오류 -10 :IC우선거래 요청 -11 : FALLBACK 거래 아님 -12 : 거래불가카드 -13 : 서명요청 오류 -14 : 요청 전문 데이터 오류 -15 : 카드리더 Port Open 오류 //PCAT 1 : 정상 -1 : 포트 오픈 실패 -2 : 포트 이미 오픈된 상태 -3 : ACK 수신 실패 (단말기 연결 실패) -4 : LRC오류 OR 종료버튼 -14 : 요청 전문 데이터 오류 */ var errcd; errcd = recvdata.substr(8,4) * -1 callback(errcd,""); }else { callback(1,recvdata.substr(16,bodylen)); } }