diff --git a/adm/config_form.php b/adm/config_form.php index 5bc7bccea..8629cd087 100644 --- a/adm/config_form.php +++ b/adm/config_form.php @@ -271,6 +271,13 @@ if(!isset($member['mb_scrap_cnt'])) { ADD `mb_scrap_cnt` int(11) NOT NULL DEFAULT '0' AFTER `mb_memo_cnt`", true); } +// 아이코드 토큰키 추가 +if( ! isset($config['cf_icode_token_key']) ){ + $sql = "ALTER TABLE `{$g5['config_table']}` + ADD COLUMN `cf_icode_token_key` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_icode_server_port`; "; + sql_query($sql, false); +} + if(!$config['cf_faq_skin']) $config['cf_faq_skin'] = "basic"; if(!$config['cf_mobile_faq_skin']) $config['cf_mobile_faq_skin'] = "basic"; @@ -1257,29 +1264,29 @@ include_once('_rewrite_config_form.php'); - LMS로 선택하시면 90바이트 이하는 SMS로, 그 이상은 1500바이트까지 LMS로 전송됩니다.
요금은 건당 SMS는 16원, LMS는 48원입니다."); ?> + LMS로 선택하시면 90바이트 이하는 SMS로, 그 이상은 ".G5_ICODE_LMS_MAX_LENGTH."바이트까지 LMS로 전송됩니다.
요금은 건당 SMS는 16원, LMS는 48원입니다."); ?> - - + + - - + + - - 요금제 + + 요금제
(구버전) - - 아이코드 SMS 신청
회원가입 - - 아이코드 회원가입 - - - - - 충전 잔액 + + + 충전 잔액
(구버전) 원. 충전하기 + + + + SMS 전송유형을 LMS로 설정시 90바이트 이내는 SMS, 90 ~ 2000 바이트는 LMS 그 이상은 절삭 되어 LMS로 발송됩니다."); ?> + + 토큰키관리 메뉴에서 생성한 토큰키를 입력합니다."); ?> +
+ 서버아이피 : + + + + 아이코드 SMS 신청
회원가입 + + 아이코드 회원가입 + + diff --git a/adm/config_form_update.php b/adm/config_form_update.php index 731b664c5..250fc9082 100644 --- a/adm/config_form_update.php +++ b/adm/config_form_update.php @@ -36,6 +36,8 @@ foreach( $check_keys as $key ){ } } +$_POST['cf_icode_server_port'] = isset($_POST['cf_icode_server_port']) ? preg_replace('/[^0-9]/', '', $_POST['cf_icode_server_port']) : '7295'; + $sql = " update {$g5['config_table']} set cf_title = '{$_POST['cf_title']}', cf_admin = '{$_POST['cf_admin']}', @@ -143,6 +145,7 @@ $sql = " update {$g5['config_table']} cf_sms_type = '{$_POST['cf_sms_type']}', cf_icode_id = '{$_POST['cf_icode_id']}', cf_icode_pw = '{$_POST['cf_icode_pw']}', + cf_icode_token_key = '{$_POST['cf_icode_token_key']}', cf_icode_server_ip = '{$_POST['cf_icode_server_ip']}', cf_icode_server_port = '{$_POST['cf_icode_server_port']}', cf_googl_shorturl_apikey = '{$_POST['cf_googl_shorturl_apikey']}', diff --git a/adm/css/admin.css b/adm/css/admin.css index ae55bacc2..1f16bacdd 100644 --- a/adm/css/admin.css +++ b/adm/css/admin.css @@ -528,6 +528,10 @@ td.td_grpset {width:160px;border-left:1px solid #e9ecee;text-align:center} .is_rewrite .info-success{color:#155724} .is_rewrite .info-warning{color:#856404} +.icode_old_version th{background-color:#FFFCED} +.icode_json_version th{background-color:#F6F1FF} +.cf_tr_hide {display:none} + /* 관리권한설정 */ #add_admin fieldset {margin-top:20px;overflow:auto;padding:2px 6px;line-height:1.4;resize:vertical} diff --git a/adm/sms_admin/config.php b/adm/sms_admin/config.php index 5eb96e1a9..a8e89543e 100644 --- a/adm/sms_admin/config.php +++ b/adm/sms_admin/config.php @@ -9,6 +9,14 @@ $g5['title'] = "SMS 기본설정"; if (!$config['cf_icode_server_ip']) $config['cf_icode_server_ip'] = '211.172.232.124'; if (!$config['cf_icode_server_port']) $config['cf_icode_server_port'] = '7295'; +// 아이코드 토큰키 추가 +if( ! isset($config['cf_icode_token_key']) ){ + $sql = "ALTER TABLE `{$g5['config_table']}` + ADD COLUMN `cf_icode_token_key` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_icode_server_port`; "; + sql_query($sql, false); + $config['cf_icode_token_key'] = ''; +} + if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) { $userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']); @@ -23,7 +31,7 @@ if (!$sms5['cf_skin']) include_once(G5_ADMIN_PATH.'/admin.head.php'); ?> - +

SMS 기능을 사용하시려면 먼저 아이코드에 서비스 신청을 하셔야 합니다.
@@ -47,22 +55,31 @@ if ($config['cf_sms_use'] == 'icode') { // 아이코드 사용 - + + + LMS로 선택하시면 90바이트 이하는 SMS로, 그 이상은 ".G5_ICODE_LMS_MAX_LENGTH."바이트까지 LMS로 전송됩니다.
요금은 건당 SMS는 16원, LMS는 48원입니다."); ?> + + + + + - + - - + + - - 현재 비밀번호가 입력되어 있지 않습니다. + - - 요금제 + + 요금제
(구버전) '; } else { - echo '가입해주세요.'; echo ''; } ?> - - 충전 잔액 + + 충전 잔액
(구버전) 충전하기 + + + + SMS 전송유형을 LMS로 설정시 90바이트 이내는 SMS, 90 ~ 2000 바이트는 LMS 그 이상은 절삭 되어 LMS로 발송됩니다."); ?> + + 토큰키관리 메뉴에서 생성한 토큰키를 입력합니다."); ?> +
+ 서버아이피 : + + diff --git a/adm/sms_admin/config_update.php b/adm/sms_admin/config_update.php index 3d9b57e03..236d56e74 100644 --- a/adm/sms_admin/config_update.php +++ b/adm/sms_admin/config_update.php @@ -15,6 +15,7 @@ if(!check_vaild_callback($cf_phone)) alert('회신번호가 올바르지 않습니다.'); $userinfo = get_icode_userinfo($cf_icode_id, $cf_icode_pw); +$cf_icode_server_port = isset($cf_icode_server_port) ? preg_replace('/[^0-9]/', '', $cf_icode_server_port) : '7295'; if ($userinfo['code'] == '202') alert('아이코드 아이디와 패스워드가 맞지 않습니다.'); @@ -33,10 +34,12 @@ sql_query($sql); // 아이코드 설정 $sql = " update {$g5['config_table']} set cf_sms_use = '$cf_sms_use', + cf_sms_type = '$cf_sms_type', cf_icode_id = '$cf_icode_id', cf_icode_pw = '$cf_icode_pw', cf_icode_server_ip = '$cf_icode_server_ip', - cf_icode_server_port = '$cf_icode_server_port' "; + cf_icode_server_port = '$cf_icode_server_port', + cf_icode_token_key = '$cf_icode_token_key'"; sql_query($sql); goto_url("./config.php"); diff --git a/adm/sms_admin/css/sms5.css b/adm/sms_admin/css/sms5.css index b5c09d1c4..03187e7ea 100644 --- a/adm/sms_admin/css/sms5.css +++ b/adm/sms_admin/css/sms5.css @@ -22,6 +22,7 @@ .sms5_box {position:relative;padding:10px;border-radius:5px;background:#fbec99} .sms5_box .box_ico {position:absolute;top:20px;left:-7px;width:7px;height:13px;background:url('../img/box_ico.gif') no-repeat} .sms5_box .box_txt {border:0;background:transparent;word-break:break-all;resize:none;overflow:hidden} +.sms5_box textarea.box_txt.is_overview{overflow:visible;min-height:130px} .sms5_box .box_square {width:100px;height:90px} #write_wrap {z-index:9} diff --git a/adm/sms_admin/history_send.php b/adm/sms_admin/history_send.php index 109dfcc41..9b4f29600 100644 --- a/adm/sms_admin/history_send.php +++ b/adm/sms_admin/history_send.php @@ -224,8 +224,8 @@ if($config['cf_sms_type'] == 'LMS') { ?> &st=&sv=&wr_no=&wr_renum='; @@ -104,7 +104,7 @@ function all_send()

- +
diff --git a/adm/sms_admin/sms5.sql b/adm/sms_admin/sms5.sql index 652872219..96bb7b1a4 100644 --- a/adm/sms_admin/sms5.sql +++ b/adm/sms_admin/sms5.sql @@ -149,7 +149,7 @@ CREATE TABLE `{$g5['sms5_write_table']}` ( `wr_no` int(11) NOT NULL default '1', `wr_renum` int(11) NOT NULL default '0', `wr_reply` varchar(255) NOT NULL default '', - `wr_message` varchar(255) NOT NULL default '', + `wr_message` text NOT NULL, `wr_booking` datetime NOT NULL default '0000-00-00 00:00:00', `wr_total` int(11) NOT NULL default '0', `wr_re_total` int(11) NOT NULL default '0', diff --git a/adm/sms_admin/sms_write.php b/adm/sms_admin/sms_write.php index 4654a3a6d..77754a97c 100644 --- a/adm/sms_admin/sms_write.php +++ b/adm/sms_admin/sms_write.php @@ -266,8 +266,8 @@ function sms5_chk_send(f) w = document.body.clientWidth/2 - 200; h = document.body.clientHeight/2 - 100; - act = window.open('sms_ing.php', 'act', 'width=300, height=200, left=' + w + ', top=' + h); - act.focus(); + //act = window.open('sms_ing.php', 'act', 'width=300, height=200, left=' + w + ', top=' + h); + //act.focus(); f.send_list.value = list; return true; @@ -407,6 +407,7 @@ function byte_check(wr_message, sms_bytes) var conts = document.getElementById(wr_message); var bytes = document.getElementById(sms_bytes); var max_bytes = document.getElementById("sms_max_bytes"); + var lms_max_length = var i = 0; var cnt = 0; @@ -427,14 +428,14 @@ function byte_check(wr_message, sms_bytes) if(cnt > 90) - max_bytes.innerHTML = 1500; + max_bytes.innerHTML = lms_max_length; else max_bytes.innerHTML = 90; - if (cnt > 1500) + if (cnt > lms_max_length) { - exceed = cnt - 1500; - alert('메시지 내용은 1500바이트를 넘을수 없습니다.\n\n작성하신 메세지 내용은 '+ exceed +'byte가 초과되었습니다.\n\n초과된 부분은 자동으로 삭제됩니다.'); + exceed = cnt - lms_max_length; + alert('메시지 내용은 '+ lms_max_length +'바이트를 넘을수 없습니다.\n\n작성하신 메세지 내용은 '+ exceed +'byte가 초과되었습니다.\n\n초과된 부분은 자동으로 삭제됩니다.'); var tcnt = 0; var xcnt = 0; var tmp = conts.value; @@ -447,7 +448,7 @@ function byte_check(wr_message, sms_bytes) tcnt += 1; } - if (tcnt > 1500) { + if (tcnt > lms_max_length) { tmp = tmp.substring(0,i); break; } else { diff --git a/adm/sms_admin/sms_write_send.php b/adm/sms_admin/sms_write_send.php index c7ec11030..e88bdae46 100644 --- a/adm/sms_admin/sms_write_send.php +++ b/adm/sms_admin/sms_write_send.php @@ -6,8 +6,24 @@ auth_check($auth[$sub_menu], "w"); check_admin_token(); +$result = sql_query("describe `{$g5['sms5_write_table']}`"); +while ($row = sql_fetch_array($result)){ + if( $row['Field'] === 'wr_message' && $row['Type'] === 'varchar(255)' ){ + sql_query("ALTER TABLE `{$g5['sms5_write_table']}` MODIFY wr_message TEXT NOT NULL;", false); + break; + } +} + $g5['title'] = "문자전송중"; +if ($config['cf_sms_use'] != 'icode') { + alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.'); +} + +if ( ! (($config['cf_icode_id'] && $config['cf_icode_pw']) || $config['cf_icode_token_key']) ) { + alert('아이코드 설정값이 존재하지 않습니다.'); +} + $wr_reply = preg_replace('#[^0-9\-]#', '', trim($wr_reply)); $wr_message = clean_xss_tags(trim($wr_message)); @@ -94,12 +110,12 @@ while ($row = array_shift($send_list)) $hp = get_hp($item[$i][1], 0); $name = $item[$i][0]; - if(!$hp) continue; + if(!$hp) continue 2; if ($wr_overlap && array_overlap($hps, $hp)) { $overlap++; array_push( $duplicate_data['hp'], $row['bk_hp'] ); - continue; + continue 2; } array_push($list, array('bk_hp' => $hp, 'bk_name' => $name)); @@ -111,12 +127,12 @@ while ($row = array_shift($send_list)) $row = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$item[$i]'"); $row['bk_hp'] = get_hp($row['bk_hp'], 0); - if(!$row['bk_hp']) continue; + if(!$row['bk_hp']) continue 2; if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) { $overlap++; array_push( $duplicate_data['hp'], $row['bk_hp'] ); - continue; + continue 2; } array_push($list, $row); array_push($hps, $row['bk_hp']); @@ -141,14 +157,11 @@ if ($wr_by && $wr_bm && $wr_bd && $wr_bh && $wr_bi) { $booking = ''; } -if ($config['cf_sms_use'] != 'icode') { - alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.'); -} - include_once(G5_ADMIN_PATH.'/admin.head.php'); $reply = str_replace('-', '', trim($wr_reply)); -$wr_message = conv_unescape_nl($wr_message); +$db_wr_message = conv_unescape_nl($wr_message); +$wr_message = conv_unescape_nl(stripslashes($wr_message)); $SMS = new SMS5; @@ -186,7 +199,7 @@ if($config['cf_sms_type'] == 'LMS') { if($result) { $result = $SMS->Send(); - + if ($result) //SMS 서버에 접속했습니다. { foreach ($SMS->Result as $result) @@ -242,7 +255,7 @@ if($config['cf_sms_type'] == 'LMS') { } } - sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$wr_message', wr_success='$wr_success', wr_failure='$wr_failure', wr_memo='$str_serialize', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'"); + sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$db_wr_message', wr_success='$wr_success', wr_failure='$wr_failure', wr_memo='$str_serialize', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'"); } } else { $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); @@ -260,7 +273,7 @@ if($config['cf_sms_type'] == 'LMS') { else $wr_no = 1; - sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$wr_message', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'"); + sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$db_wr_message', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'"); $wr_success = 0; $wr_failure = 0; @@ -324,11 +337,16 @@ if($config['cf_sms_type'] == 'LMS') { function win_close_alert($msg) { - $html = ""; + $html = ""; echo $html; exit; @@ -336,8 +354,8 @@ function win_close_alert($msg) { ?> = $minimum_coin) + $is_sms_send = true; + } + } + } + + return $is_sms_send; +} + function is_use_email_certify(){ global $config; diff --git a/lib/icode.lms.lib.php b/lib/icode.lms.lib.php index f7bb6f361..0da41bdb0 100644 --- a/lib/icode.lms.lib.php +++ b/lib/icode.lms.lib.php @@ -4,12 +4,19 @@ if (!defined('_GNUBOARD_')) exit; // 요금제에 따른 port 구분 function get_icode_port_type($id, $pw) { + global $config; + + // 토큰키를 사용한다면 true 로 리턴 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] ){ + return 1; + } + $userinfo = get_icode_userinfo($id, $pw); if($userinfo['payment'] == 'A') { // 충전제 return 1; } else if($userinfo['payment'] == 'C') { // 정액제 - return 1; + return 2; } else { return false; } @@ -28,10 +35,21 @@ class LMS { var $socket_portcode; var $Data = array(); var $Result = array(); + var $icode_key; // SMS 서버 접속 function SMS_con($host, $id, $pw, $portcode) { - $this->socket_host = $host; + global $config; + + // 토큰키를 사용한다면 + if(isset($config['cf_icode_token_key']) && $config['cf_icode_token_key']){ + $this->icode_key = $config['cf_icode_token_key']; + $this->socket_host = ICODE_JSON_SOCKET_HOST; + $this->socket_port = ICODE_JSON_SOCKET_PORT; + } else { + $this->socket_host = $host; + } + $this->socket_portcode = $portcode; $this->icode_id = FillSpace($id, 10); $this->icode_pw = FillSpace($pw, 10); @@ -43,32 +61,63 @@ class LMS { } function Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate="", $nCount) { + global $config; // 문자 타입별 Port 설정. $sendType = strlen($strData) > 90 ? 1 : 0; // 0: SMS / 1: LMS - /* 개발 완료 후 아래 포트를 rand 함수를 이용하는 라인으로 변경 바랍니다.*/ + // 토큰키를 사용한다면 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){ + + // 개행치환 + $strData = preg_replace("/\r\n/","\n",$strData); + $strData = preg_replace("/\r/","\n",$strData); - // 충전식 - if ($this->socket_portcode == 1) { - if($sendType && $sendType == 1) { - //$this->socket_port = 8200; // LMS - $this->socket_port=(int)rand(8200,8201); // LMS - } else { - //$this->socket_port = 6295; // SMS - $this->socket_port=(int)rand(6295,6297); // SMS - } - } - // 정액제 - else { - if($sendType && $sendType == 1) { - //$this->socket_port = 8300; // LMS - $this->socket_port=(int)rand(8300,8301); // LMS - } else { - //$this->socket_port = 6291; // SMS - $this->socket_port=(int)rand(6291,6293); // SMS - } - } + $checks = array('msg'=>$strData, 'subject'=>$strSubject); + $tmps = array(); + + foreach( $checks as $k=>$v ){ + + // 문자 내용이 euc-kr 인지 체크합니다. + $enc = mb_detect_encoding($v, array('EUC-KR', 'UTF-8')); + + // 문자 내용이 euc-kr 이면 json_encode 에서 깨지기 때문에 utf-8 로 변환합니다. + $tmps[$k] = ($enc === 'EUC-KR') ? iconv_utf8($v) : $v; + } + + $strData = $tmps['msg']; + $strSubject = $tmps['subject']; + + // 문자 타입별 Port 설정. + $sendType = strlen($strData)>90 ? 1 : 0; // 0: SMS / 1: LMS + if($sendType==0) $strSubject = ""; + + $is_use_json = true; + + } else { + /* 개발 완료 후 아래 포트를 rand 함수를 이용하는 라인으로 변경 바랍니다.*/ + + // 충전식 + if ($this->socket_portcode == 1) { + if($sendType && $sendType == 1) { + //$this->socket_port = 8200; // LMS + $this->socket_port=(int)rand(8200,8201); // LMS + } else { + //$this->socket_port = 6295; // SMS + $this->socket_port=(int)rand(6295,6297); // SMS + } + } + // 정액제 + else { + if($sendType && $sendType == 1) { + //$this->socket_port = 8300; // LMS + $this->socket_port=(int)rand(8300,8301); // LMS + } else { + //$this->socket_port = 6291; // SMS + $this->socket_port=(int)rand(6291,6293); // SMS + } + } + } $strCallBack = FillSpace($strCallBack, 11); // 회신번호 $strDate = FillSpace($strDate, 12); // 즉시(12byte 공백), 예약전송(YmdHi) @@ -88,9 +137,9 @@ class LMS { $strSubject = str_replace(">", "]", $strSubject); $strSubject = FillSpace($strSubject,30); - $strData = FillSpace(CutChar($strData,1500),1500); + $strData = $is_use_json ? CutCharUtf8($strData, G5_ICODE_JSON_MAX_LENGTH) : FillSpace(CutChar($strData, G5_ICODE_LMS_MAX_LENGTH), G5_ICODE_LMS_MAX_LENGTH); } else if (!$strURL) { - $strData = FillSpace(CutChar($strData,90),90); + $strData = $is_use_json ? CutCharUtf8($strData, G5_ICODE_JSON_MAX_LENGTH) : FillSpace(CutChar($strData,90),90); $strCaller = FillSpace($strCaller,10); } else { $strURL = FillSpace($strURL,50); @@ -102,39 +151,85 @@ class LMS { for ($i=0; $i<$nCount; $i++) { - $strDest[$i] = FillSpace($strDest[$i],11); - if ($sendType && $sendType == 1) { - $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strSubject.$strDate.$strData; - } else if (!$strURL) { - $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData; - } else { - $strData = FillSpace(CheckCallCenter($strURL, $strDest[$i], $strData),80); - $this->Data[$i] = '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData; - } + if($is_use_json) { + $strDest[$i] = $strDest[$i]; + $list = array( + "key" => $this->icode_key, + "tel" => $strDest[$i], + "cb" => $strCallBack, + "msg" => $strData, + "title" => $strSubject?$strSubject:"", + "date" => $strDate?$strDate:"" + ); + $packet = json_encode($list); + + if( !$packet ){ // json_encode가 잘못되었으면 보내지 않습니다. + continue; + } + $this->Data[$i] = '06'.str_pad(strlen($packet), 4, "0", STR_PAD_LEFT).$packet; + } else { + $strDest[$i] = FillSpace($strDest[$i],11); + if ($sendType && $sendType == 1) { + $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strSubject.$strDate.$strData; + } else if (!$strURL) { + $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData; + } else { + $strData = FillSpace(CheckCallCenter($strURL, $strDest[$i], $strData),80); + $this->Data[$i] = '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData; + } + } } return true; } function Send() { - $fsocket = fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2); - if (!$fsocket) return false; - set_time_limit(60); + global $config; - foreach($this->Data as $puts) { - fputs($fsocket, $puts); - while(!$gets) { $gets = fgets($fsocket,30); } - $dest = substr($puts,26,11); - if (substr($gets,0,19) == "0223 00".$dest) { - $this->Result[] = $dest.":".substr($gets,19,10); - } else { - $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; - } - $gets = ""; - } + // 토큰키를 사용한다면 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){ + $fsocket = @fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2); + if (!$fsocket) return false; + set_time_limit(300); - fclose($fsocket); - $this->Data = ""; + foreach($this->Data as $puts) { + fputs($fsocket, $puts); + while(!$gets) { $gets = fgets($fsocket,32); } + $json = json_decode(substr($puts,6), true); + + $dest = $json["tel"]; + if (substr($gets,0,20) == "0225 00".FillSpace($dest,12)) { + $this->Result[] = $dest.":".substr($gets,20,11); + + } else { + $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; + if(substr($gets,6,2) >= "80") break; + } + $gets = ""; + } + + fclose($fsocket); + } else { + $fsocket = @fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2); + if (!$fsocket) return false; + set_time_limit(300); + + foreach($this->Data as $puts) { + fputs($fsocket, $puts); + while(!$gets) { $gets = fgets($fsocket,30); } + $dest = substr($puts,26,11); + if (substr($gets,0,19) == "0223 00".$dest) { + $this->Result[] = $dest.":".substr($gets,19,10); + } else { + $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; + } + $gets = ""; + } + + fclose($fsocket); + } + + $this->Data = array(); return true; } } @@ -168,6 +263,24 @@ function CutChar($word, $cut) { return $word; } +function CutCharUtf8($word, $cut) { + preg_match_all('/[\xE0-\xFF][\x80-\xFF]{2}|./', $word, $match); // target for BMP + + $m = $match[0]; + $slen = strlen($word); // length of source string + if ($slen <= $cut) return $word; + + $ret = array(); + $count = 0; + for ($i=0; $i < $cut; $i++) { + $count += (strlen($m[$i]) > 1)?2:1; + if ($count > $cut) break; + $ret[] = $m[$i]; + } + + return join('', $ret); +} + /** * 수신번호의 값이 정확한 값인지 확인합니다. * @@ -183,7 +296,6 @@ function CheckCommonTypeDest($strDest, $nCount) { } } - /** * 회신번호 유효성 여부조회 * * @param string callback 회신번호 diff --git a/lib/icode.sms.lib.php b/lib/icode.sms.lib.php index a3bee6613..6201f0081 100644 --- a/lib/icode.sms.lib.php +++ b/lib/icode.sms.lib.php @@ -44,8 +44,20 @@ class SMS { var $SMS_Port; var $Data = array(); var $Result = array(); + var $icode_key; + var $socket_port; + var $socket_host; function SMS_con($sms_server,$sms_id,$sms_pw,$port) { + global $config; + + // 토큰키를 사용한다면 + if(isset($config['cf_icode_token_key']) && $config['cf_icode_token_key']){ + $this->icode_key = $config['cf_icode_token_key']; + $this->socket_host = ICODE_JSON_SOCKET_HOST; + $this->socket_port = ICODE_JSON_SOCKET_PORT; + } + $this->ID=$sms_id; // 계약 후 지정 $this->PWD=$sms_pw; // 계약 후 지정 $this->SMS_Server=$sms_server; @@ -60,25 +72,82 @@ class SMS { } function Add($dest, $callBack, $Caller, $msg, $rsvTime="") { - global $g5; + global $g5, $config; - // 내용 검사 1 - $Error = CheckCommonType($dest, $rsvTime); - if ($Error) return $Error; - // 내용 검사 2 - //if ( eregi("[^0-9]",$callBack) ) return "회신 전화번호가 잘못되었습니다"; - if ( preg_match("/[^0-9]/i",$callBack) ) return "회신 전화번호가 잘못되었습니다"; + // 토큰키를 사용한다면 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){ - $msg=cut_char($msg,80); // 80자 제한 - // 보낼 내용을 배열에 집어넣기 - $dest = spacing($dest,11); - $callBack = spacing($callBack,11); - $Caller = spacing($Caller,10); - $rsvTime = spacing($rsvTime,12); - $msg = spacing($msg,80); + // 내용 검사 1 + $Error = CheckCommonType($dest, $rsvTime); + if ($Error) return $Error; + if ( preg_match("/[^0-9]/i",$callBack) ) return "회신 전화번호가 잘못되었습니다"; - $this->Data[] = '01144 '.$this->ID.$this->PWD.$dest.$callBack.$Caller.$rsvTime.$msg; - return ""; + // 개행치환 + $msg = preg_replace("/\r\n/", "\n", $msg); + $msg = preg_replace("/\r/", "\n", $msg); + // 90byte 이내는 SMS, 90 ~ 2000 byte 는 LMS 그 이상은 절삭 되어 LMS로 발송 + // SMS 이기 때문에 90byte 이내로 합니다. + $msg=cut_char($msg, 90); + $msg = spacing($msg, 90); + + // 한글 깨진것이 있는지 체크합니다. + if( preg_match('/^([\x00-\x7e]|.{2})*/', $msg, $z) ){ + $msg = $z[0]; + } + + // 문자 내용이 euc-kr 인지 체크합니다. + $enc = mb_detect_encoding($msg, array('EUC-KR', 'UTF-8')); + + // 문자 내용이 euc-kr 이면 json_encode 에서 깨지기 때문에 utf-8 로 변환합니다. + if($enc === 'EUC-KR'){ + $msg = iconv_utf8($msg); + } + + // 보낼 내용을 배열에 집어넣기 + $dest = spacing($dest,11); + $callBack = spacing($callBack,11); + $Caller = spacing($Caller,10); + $rsvTime = $rsvTime ? spacing($rsvTime,12) : ''; + + $list = array( + "key" => $this->icode_key, + "tel" => $dest, + "cb" => $callBack, + "msg" => $msg, + "title" => "", //SMS 의 경우 타이틀을 지정할수 없습니다. + "date" => $rsvTime + ); + + $packet = json_encode($list); + + if( !$packet ){ // json_encode가 잘못되었으면 보내지 않습니다. + return "json_encode error"; + } + $this->Data[] = '06'.str_pad(strlen($packet), 4, "0", STR_PAD_LEFT).$packet; + + return ''; + + } else { + // 기존 OLD SMS + + // 내용 검사 1 + $Error = CheckCommonType($dest, $rsvTime); + if ($Error) return $Error; + // 내용 검사 2 + //if ( eregi("[^0-9]",$callBack) ) return "회신 전화번호가 잘못되었습니다"; + if ( preg_match("/[^0-9]/i",$callBack) ) return "회신 전화번호가 잘못되었습니다"; + + $msg=cut_char($msg,80); // 80자 제한 + // 보낼 내용을 배열에 집어넣기 + $dest = spacing($dest,11); + $callBack = spacing($callBack,11); + $Caller = spacing($Caller,10); + $rsvTime = spacing($rsvTime,12); + $msg = spacing($msg,80); + + $this->Data[] = '01144 '.$this->ID.$this->PWD.$dest.$callBack.$Caller.$rsvTime.$msg; + return ""; + } } function AddURL($dest, $callBack, $URL, $msg, $rsvTime="") { @@ -121,26 +190,53 @@ class SMS { return ""; } - function Send () { - $fp=@fsockopen(trim($this->SMS_Server),trim($this->SMS_Port), $errno, $errstr, 2); - if (!$fp) return false; - set_time_limit(60); + function Send() { + global $config; - ## php4.3.10일경우 - ## zend 최신버전으로 업해주세요.. - ## 또는 122번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요. + // 토큰키를 사용한다면 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){ + $fsocket = @fsockopen(trim($this->socket_host),trim($this->socket_port), $errno, $errstr, 2); + if (!$fsocket) return false; + set_time_limit(300); - foreach($this->Data as $puts) { - $dest = substr($puts,26,11); - fputs($fp,$puts); - while(!$gets) { $gets=fgets($fp,30); } - if (substr($gets,0,19)=="0223 00".$dest) $this->Result[]=$dest.":".substr($gets,19,10); - else $this->Result[$dest]=$dest.":Error"; - $gets=""; - } - fclose($fp); - $this->Data=""; - return true; + foreach($this->Data as $puts) { + fputs($fsocket, $puts); + while(!$gets) { $gets = fgets($fsocket,32); } + $json = json_decode(substr($puts,6), true); + + $dest = $json["tel"]; + if (substr($gets,0,20) == "0225 00".spacing($dest,12)) { + $this->Result[] = $dest.":".substr($gets,20,11); + + } else { + $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; + if(substr($gets,6,2) >= "80") break; + } + $gets = ""; + } + fclose($fsocket); + + } else { + + $fp=@fsockopen(trim($this->SMS_Server),trim($this->SMS_Port)); + if (!$fp) return false; + set_time_limit(300); + + ## php4.3.10일경우 + ## zend 최신버전으로 업해주세요.. + ## 또는 122번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요. + + foreach($this->Data as $puts) { + $dest = substr($puts,26,11); + fputs($fp,$puts); + while(!$gets) { $gets=fgets($fp,30); } + if (substr($gets,0,19)=="0223 00".$dest) $this->Result[]=$dest.":".substr($gets,19,10); + else $this->Result[$dest]=$dest.":Error"; + $gets=""; + } + fclose($fp); + } + $this->Data=array(); } } ?> \ No newline at end of file diff --git a/plugin/sms5/sms5.lib.php b/plugin/sms5/sms5.lib.php index da8f530e1..2614223aa 100644 --- a/plugin/sms5/sms5.lib.php +++ b/plugin/sms5/sms5.lib.php @@ -155,96 +155,15 @@ if($config['cf_sms_type'] == 'LMS') { var $Result = array(); var $Log = array(); - // SMS 서버 접속 - function SMS_con($host, $id, $pw, $portcode) { - $this->socket_host = $host; - $this->socket_portcode = $portcode; - $this->icode_id = FillSpace($id, 10); - $this->icode_pw = FillSpace($pw, 10); - } - - function Init() { - $this->Data = array(); // 발송하기 위한 패킷내용이 배열로 들어간다. - $this->Result = array(); // 발송결과값이 배열로 들어간다. - } - function Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate="", $nCount) { // EUC-KR로 변환 $strCaller = iconv_euckr($strCaller); $strSubject = iconv_euckr($strSubject); $strData = iconv_euckr($strData); - // 문자 타입별 Port 설정. - $sendType = strlen($strData) > 90 ? 1 : 0; // 0: SMS / 1: LMS - - /* 개발 완료 후 아래 포트를 rand 함수를 이용하는 라인으로 변경 바랍니다.*/ - - // 충전식 - if ($this->socket_portcode == 1) { - if($sendType && $sendType == 1) { - //$this->socket_port = 8200; // LMS - $this->socket_port=(int)rand(8200,8201); // LMS - } else { - //$this->socket_port = 6295; // SMS - $this->socket_port=(int)rand(6295,6297); // SMS - } - } - // 정액제 - else { - if($sendType && $sendType == 1) { - //$this->socket_port = 8300; // LMS - $this->socket_port=(int)rand(8300,8301); // LMS - } else { - //$this->socket_port = 6291; // SMS - $this->socket_port=(int)rand(6291,6293); // SMS - } - } - - $strCallBack = FillSpace($strCallBack, 11); // 회신번호 - $strDate = FillSpace($strDate, 12); // 즉시(12byte 공백), 예약전송(YmdHi) - - if ($sendType && $sendType == 1) { - - /** LMS 제목 **/ - /* - 제목필드의 값이 없을 경우 단말기 기종및 설정에 따라 표기 방법이 다름 - 1.설정에서 제목필드보기 설정 Disable -> 제목필드값을 넣어도 미표기 - 2.설정에서 제목필드보기 설정 Enable -> 제목을 넣지 않을 경우 제목없음으로 자동표시 - - 제목의 첫글자에 "<",">", 개행문자가 있을경우 단말기종류 및 통신사에 따라 메세지 전송실패 -> 글자를 체크하거나 취환처리요망 - */ - $strSubject = str_replace("\r\n", " ", $strSubject); - $strSubject = str_replace("<", "[", $strSubject); - $strSubject = str_replace(">", "]", $strSubject); - - $strSubject = FillSpace($strSubject,30); - $strData = FillSpace(CutChar($strData,1500),1500); - } else if (!$strURL) { - $strData = FillSpace(CutChar($strData,90),90); - $strCaller = FillSpace($strCaller,10); - } else { - $strURL = FillSpace($strURL,50); - } - - $Error = CheckCommonTypeDest($strDest, $nCount); - $Error = is_vaild_callback($strCallBack); - $Error = CheckCommonTypeDate($strDate); - - for ($i=0; $i<$nCount; $i++) { - $strDest[$i] = FillSpace($strDest[$i],11); - if ($sendType && $sendType == 1) { - $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strSubject.$strDate.$strData; - } else if (!$strURL) { - $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData; - } else { - $strData = FillSpace(CheckCallCenter($strURL, $strDest[$i], $strData),80); - $this->Data[$i] = '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData; - } - } - return true; + return parent::Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount); } - function Send() { global $g5; @@ -265,27 +184,7 @@ if($config['cf_sms_type'] == 'LMS') { exit; } - $fsocket = fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2); - if (!$fsocket) return false; - set_time_limit(60); - - foreach($this->Data as $puts) { - fputs($fsocket, $puts); - while(!$gets) { $gets = fgets($fsocket,30); } - $dest = substr($puts,26,11); - if (substr($gets,0,19) == "0223 00".$dest) { - $this->Result[] = $dest.":".substr($gets,19,10); - $this->Log[] = $puts; - } else { - $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; - $this->Log[] = $puts; - } - $gets = ""; - } - - fclose($fsocket); - $this->Data = array(); - return true; + return parent::Send(); } } } else { @@ -294,15 +193,6 @@ if($config['cf_sms_type'] == 'LMS') { class SMS5 extends SMS { var $Log = array(); - function SMS_con($sms_server,$sms_id,$sms_pw,$port) { - $this->ID=$sms_id; // 계약 후 지정 - $this->PWD=$sms_pw; // 계약 후 지정 - $this->SMS_Server=$sms_server; - $this->SMS_Port=$port; - $this->ID = spacing($this->ID,10); - $this->PWD = spacing($this->PWD,10); - } - /** * 발송번호의 값이 정확한 값인지 확인합니다. * @@ -380,7 +270,7 @@ if($config['cf_sms_type'] == 'LMS') { } } function Add2($strDest, $strCallBack, $strCaller, $strURL, $strMessage, $strDate="", $nCount) { - global $g5; + global $g5, $config; $Error = $this->CheckCommonTypeDest($strDest, $nCount); $Error = $this->CheckCommonTypeCallBack($strCallBack); @@ -390,32 +280,91 @@ if($config['cf_sms_type'] == 'LMS') { $strCaller = spacing($strCaller,10); $strDate = spacing($strDate,12); + // 토큰키를 사용한다면 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){ - for ($i=0; $i<$nCount; $i++) { - $hp_number = spacing($strDest[$i]['bk_hp'],11); - $strData = $strMessage; - if( !empty($strDest[$i]['bk_name']) ){ - $strData = str_replace("{이름}", $strDest[$i]['bk_name'], $strData); + for ($i=0; $i<$nCount; $i++) { + $hp_number = spacing($strDest[$i]['bk_hp'],11); + $strData = $strMessage; + if( !empty($strDest[$i]['bk_name']) ){ + $strData = str_replace("{이름}", $strDest[$i]['bk_name'], $strData); + } + + $msg = $strData; + + // 개행치환 + $msg = preg_replace("/\r\n/", "\n", $msg); + $msg = preg_replace("/\r/", "\n", $msg); + // 90byte 이내는 SMS, 90 ~ 2000 byte 는 LMS 그 이상은 절삭 되어 LMS로 발송 + // SMS 이기 때문에 90byte 이내로 합니다. + $msg=cut_char($msg, 90); + $msg = spacing($msg, 90); + + // 한글 깨진것이 있는지 체크합니다. + if( preg_match('/^([\x00-\x7e]|.{2})*/', $msg, $z) ){ + $msg = $z[0]; + } + + // 문자 내용이 euc-kr 인지 체크합니다. + $enc = mb_detect_encoding($msg, array('EUC-KR', 'UTF-8')); + + // 문자 내용이 euc-kr 이면 json_encode 에서 깨지기 때문에 utf-8 로 변환합니다. + if($enc === 'EUC-KR'){ + $msg = iconv_utf8($msg); + } + + // 보낼 내용을 배열에 집어넣기 + $dest = $hp_number; + $callBack = $strCallBack; + $Caller = $strCaller; + $rsvTime = $strDate ? $strDate : ''; + + $list = array( + "key" => $this->icode_key, + "tel" => $dest, + "cb" => $callBack, + "msg" => $msg, + "title" => "", //SMS 의 경우 타이틀을 지정할수 없습니다. + "date" => $rsvTime + ); + + $packet = json_encode($list); + + if( !$packet ){ // json_encode가 잘못되었으면 보내지 않습니다. + return "json_encode error"; + } + $this->Data[$i] = '06'.str_pad(strlen($packet), 4, "0", STR_PAD_LEFT).$packet; } - // 아이코드에서는 문자에 utf-8 인코딩 형식을 아직 지원하지 않는다. - $strData = iconv('utf-8', "euc-kr", stripslashes($strData)); - if (!$strURL) { - $strData = spacing(cut_char($strData,80),80); + } else { - $this->Data[$i] = '01144 '.$this->ID.$this->PWD.$hp_number.$strCallBack.$strCaller.$strDate.$strData; - } else { - $strURL = spacing($strURL,50); - $strData = spacing($this->CheckCallCenter($strURL, $hp_number, $strData),80); + for ($i=0; $i<$nCount; $i++) { + $hp_number = spacing($strDest[$i]['bk_hp'],11); + $strData = $strMessage; + if( !empty($strDest[$i]['bk_name']) ){ + $strData = str_replace("{이름}", $strDest[$i]['bk_name'], $strData); + } + // 아이코드에서는 문자에 utf-8 인코딩 형식을 아직 지원하지 않는다. + $strData = iconv('utf-8', "euc-kr", stripslashes($strData)); - $this->Data[$i] = '05173 '.$this->ID.$this->PWD.$hp_number.$strCallBack.$strURL.$strDate.$strData; + if (!$strURL) { + $strData = spacing(cut_char($strData,80),80); + + $this->Data[$i] = '01144 '.$this->ID.$this->PWD.$hp_number.$strCallBack.$strCaller.$strDate.$strData; + } else { + $strURL = spacing($strURL,50); + $strData = spacing($this->CheckCallCenter($strURL, $hp_number, $strData),80); + + $this->Data[$i] = '05173 '.$this->ID.$this->PWD.$hp_number.$strCallBack.$strURL.$strDate.$strData; + } } } + return true; // 수정대기 } function Send() { - global $g5; + global $g5, $config; $count = 1; @@ -436,33 +385,61 @@ if($config['cf_sms_type'] == 'LMS') { exit; } - $fsocket=fsockopen($this->SMS_Server,$this->SMS_Port, $errno, $errstr, 2); - if (!$fsocket) return false; - set_time_limit(60); + // 토큰키를 사용한다면 + if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){ + $fsocket = fsockopen(trim($this->socket_host),trim($this->socket_port), $errno, $errstr, 2); + if (!$fsocket) return false; + set_time_limit(300); - ## php4.3.10일경우 - ## zend 최신버전으로 업해주세요.. - ## 또는 69번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요. + foreach($this->Data as $puts) { + fputs($fsocket, $puts); + while(!$gets) { $gets = fgets($fsocket,32); } + $json = json_decode(substr($puts,6), true); - foreach($this->Data as $puts) { - $dest = substr($puts,26,11); - fputs($fsocket, $puts); - while(!$gets) { - $gets = fgets($fsocket,30); + $dest = $json["tel"]; + if (substr($gets,0,20) == "0225 00".spacing($dest,12)) { + $this->Result[] = $dest.":".substr($gets,20,11); + + } else { + $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; + if(substr($gets,6,2) >= "80") break; + } + $gets = ""; + + // 1천건씩 전송 후 5초 쉼 + if ($count++%1000 == 0) sleep(5); } - if (substr($gets,0,19) == "0223 00".$dest) { - $this->Result[] = $dest.":".substr($gets,19,10); - $this->Log[] = $puts; - } else { - $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; - $this->Log[] = $puts; - } - $gets = ""; + fclose($fsocket); - // 1천건씩 전송 후 5초 쉼 - if ($count++%1000 == 0) sleep(5); + } else { + $fsocket = fsockopen($this->SMS_Server,$this->SMS_Port); + if (!$fsocket) return false; + set_time_limit(300); + + ## php4.3.10일경우 + ## zend 최신버전으로 업해주세요.. + ## 또는 69번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요. + + foreach($this->Data as $puts) { + $dest = substr($puts,26,11); + fputs($fsocket, $puts); + while(!$gets) { + $gets = fgets($fsocket,30); + } + if (substr($gets,0,19) == "0223 00".$dest) { + $this->Result[] = $dest.":".substr($gets,19,10); + $this->Log[] = $puts; + } else { + $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")"; + $this->Log[] = $puts; + } + $gets = ""; + + // 1천건씩 전송 후 5초 쉼 + if ($count++%1000 == 0) sleep(5); + } + fclose($fsocket); } - fclose($fsocket); $this->Data = array(); return true; }