icode SMS 문자 자동발송 (토큰키 token key 활용) > 기술자료 | 해피정닷컴

icode SMS 문자 자동발송 (토큰키 token key 활용) > 기술자료

본문 바로가기

사이트 내 전체검색

icode SMS 문자 자동발송 (토큰키 token key 활용) > 기술자료

PHP icode SMS 문자 자동발송 (토큰키 token key 활용)

페이지 정보


본문

아이코드  sms_module4 PHP v3.1.2 b26 을 적용하였습니다.


1. sms.db.php   디비정보 등 환경설정
<?php
$mysql_host     = "localhost";                    // 데이타베이스 서버 주소 (같은서버일경우 : localhost)
$mysql_user     = "";                // 데이타베이스 접속 아이디
$mysql_password = "";                    // 데이타베이스 접속 비밀번호
$mysql_db       = "";            // 데이타베이스 명

$dbconn = mysqli_connect($mysql_host,$mysql_user,$mysql_password,$mysql_db) or die("데이터베이스 연결에 실패하였습니다.");
// 그누보드5 사용할때는 아래꺼 활용
//include_once "_common.php";
//$dbconn = mysqli_connect(G5_MYSQL_HOST,G5_MYSQL_USER,G5_MYSQL_PASSWORD,G5_MYSQL_DB) or die("데이터베이스 연결에 실패하였습니다.");

$sms_table = "sms_list";  // sms 문자발송 내역 저장 디비 테이블
$sms_admin_table = "sms_adm";  // 관리자 로그인 디비 테이블

$icode_server = "211.172.232.124";    ## SMS 서버 
$icode_key    = ""; // 아이코드 발송전용 토큰키
$icode_port   = "9201";  // 토큰키 사용시 포트

$send_hp_mb   = "010-0000-0000"; // 발신번호 
$recv_hp_mb   = "010-0000-0000"; // 수신번호 

$client_ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
//echo "client_ip = ".$client_ip."<br>";  // 아이피가 어떻게 보이는지 확인
if (count(explode(',', $client_ip))==2) {
    $ip0 = explode(',',$client_ip);
    $client_ip = $ip0[0];
}
?>


2. sms.component.php  함수파일   icode 에서 제공
<?php
/**
* SMS 발송을 관장하는 메인 클래스이다.
*
* 접속, 발송, URL발송, 결과등의 실질적으로 쓰이는 모든 부분이 포함되어 있다.
*/
class SMS {
  var $icode_key;
  var $socket_host;
  var $socket_port;
  var $Data = array();
  var $Result = array();

  // SMS 서버 접속
  function SMS_con($host, $port, $key) {
    $this->socket_host = $host;
    $this->socket_port = $port;
    $this->icode_key = $key;
  }
    
  function Init() {
    $this->Data = array();    // 발송하기 위한 패킷내용이 배열로 들어간다.
    $this->Result = array();    // 발송결과값이 배열로 들어간다.
  }

  /**
   * 발송 패킷 생성
   * Add(수신번호목록(배열), 발신번호, 발송내용(2000자이내), 제목(옵션, 30자이내), 예약일자(옵션, 12자리)
   */
  function Add($strTelList, $strCallBack, $strData, $strSubject='', $strDate='') {
    // 개행치환
    $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 = CutChar($strCallBack, 12);       // 회신번호
      
    /** LMS 제목 **/
    /*
    제목필드의 값이 없을 경우 단말기 기종및 설정에 따라 표기 방법이 다름
    1.설정에서 제목필드보기 설정 Disable -> 제목필드값을 넣어도 미표기
    2.설정에서 제목필드보기 설정 Enable  -> 제목을 넣지 않을 경우 제목없음으로 자동표시
            
    제목의 첫글자에 "<",">", 개행문자가 있을경우 단말기종류 및 통신사에 따라 메세지 전송실패 -> 글자를 체크하거나 취환처리요망
    $strSubject = str_replace("\r\n", " ", $strSubject); 
    $strSubject = str_replace("<", "[", $strSubject); 
    $strSubject = str_replace(">", "]", $strSubject); 
    */

    $strSubject = CutCharUtf8($strSubject,30);
    $strData    = CutCharUtf8($strData,2000);

    /* 필수 항목에 대해 정상적인 코드인지 검사 과정.
    개발 방식에 따라 활용 
    $Error = CheckCommonTypeDest($strTelList); // 번호 검사
    $Error = IsVaildCallback($strCallBack);
    $Error = CheckCommonTypeDate($strDate);
    */

    
    foreach ($strTelList as $tel) {
      if(empty($tel)) continue;
      $list = array(
        "key" => $this->icode_key, 
        "tel" => $tel,
        "cb" => $strCallBack,
        "msg" => $strData
      );
      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); }

