- 정보공유
[그누보드팁] 아이코드 토큰방식 모듈
sms.icode.php
<?php
if (!defined('_GNUBOARD_')) exit;
class IcodeSMS {
var $socket_host = '211.172.232.124';
var $socket_port = '9201';
var $Data = array();
var $Result = array();
public function __construct() {
;
}
function Init() {
$this->Data = array(); // 발송하기 위한 패킷내용이 배열로 들어간다.
$this->Result = array(); // 발송결과값이 배열로 들어간다.
}
/**
* 발송 패킷 생성
* Add(수신번호목록(배열), 발신번호, 발송내용(2000자이내), 제목(옵션, 30자이내), 예약일자(옵션, 12자리)
*/
function Add($icode_key, $strTelList, $strCallBack, $strData, $strSubject='', $strDate='', $bk_ix=0, $mi_ix=0) {
// 개행치환
$strData = preg_replace("/\r\n/","\n",$strData);
$strData = preg_replace("/\r/","\n",$strData);
// 문자 타입별 Port 설정.
$sendType = strlen($strData)>90 ? 1 : 0; // 0: SMS / 1: LMS
if($sendType==0) $strSubject = "";
$strCallBack = $this->CutChar($strCallBack, 12); // 회신번호
/** LMS 제목 **/
/*
제목필드의 값이 없을 경우 단말기 기종및 설정에 따라 표기 방법이 다름
1.설정에서 제목필드보기 설정 Disable -> 제목필드값을 넣어도 미표기
2.설정에서 제목필드보기 설정 Enable -> 제목을 넣지 않을 경우 제목없음으로 자동표시
제목의 첫글자에 "<",">", 개행문자가 있을경우 단말기종류 및 통신사에 따라 메세지 전송실패 -> 글자를 체크하거나 취환처리요망
$strSubject = str_replace("\r\n", " ", $strSubject);
$strSubject = str_replace("<", "[", $strSubject);
$strSubject = str_replace(">", "]", $strSubject);
*/
$strSubject = $this->CutCharUtf8($strSubject,30);
$strData = $this->CutCharUtf8($strData,2000);
/* 필수 항목에 대해 정상적인 코드인지 검사 과정.
개발 방식에 따라 활용
$Error = $this->CheckCommonTypeDest($strTelList); // 번호 검사
$Error = $this->IsVaildCallback($strCallBack);
$Error = $this->CheckCommonTypeDate($strDate);
*/
foreach ($strTelList as $tel) {
if(empty($tel)) continue;
$list = array(
"key" => $icode_key,
"tel" => $tel,
"cb" => $strCallBack,
"msg" => $strData,
"bk_ix" => $bk_ix,
"mi_ix" => $mi_ix,
);
if(!empty($strSubject)) $list['title'] = $strSubject;
if(!empty($strDate)) $list['date'] = $strDate;
$packet = json_encode($list);
$this->Data[] = '06'.str_pad(strlen($packet), 4, "0", STR_PAD_LEFT).$packet;
}
return true;
}
/**
* 문자발송 및 결과정보를 수신합니다.
*/
function Send() {
$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,32); }
$response = substr($puts, 6);
$resData = json_decode($response, true);
$rescd = substr($gets, 6, 2);
if ($rescd == '00' || $rescd == '17') { // 17은 접수(발송)대기.
$this->Result[] = array(
'is_send'=> true,
'rescd'=> $rescd,
'phone'=> (isset($resData['tel']) && $resData['tel'] ? $resData['tel'] : ''),
'key'=> (isset($resData['key']) && $resData['key'] ? $resData['key'] : ''),
'bk_ix'=> (isset($resData['bk_ix']) && $resData['bk_ix'] ? $resData['bk_ix'] : ''),
'mi_ix'=> (isset($resData['mi_ix']) && $resData['mi_ix'] ? $resData['mi_ix'] : ''),
);
}
else {
$this->Result[] = array(
'is_send'=> false,
'rescd'=> $rescd,
'phone'=> (isset($resData['tel']) && $resData['tel'] ? $resData['tel'] : ''),
);
if (substr($gets,6,2) >= "80") break;
}
$gets = "";
}
fclose($fsocket);
$this->Data = array();
return true;
}
function CutChar($word, $cut) {
$word = substr($word,0,$cut); // 필요한 길이만큼 취함.
for ($k = $cut-1; $k > 1; $k--) {
if (ord(substr($word,$k,1))<128) break; // 한글값은 160 이상.
}
$word = substr($word, 0, $cut-($cut-$k+1)%2);
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);
}
/**
* 잘못된 수신번호 목록을 리턴합니다.
*
* @param strTelList 발송번호 배열.
* @return 잘못된 수신번호 목록.
*/
function CheckCommonTypeDest($strTelList) {
$result = '';
foreach ($strTelList as $tel) {
$tel = preg_replace("/[^0-9]/","",$tel);
if(!preg_match("/^(0[173][0136789])([0-9]{3,4})([0-9]{4})$/", $tel)) $result .= $tel.',';
}
return $result;
}
/**
* 회신번호 유효성 여부조회
* 한국인터넷진흥원 권고사항
*
* @param string callback 회신번호
* @return 처리결과입니다
*/
function IsVaildCallback($callback){
$_callback = preg_replace('/[^0-9]/', '', $callback);
if (!preg_match("/^(02|0[3-6]\d|01(0|1|3|5|6|7|8|9)|070|080|007)\-?\d{3,4}\-?\d{4,5}$/", $_callback) &&
!preg_match("/^(15|16|18)\d{2}\-?\d{4,5}$/", $_callback)) return "회신번호오류";
if (preg_match("/^(02|0[3-6]\d|01(0|1|3|5|6|7|8|9)|070|080)\-?0{3,4}\-?\d{4}$/", $_callback)) return "회신번호오류";
return '';
}
/**
* 예약날짜의 값이 정확한 값인지 확인합니다.
*
* @param string strDate 예약시간
* @return 처리결과입니다
*/
function CheckCommonTypeDate($strDate) {
$strDate = preg_replace("/[^0-9]/", "", $strDate);
if ($strDate){
if(strlen($strDate) != 12) return '예약날짜오류';
if (!checkdate(substr($strDate,4,2),substr($strDate,6,2),substr($rsvTime,0,4))) return "예약날짜오류";
if (substr($strDate,8,2)>23 || substr($strDate,10,2)>59) return "예약시간오류";
}
return '';
}
function CheckFailCode($code) {
$returnData = '';
switch ($code) {
case '23': // "23:데이터오류, 전송날짜오류, 발신번호미등록"
$returnData = "데이터를 다시 확인해 주시기바랍니다.";
break;
// 아래의 사유들은 발송진행이 중단됨.
case '85': // "85:발송번호 미등록"
$returnData = "등록되지 않는 발송번호 입니다.";
break;
case '87': // "87:인증실패"
$returnData = "(정액제-계약확인)인증 받지 못하였습니다.";
break;
case '88': // "88:연동모듈 발송불가"
$returnData = "연동모듈 사용이 불가능합니다. 아이코드로 문의하세요.";
break;
case '96': // "96:토큰 검사 실패"
$returnData = "사용할 수 없는 토큰키입니다.";
break;
case '97': // "97:잔여코인부족"
$returnData = "잔여코인이 부족합니다.";
break;
case '98': // "98:사용기간만료"
$returnData = "사용기간이 만료되었습니다.";
break;
case '99': // "99:인증실패"
$returnData = "서비스 사용이 불가능합니다. 아이코드로 문의하세요.";
break;
default: // "미 확인 오류"
$returnData = "알 수 없는 오류로 전송이 실패하었습니다.";
break;
}
return $returnData;
}
}
----------------------------------------
사용방법
include_once(G5_LIB_PATH.'/sms.icode.php');
$SMS = new IcodeSMS; /* SMS 모듈 클래스 생성 */
$icode_token_key = ''; // 토큰키
$bk_hp = '010-8888-9999';
$mu_smssender = '1588-9966';
$mu_title = '발송제목';
$mu_msg = '테스트발송';
$src = $dst = array();
$src[] = "/#{예약번호}/";
$dst[] = '29924888';
$recv_number = array();
$recv_number[] = preg_replace('/[^0-9]/', '', $bk_hp);
$send_number = preg_replace('/[^0-9]/', '', $mu_smssender);
$sms_subject = get_text($mu_title);
$sms_content = $mu_msg;
$sms_content = preg_replace($src, $dst, $sms_content); // 템플릿 내용
$SMS->Add($icode_token_key, $recv_number, $send_number, $sms_content, $sms_subject);
// 발송처리.
if (isset($SMS->Data) && is_array($SMS->Data) && count($SMS->Data)) {
$result = $SMS->Send();
if ($result) {
foreach ($SMS->Result as $res) {
if (isset($res['is_send']) && $res['is_send'] == true) {
// 성공 로그 등록
}
else {
$fail_reason = $SMS->CheckFailCode($res['rescd']);
// 실패 로그 등록
}
}
}
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
}