그누보드 플러그인 SMS4를 이용한 SMS 발송하기 함수

munilive
Written by munilive on (Updated: )

그누보드의 플러그인 SMS4를 이용할 때 사용할 수 있는 SMS 발송 함수입니다.
회원아이디를 입력하여서도 바로 발송 할 수 있도록 추가적인 함수를 만들었습니다. 더불어 회원아이디로 발송할 경우에는 22시부터 다음 날 아침 9시 이전에 발송되는 문자는 예약기능을 적용해 아침 9시에 일괄발송 되는 기능이 추가되어있습니다.

<?
// 필수 include
include_once("{$g4['path']}/sms.config.php");
include_once("{$g4['path']}/lib/sms.lib.php");

// 받는사람 아이디, 보내는 메시지, 보내는 사람 아이디
function SendSMStoID($mb_id, $mh_message, $sender_id="") {
    global $g4, $member;

    $rtn = Array("errcode"=>"", "errmsg"=>"");

    $mb = get_member($mb_id);

    // 탈퇴한 회원이면 SMS 보내지 않는다.
    if($mb['mb_level'] == 1 && $mb['mb_leave_date'] != "") {
        $rtn["errcode"] = "999";
        $rtn["errmsg"] = "에러: 탈퇴한 회원입니다.";

        return $rtn;
    }

    $mh_hp = $mb['mb_hp'];

    $nTime = $g4['server_time'];
    $time_Gmi = date("Gmi", $nTime);

    if($time_Gmi < 90000) {
        $booking_time = date("Y-m-d 09:00:00", $nTime); //당일 오전 9시에 문자를 일괄 발송한다.
    } else if($time_Gmi > 220000) {
        $booking_time = date("Y-m-d 09:00:00", strtotime("+1day", $nTime)); // 22시 이후는 자정이므로 다음날 9시에 일괄적으로 보낸다.
    } else {
        $booking_time = "";
    }

    // 보내는 사람 아이디가 있으면 해당 회원의 핸드폰번호를 입력한다.
    if($sender_id) {
        $sender = get_member($sender_id);
        $mh_reply = $sender['mb_hp'];
    } else {
        $mh_reply = "";
    }

    $rtn = Send_SMS($mh_hp, $mh_message, $mh_reply, $booking_time);
    return $rtn;
}

// SMS 보내기 함수
// 받는사람 번호, 보내는 메시지, 보내는 사람 번호,
function Send_SMS($mh_hp, $mh_message, $mh_reply="", $booking_time="") {
    global $g4, $member;

    $rtn = Array("errcode"=>"", "errmsg"=>"");

    // SMS 설정값 배열변수
    $sms4 = sql_fetch("select * from $g4[sms4_config_table]");

    // 보내는사람 번호가 없으면 관리자 번호로
    if(empty($mh_reply)) $mh_reply = $sms4['cf_phone'];

    $mh_reply = str_replace("-", "", $mh_reply);
    if (!check_string($mh_reply, _G4_NUMERIC_)) {
        $rtn["errcode"] = "210";
        $rtn["errmsg"] = "보내는 번호가 올바르지 않습니다.";

        return $rtn;
    }

    $mh_hp = explode(',', $mh_hp);

    // 핸드폰 번호만 걸러낸다.
    $tmp = array();
    for ($i=0; $i<count($mh_hp); $i++)
    {
        $hp = trim($mh_hp[$i]);
        $hp = get_hp($hp);

        if ($hp)
            $tmp[][bk_hp] = get_hp($hp, 0);
    }
    $mh_hp = $tmp;

    $total = count($mh_hp);

    $minus_point = 0; // 차감할 포인트 점수
    if(strtotime($booking_time)) {
        $mh_booking = date("Y-m-d H:i:s", strtotime($booking_time)); // 예약 전송시간 (Y-m-d H:i:s) 형식
        $booking = date("YmdHis", strtotime($booking_time)); // 예약 전송시간 (YmdHis) 형식
    } else {
        $mh_booking = "";
        $booking = "";
    }

    $SMS = new SMS4;
    $SMS->SMS_con($sms4[cf_ip], $sms4[cf_id], $sms4[cf_pw], $sms4[cf_port]);

    $result = $SMS->Add($mh_hp, $mh_reply, '', '', $mh_message, $booking, $total);

    $is_success = null;
    $errcode = "";

    if ($result)
    {
        $result = $SMS->Send();

        if ($result) //SMS 서버에 접속했습니다.
        {
            foreach ($SMS->Result as $result)
            {
                list($hp, $code) = explode(":", $result);

                if (substr($code,0,5) == "Error")
                {
                    $is_success = false;

                    switch (substr($code,6,2)) {
                        case '02':   // "02:형식오류"
                            $mh_log = "형식이 잘못되어 전송이 실패하였습니다.";
                            $errcode = "302";
                            break;
                        case '23':   // "23:인증실패,데이터오류,전송날짜오류"
                            $mh_log = "데이터를 다시 확인해 주시기바랍니다.";
                            $errcode = "323";
                            break;
                        case '97':   // "97:잔여코인부족"
                            $mh_log = "잔여코인이 부족합니다.";
                            $errcode = "397";
                            break;
                        case '98':   // "98:사용기간만료"
                            $mh_log = "사용기간이 만료되었습니다.";
                            $errcode = "398";
                            break;
                        case '99':   // "99:인증실패"
                            $mh_log = "인증 받지 못하였습니다. 계정을 다시 확인해 주세요.";
                            $errcode = "399";
                            break;
                        default:     // "미 확인 오류"
                            $mh_log = "알 수 없는 오류로 전송이 실패하었습니다.";
                            $errcode = "400";
                            break;
                    }
                }
                else
                {
                    $is_success = true;
                    $mh_log = "문자전송:".get_hp($hp, 1);
                    $errcode = "000";
                }

                if($member['mb_id']) $mb_id = $member['mb_id'];
                else $mb_id = "admin";

                $hp = get_hp($hp, 1);
                $log = array_shift($SMS->Log);
                sql_query("insert into $g4[sms4_member_history_table] set mb_id='{$mb_id}', mh_reply='$mh_reply', mh_hp='$hp', mh_datetime='$g4[time_ymdhis]', mh_booking='$mh_booking', mh_log='$mh_log', mh_ip='{$_SERVER['REMOTE_ADDR']}' ");

                if ($is_success)
                    insert_point($mb_id, (-1) * $sms4[cf_point], $mh_log);
            }
            $SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
        }
        else {
            $rtn["errcode"] = "220";
            $rtn["errmsg"] = "에러: SMS 서버와 통신이 불안정합니다.";

            return $rtn;
        }
    }
    else {
        $rtn["errcode"] = "230";
        $rtn["errmsg"] = "에러: SMS 데이터 입력도중 에러가 발생하였습니다.";

        return $rtn;
    }

    if($errcode) {
        // 000 전송완료
        $rtn["errcode"] = $errcode;
        $rtn["errmsg"] = $mh_log;
    } else {
        $rtn["errcode"] = "";
        $rtn["errmsg"] = "에러 : SMS 발송에 문제가 발생 하였습니다. 관리자에게 문의 하세요.";
    }

    return $rtn;
}
?>

함수 사용에 따른 반환은 배열로 하며 error code 값이 000일 경우에 전송 완료된 것입니다.
위 함수를 그대로 사용하기 위해서는 그누보드와 SMS4를 필히 설치하여야 합니다.

Comments

comments powered by Disqus