      $chk = preg_match("/\"tel\":\"([0-9]*)\"/", substr($puts,6), $matches);
      $desc = $matches[1];
      $resultCode = substr($gets,6,2);
      if ($resultCode == '00' || $resultCode == '17') { // 17은 접수(발송)대기.
        $this->Result[] = $resultCode.":".substr($gets,8,12).":".substr($gets,20,11);

      } else {
        $this->Result[] = $desc.":Error(".substr($gets,6,2).")";
        if(substr($gets,6,2) >= "80") break;
      }
      $gets = "";
    }

    fclose($fsocket);
    $this->Data = array();
    return true;
  }
}

/**
 * 원하는 문자열의 길이를 원하는 길이만큼 공백을 넣어 맞추도록 합니다.
 *
 * @param   text  원하는 문자열입니다.
 *          size  원하는 길이입니다.
 * @return        변경된 문자열을 넘깁니다.
 */
function FillSpace($text,$size) {
  for ($i=0; $i<$size; $i++) $text.= " ";
  $text = substr($text,0,$size);
  return $text;
}

/**
 * 원하는 문자열을 원하는 길에 맞는지 확인해서 조정하는 기능을 합니다.
 *
 * @param   word  원하는 문자열입니다.
 *          cut   원하는 길이입니다.
 * @return        변경된 문자열입니다.
 */
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 '';
}

/**
 * 문자열을 JSON 사용가능 타입으로 변환한다.
 */
function EscapeJsonString($value) {
  $escapers =     array('\\',  '"');
  $replacements = array('\\\\', '\"');
  $result = str_replace($escapers, $replacements, $value);
  return $result;
}

/**
 * 예약날짜의 값이 정확한 값인지 확인합니다.
 *
 * @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 '';
}
?>



3. sms_send.php   문자발송 파일
<?php
include_once "sms.db.php";  // sms 환경설정
include "sms.component.php";   // sms 발송 함수

$send_number = str_replace("-","",$send_hp_mb); // - 제거 
$recv_number = str_replace("-","",$recv_hp_mb); // - 제거 
// 문자발송 Form을 사용하지 않고 자동 발송의 경우 수신번호가 1개일 경우 번호 마지막에 ";"를 붙인다 
$strTelList  = $strTelList.";";

$strSubject = "LMS제목";    /* LMS제목  : LMS발송에 이용되는 제목( component.php 60라인을 참고 바랍니다. */
$strData    = "신청을 하셨습니다.";    # 발송 메세지

$SMS = new SMS;    // SMS 모듈 클래스 생성
$SMS->SMS_con($icode_server,$icode_port,$icode_key);    // 아이코드 서버 접속

//$strTelList     = $_POST["strTelList"];  /* 수신번호 : 01000000001;0100000002; */
//$strCallBack    = $_POST["strCallBack"]; /* 발신번호 : 0317281281 */
//$strSubject     = $_POST["strSubject"];  /* LMS제목  : LMS발송에 이용되는 제목( component.php 60라인을 참고 바랍니다. */
//$strData        = $_POST["strData"];     /* 메세지 : 발송하실 문자 메세지 */

// 문자 받는 전화번호
$strCallBack = $recv_number;

$phone_number = $strTelList;
if(stristr($phone_number, '010') !== FALSE) {
} elseif(stristr($phone_number, '011') !== FALSE) {
} elseif(stristr($phone_number, '016') !== FALSE) {
} elseif(stristr($string, '017') !== FALSE) {
} elseif(stristr($string, '018') !== FALSE) {
} elseif(stristr($string, '019') !== FALSE) {
} elseif(stristr($string, '02') !== FALSE) {
} elseif(stristr($string, '031') !== FALSE) {
} elseif(stristr($string, '032') !== FALSE) {
} elseif(stristr($string, '033') !== FALSE) {
} elseif(stristr($string, '041') !== FALSE) {
} elseif(stristr($string, '042') !== FALSE) {
} elseif(stristr($string, '043') !== FALSE) {
} elseif(stristr($string, '044') !== FALSE) {
} elseif(stristr($string, '051') !== FALSE) {
} elseif(stristr($string, '052') !== FALSE) {
} elseif(stristr($string, '053') !== FALSE) {
} elseif(stristr($string, '054') !== FALSE) {
} elseif(stristr($string, '061') !== FALSE) {
} elseif(stristr($string, '062') !== FALSE) {
} elseif(stristr($string, '063') !== FALSE) {
} elseif(stristr($string, '070') !== FALSE) {
} else {
    //echo " <script>alert('연락처가 올바르지 않아서 신청되지 않았습니다.');  document.location.href='". G5_URL ."'; </script>";
    //exit;
}

$strTelList  = explode(";",$strTelList);

// 예약설정을 합니다.
if ($chkSendFlag) $strDate = $R_YEAR.$R_MONTH.$R_DAY.$R_HOUR.$R_MIN;
else $strDate = "";

// 문자 발송에 필요한 항목을 배열에 추가
$result = $SMS->Add($strTelList, $strCallBack, $strData, $strSubject, $strDate);

