위토즈 - 개발자프로그램판매공간

정보공유

[그누보드팁] 아이코드 토큰방식 모듈


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(); // 보관하고 있던 결과값을 지웁니다.

}













정보공유
Total 468건 1 페이지
번호 제목 글쓴이 날짜 조회
열람중 아이코드 토큰방식 모듈 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 12:11 3
467 HTML 파일을 CSS가 적용된 PDF로 변환하여 서버에 저장하는 PHP 코드 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 11-06 615
466 phpMyAdmin 접속이 안될때, db 아이피 포트번호 다를때. 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 09-18 1,069
465 실패되었습니다.[연동오류(PHP SOAP 모듈설치 필요)] 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 09-10 1,224
464 csv 파일 만들때 제일많이 하는 실수!! 필드에 , 가 있는경우 변환이 제대로 안된다. 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 09-01 1,380
463 GROUP_CONCAT 길이 제한 때문에 결과값을 다 못가져오는 경우 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-26 1,419
462 회원아이디 자동 생성 함수 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-20 1,533
461 중앙 토스트 레이어 , 버튼을 클릭하면 화면 중앙에 3초간 보였다가 fadeout 되는 레이어창. 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-19 1,562
460 관리자 권한이 super 아니고 관리권한설정을 부여받은 회원이 관리자 화면에 접속했을때 부여받은 메뉴로 바로 접속되도록 처리 (2) 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-15 1,630
459 관리자 권한이 super 아니고 관리권한설정을 부여받은 회원이 관리자 화면에 접속했을때 부여받은 메뉴로 바로 접속되도록 처리 (1) 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-15 1,556
458 SQL 주입 방지 Prepared Statement 의 생활화 mysqli PDO 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-15 1,408
457 크로스 사이트 스크립팅(XSS) 테스트 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-12 1,598
456 2일전부터 오늘까지의 데이터 정보 가져오기. 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 08-05 1,529
455 text input 박스 에 휴대폰번호 입력할때 자동으로 하이픈 넣기 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 07-18 1,769
454 주소 정보 입력시 다음우편번호 스크립트를 사용할때 배열처리 할 경우 오류 위토즈쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 07-11 1,952