// 패킷 정의의 결과에 따라 발송여부를 결정합니다.
if ($result) {
  //echo "일반메시지 입력 성공<br />";
  //echo "<hr>";

  // 패킷이 정상적이라면 발송에 시도합니다.
  $result = $SMS->Send();

  if ($result) {
    //echo "서버에 접속했습니다.<br /><br />";
    $success = $fail = 0;
    $isStop = 0;
    foreach($SMS->Result as $result) {

      list($phone,$code)=explode(":",$result);

      if (substr($code,0,5)=="Error") {
        echo $phone.' 발송에러('.substr($code,6,2).'): ';
        switch (substr($code,6,2)) {
          case '23':   // "23:데이터오류, 전송날짜오류, 발신번호미등록"
            echo "데이터를 다시 확인해 주시기바랍니다.<br>";
            break;

          // 아래의 사유들은 발송진행이 중단됨.
          case '85':   // "85:발송번호 미등록"
            echo "등록되지 않는 발송번호 입니다.<br />";
            break;
          case '87':   // "87:인증실패"
            echo "(정액제-계약확인)인증 받지 못하였습니다.<br />";
            break;
          case '88':   // "88:연동모듈 발송불가"
            echo "연동모듈 사용이 불가능합니다. 아이코드로 문의하세요.<br />";
            break;

          case '96':   // "96:토큰 검사 실패"
            echo "사용할 수 없는 토큰키입니다.<br />";
            break;
          case '97':   // "97:잔여코인부족"
            echo "잔여코인이 부족합니다.<br />";
            break;
          case '98':   // "98:사용기간만료"
            echo "사용기간이 만료되었습니다.<br />";
            break;
          case '99':   // "99:인증실패"
            echo "서비스 사용이 불가능합니다. 아이코드로 문의하세요.<br />";
            break;
          default:   // "미 확인 오류"
            echo "알 수 없는 오류로 전송이 실패하었습니다.<br />";
            break;
        }
        $fail++;
      } else {
        $resultString = '';
        switch (substr($code,0,2)) {
          case '17':   // "17: 접수(발송)대기 처리. 지연해소시 발송됨."
            echo "접수(발송)대기처리 되었습니다.";
            break;
          default:   // "00: 전송완료."
            //echo "전송되었습니다.<br />";
            break;
        }
        //echo $phone.'로 '.$resultString.' (msg seq : '.$code.')<br />';
        $success++;
      }
    }
    //echo '<br />'.$success."건을 전송했으며 ".$fail."건을 보내지 못했습니다.<br />";
    $SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
  }
  else echo "에러: SMS 서버와 통신이 불안정합니다.<br />";
}


//exit;
//alert("정상적으로 접수되었습니다.","{$PHP_SELF}?ptype=list&{$param}");
// 문자보내기 끝 


// 문자발송내역을 디비에 저장
/*
    $sms_date = date('Y-m-d H:i:s');
    $sql = "insert into {$sms_table} set ";
    $sql .= "  sms_name   = '{$sms_name}' ";
    $sql .= ", sms_tel    = '{$sms_tel}' ";
    $sql .= ", sms_memo   = '{$sms_memo}' ";
    $sql .= ", sms_device = '{$sms_device}' ";
    $sql .= ", sms_ip     = '{$client_ip}' ";
    $sql .= ", sms_date   = '{$sms_date}' ";
    
    //echo "sql => $sql <br>";  // 쿼리값의 정상여부를 판단
    
    $result = mysqli_query($dbconn,$sql);
    echo mysqli_error();
    mysqli_close($dbconn);  // MySQL에 접속종료
*/
?>

댓글목록

등록된 댓글이 없습니다.


Total 2,641건 43 페이지
  • RSS
기술자료 목록
1801
Adobe   26789  2016-06-23 14:18  
1800
영카트   20814  2016-06-20 18:57 ~ 2024-11-12 20:14  
1799
호스팅   11018  2016-06-08 12:41  
1798
ClassicASP   17658  2016-05-28 00:20  
열람
PHP   18983  2016-05-25 11:50 ~ 2022-05-13 11:34  
1796
그누보드   14984  2016-05-25 04:14 ~ 2018-11-18 09:29  
1795
호스팅   17024  2016-05-24 18:52 ~ 2024-10-31 19:15  
1794
일반   13609  2016-05-11 17:30  
1793
일반   18194  2016-05-11 17:17  
1792
그누보드   26981  2016-05-04 17:04 ~ 2016-05-04 00:00  
1791
그누보드   15660  2016-05-04 11:04 ~ 2017-06-16 00:00  
1790
그누보드   16858  2016-04-21 03:56 ~ 2018-04-27 10:35  
1789
호스팅   26902  2016-04-19 22:32 ~ 2019-01-03 01:48  
1788
일반   13050  2016-04-17 16:44  
1787
MySQL   14851  2016-04-13 23:21  
1786
.NET   14158  2016-04-07 20:30  
1785
Secure   12952  2016-03-29 05:21  
1784
그누보드   11859  2016-03-29 02:37 ~ 2020-03-13 11:28  
1783
그누보드   13335  2016-03-25 17:17 ~ 2019-12-08 08:38  
1782
그누보드   13181  2016-03-16 09:30  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2024 해피정닷컴. All Rights Reserved.