👾 php

php cafe24 sms api

(。θᗨθ。) 2023. 12. 28. 15:21

홈페이지에서 문의 폼 작성하면

그 내용이 담당자 휴대폰 메시지로 발송되게끔 작업

 

1. cafe24 sms 호스팅

 

2. 문자 보내기 설정

현재 접속 IP로 테스트하고, 사용할 홈페이지 IP 입력

 

3. API 발송IP 설정

2번과 동일하게 설정

 

4. 발신번호 관리

* 발신번호 등록시 서류 필요한데 아래 링크 참고하여, 서류 제출

https://help.cafe24.com/cs/cs_faq_view.php?idx=2867&page=1&select_os=&mode=&s_value=&categoryIdx=497&faq_list=497&contentNum=28

 

고객센터 - 카페24 호스팅센터

대한민국 No.1 카페24 호스팅! 문의게시판, ARS안내, 자주묻는질문, 매뉴얼, 공지사항 등 제공

help.cafe24.com

 

5.문자 보내기 발송 테스트 성공

 

6. 소스예제 활용 : 원본 소스로 먼저 테스트

 

* index.php

<html>

<head>
  <title>sms - php </title>
  <script type="text/javascript">
    function setPhoneNumber(val) {
      var numList = val.split("-");
      document.smsForm.sphone1.value = numList[0];
      document.smsForm.sphone2.value = numList[1];
      if (numList[2] != undefined) {
        document.smsForm.sphone3.value = numList[2];
      }
    }

    function loadJSON() {
      var data_file = "./calljson.php";
      // var data_file = "/calljson.php";
      var http_request = new XMLHttpRequest();
      try {
        // Opera 8.0+, Firefox, Chrome, Safari
        http_request = new XMLHttpRequest();
      } catch (e) {
        // Internet Explorer Browsers
        try {
          http_request = new ActiveXObject("Msxml2.XMLHTTP");

        } catch (e) {

          try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {
            // Eror
            alert("지원하지 않는브라우저!");
            return false;
          }

        }
      }
      http_request.onreadystatechange = function() {
        if (http_request.readyState == 4) {
          // Javascript function JSON.parse to parse JSON data
          var jsonObj = JSON.parse(http_request.responseText);
          if (jsonObj['result'] == "Success") {
            var aList = jsonObj['list'];
            var selectHtml = "<select name=\"sendPhone\" onchange=\"setPhoneNumber(this.value)\">";
            selectHtml += "<option value='' selected>발신번호를 선택해주세요</option>";
            for (var i = 0; i < aList.length; i++) {
              selectHtml += "<option value=\"" + aList[i] + "\">";
              selectHtml += aList[i];
              selectHtml += "</option>";
            }
            selectHtml += "</select>";
            document.getElementById("sendPhoneList").innerHTML = selectHtml;
          }
        }
      }

      http_request.open("GET", data_file, true);
      http_request.send();
    }
  </script>
</head>

<body onload="loadJSON()">
  <form method="post" name="smsForm" action="./sms_sender.php">
    <input type="hidden" name="action" value="go">
    발송타입 <span><input type="radio" name="smsType" value="S">단문(SMS)</span><span><input type="radio" name="smsType" value="L">장문(LMS)</span> <br />
    제목 : <input type="text" name="subject" value="제목"> 장문(LMS)인 경우(한글30자이내)<br />
    전송메세지 <textarea name="msg" cols="30" rows="10" style="width:455px;">내용입력</textarea>
    <br /><br />
    <p>단문(SMS) : 최대 90byte까지 전송할 수 있으며, 잔여건수 1건이 차감됩니다. <br />
      장문(LMS) : 한번에 최대 2,000byte까지 전송할 수 있으며 1회 발송당 잔여건수 3건이 차감됩니다.
    </p>
    <br />받는 번호 <input type="text" name="rphone" value="011-111-1111"> 예) 011-011-111 , '-' 포함해서 입력.
    <br />이름삽입번호 <input type="text" name="destination" value="" size=80> 예) 010-000-0000|홍길동
    <br />
    보내는 번호 <input type="hidden" name="sphone1">
    <input type="hidden" name="sphone2">
    <input type="hidden" name="sphone3">
    <span id="sendPhoneList"></span>
    <br />예약 날짜 <input type="text" name="rdate" maxlength="8"> 예)20090909
    <br />예약 시간 <input type="text" name="rtime" maxlength="6"> 예)173000 ,오후 5시 30분,예약시간은 최소 10분 이상으로 설정.
    <br />return url <input type="text" name="returnurl" maxlength="64" value="">
    <br /> test flag <input type="text" name="testflag" maxlength="1"> 예) 테스트시: Y
    <br />nointeractive <input type="text" name="nointeractive" maxlength="1"> 예) 사용할 경우 : 1, 성공시 대화상자(alert)를 생략.
    <br />반복설정 <input type="checkbox" name="repeatFlag" value="Y">
    <br /> 반복횟수 <select name="repeatNum">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select> 예) 1~10회 가능.
    <br />전송간격<select name="repeatTime"> 예)15분 이상부터 가능.
      <option value="15">15</option>
      <option value="20">20</option>
      <option value="25">25</option>
    </select>분마다
    <br>
    <input type="submit" value="전송">
    <br />이통사 정책에 따라 발신번호와 수신번호가 같은 경우 발송되지 않습니다.
  </form>
</body>

</html>

 

* sms_sender.php

<?php
    if($_POST['action']=='go'){

      /******************** 인증정보 ********************/
       $sms_url = "https://sslsms.cafe24.com/sms_sender.php"; // HTTPS 전송요청 URL
       // $sms_url = "http://sslsms.cafe24.com/sms_sender.php"; // 전송요청 URL
       $sms['user_id'] = base64_encode("!!!SMS 아이디!!!"); //SMS 아이디.
       $sms['secure'] = base64_encode("!!!인증키!!!") ;//인증키
       $sms['msg'] = base64_encode(stripslashes($_POST['msg']));
       if( $_POST['smsType'] == "L"){
             $sms['subject'] =  base64_encode($_POST['subject']);
       }
       $sms['rphone'] = base64_encode($_POST['rphone']);
      //  $sms['sphone1'] = base64_encode($_POST['sphone1']);
      //  $sms['sphone2'] = base64_encode($_POST['sphone2']);
      //  $sms['sphone3'] = base64_encode($_POST['sphone3']);
       $sms['sphone1'] = base64_encode("!!! 발신 번호 앞자리 !!!");
       $sms['sphone2'] = base64_encode("!!! 발신 번호 중간자리 !!!");
       $sms['sphone3'] = base64_encode("!!! 발신 번호 뒷자리 !!!");
       $sms['rdate'] = base64_encode($_POST['rdate']);
       $sms['rtime'] = base64_encode($_POST['rtime']);
       $sms['mode'] = base64_encode("1"); // base64 사용시 반드시 모드값을 1로 주셔야 합니다.
       $sms['returnurl'] = base64_encode("/localhost");
      //  $sms['returnurl'] = base64_encode($_POST['returnurl']);
       $sms['testflag'] = base64_encode($_POST['testflag']);
      //  $sms['testflag'] = base64_encode("Y");
       $sms['destination'] = strtr(base64_encode($_POST['destination']), '+/=', '-,');
       $returnurl = $_POST['returnurl'];
       $sms['repeatFlag'] = base64_encode($_POST['repeatFlag']);
       $sms['repeatNum'] = base64_encode($_POST['repeatNum']);
       $sms['repeatTime'] = base64_encode($_POST['repeatTime']);
       $sms['smsType'] = base64_encode($_POST['smsType']); // LMS일경우 L
       $nointeractive = $_POST['nointeractive']; //사용할 경우 : 1, 성공시 대화상자(alert)를 생략

       $host_info = explode("/", $sms_url);
       $host = $host_info[2];
       $path = $host_info[3]."/".$host_info[4];

       srand((double)microtime()*1000000);
       $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
       //print_r($sms);

       // 헤더 생성
       $header = "POST /".$path ." HTTP/1.0\r\n";
       $header .= "Host: ".$host."\r\n";
       $header .= "Content-type: multipart/form-data, boundary=".$boundary."\r\n";

       // 본문 생성
       foreach($sms AS $index => $value){
           $data .="--$boundary\r\n";
           $data .= "Content-Disposition: form-data; name=\"".$index."\"\r\n";
           $data .= "\r\n".$value."\r\n";
           $data .="--$boundary\r\n";
       }
       $header .= "Content-length: " . strlen($data) . "\r\n\r\n";

       $fp = fsockopen($host, 80);

       if ($fp) {
           fputs($fp, $header.$data);
           $rsp = '';
           while(!feof($fp)) {
               $rsp .= fgets($fp,8192);
           }
           fclose($fp);
           $msg = explode("\r\n\r\n",trim($rsp));
           $rMsg = explode(",", $msg[1]);
           $Result= $rMsg[0]; //발송결과
           $Count= $rMsg[1]; //잔여건수

           //발송결과 알림
           if($Result=="success") {
               $alert = "성공";
               $alert .= " 잔여건수는 ".$Count."건 입니다.";
           }
           else if($Result=="reserved") {
               $alert = "성공적으로 예약되었습니다.";
               $alert .= " 잔여건수는 ".$Count."건 입니다.";
           }
           else if($Result=="3205") {
               $alert = "잘못된 번호형식입니다.";
           }

           else if($Result=="0044") {
               $alert = "스팸문자는발송되지 않습니다.";
           }

           else {
               $alert = "[Error]".$Result;
           }
       }
       else {
           $alert = "Connection Failed";
       }

        if($nointeractive=="1" && ($Result!="success" && $Result!="Test Success!" && $Result!="reserved") ) {
           echo "<script>alert('".$alert ."')</script>";
       }
       else if($nointeractive!="1") {
           echo "<script>alert('".$alert ."')</script>";
       }
       echo "<script>location.href='".$returnurl."';</script>";
   }

 

* calljson.php

<?php
    $oCurl = curl_init();
    $url =  "https://sslsms.cafe24.com/smsSenderPhone.php";
    $aPostData['userId'] = "!!! SMS 아이디 !!!"; // SMS 아이디
    $aPostData['passwd'] = "!!! 인증키 !!!"; // 인증키
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_POST, 1);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($oCurl, CURLOPT_POSTFIELDS, $aPostData);
    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, 0);
    $ret = curl_exec($oCurl);
    echo $ret;
    curl_close($oCurl);
            
?>

 

7. 소스 변형 (사실 이것도 테스트용으로 만든 것)

* index.php

<!DOCTYPE html>
<html lang="ko">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>sms - php</title>


  <script type="text/javascript">
    function setPhoneNumber(val) {
      var numList = val.split("-");
      document.smsForm.sphone1.value = numList[0];
      document.smsForm.sphone2.value = numList[1];
      if (numList[2] != undefined) {
        document.smsForm.sphone3.value = numList[2];
      }
    }

    function loadJSON() {
      var data_file = "./calljson.php";
      // var data_file = "/calljson.php";
      var http_request = new XMLHttpRequest();
      try {
        // Opera 8.0+, Firefox, Chrome, Safari
        http_request = new XMLHttpRequest();
      } catch (e) {
        // Internet Explorer Browsers
        try {
          http_request = new ActiveXObject("Msxml2.XMLHTTP");

        } catch (e) {

          try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {
            // Eror
            alert("지원하지 않는브라우저!");
            return false;
          }

        }
      }
      http_request.onreadystatechange = function() {
        if (http_request.readyState == 4) {
          // Javascript function JSON.parse to parse JSON data
          var jsonObj = JSON.parse(http_request.responseText);
          if (jsonObj['result'] == "Success") {
            var aList = jsonObj['list'];
            var selectHtml = "<select name=\"sendPhone\" onchange=\"setPhoneNumber(this.value)\">";
            selectHtml += "<option value='' selected>발신번호를 선택해주세요</option>";
            for (var i = 0; i < aList.length; i++) {
              selectHtml += "<option value=\"" + aList[i] + "\">";
              selectHtml += aList[i];
              selectHtml += "</option>";
            }
            selectHtml += "</select>";
            document.getElementById("sendPhoneList").innerHTML = selectHtml;
          }
        }
      }

      http_request.open("GET", data_file, true);
      http_request.send();
    }
  </script>
</head>

<body onload="loadJSON()">
  <form method="post" name="smsForm" action="./sms_sender.php">
    <input type="hidden" name="action" value="go">
    이름 <input type="text" name="mName" id="mName"><br>
    연락처 <input type="text" name="mTel" id="mTel"><br>
    문의상품 <input type="text" name="mPdt" id="mPdt"><br>
    지역
    <select name="mArea">
      <option value="지역 1">지역 1</option>
      <option value="지역 2">지역 2</option>
      <option value="지역 3">지역 3</option>
    </select><br>

    메모 <input id="msg" name="msg" maxlength="7" style="width:455px;">
    <br />
    <input type="hidden" name="sphone1">
    <input type="hidden" name="sphone2">
    <input type="hidden" name="sphone3">


    <label><input type="checkbox" name="agreements" onClick="agreeCheck(this.form)"> [필수] 동의해야 사용가능</label>
    <input type="submit" value="전송" name="button"  disabled>
  </form>
  <script>
    function agreeCheck(frm) {
      if (frm.button.disabled == true)
        frm.button.disabled = false
      else
        frm.button.disabled = true
    }
  </script>
</body>

</html>

 

# 체크박스 체크하면 전송 버튼 활성화 되게 해줌

<!-- 폼 태그 안 -->
<label><input type="checkbox" name="agreements" onClick="agreeCheck(this.form)"> [필수] 동의해야 사용가능</label>
<input type="submit" value="전송" name="button"  disabled>


<!-- 폼 태그 밖 -->
<script>
    function agreeCheck(frm) {
      if (frm.button.disabled == true)
        frm.button.disabled = false
      else
        frm.button.disabled = true
    }
</script>

 

* sms_sender.php

<?php
    if($_POST['action']=='go'){


      /******************** 인증정보 ********************/
       $sms_url = "https://sslsms.cafe24.com/sms_sender.php"; // HTTPS 전송요청 URL
       // $sms_url = "http://sslsms.cafe24.com/sms_sender.php"; // 전송요청 URL
       $sms['user_id'] = base64_encode("!!! SMS 아이디 !!!"); //SMS 아이디.
       $sms['secure'] = base64_encode("!!! 인증키 !!!") ;//인증키
       

       /*********** 추가 변수 ***********/
       $mName = $_POST['mName'];
       $mTel = $_POST['mTel'];
       $mPdt = $_POST['mPdt'];
       $mArea = $_POST['mArea'];
       $mTxt = $_POST['msg'];
       
       $mCont = '이름:'.$mName."\r\n".'연락처:'.$mTel."\r\n".'상품:'.$mPdt."\r\n".'지역:'.$mArea."\r\n".'메모:'.$mTxt;
       $sms['msg'] = base64_encode($mCont);
       
       switch ($mArea) {
          default :
          case '지역 1': $sms['rphone'] = base64_encode("!!! 수신 번호 1 !!!"); break;
          case '지역 2': $sms['rphone'] = base64_encode("!!! 수신 번호 2 !!!"); break;
          case '지역 3': $sms['rphone'] = base64_encode("!!! 수신 번호 3 !!!"); break;
         }
      /*********** 추가 변수 ***********/
         
       $sms['sphone1'] = base64_encode("!!! 발신 번호 앞자리 !!!");
       $sms['sphone2'] = base64_encode("!!! 발신 번호 중간자리 !!!");
       $sms['sphone3'] = base64_encode("!!! 발신 번호 뒷자리 !!!");
       $sms['mode'] = base64_encode("1"); // base64 사용시 반드시 모드값을 1로 주셔야 합니다.
      //  $sms['testflag'] = base64_encode($_POST['testflag']);
       $sms['testflag'] = base64_encode("Y");
       $returnurl = '/smstest';
       $nointeractive = ""; //사용할 경우 : 1, 성공시 대화상자(alert)를 생략

       $host_info = explode("/", $sms_url);
       $host = $host_info[2];
       $path = $host_info[3]."/".$host_info[4];

       srand((double)microtime()*1000000);
       $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
       //print_r($sms);

       // 헤더 생성
       $header = "POST /".$path ." HTTP/1.0\r\n";
       $header .= "Host: ".$host."\r\n";
       $header .= "Content-type: multipart/form-data, boundary=".$boundary."\r\n";

       // 본문 생성
       foreach($sms AS $index => $value){
           $data .="--$boundary\r\n";
           $data .= "Content-Disposition: form-data/; name=\"".$index."\"\r\n";
           $data .= "\r\n".$value."\r\n";
           $data .="--$boundary\r\n";
       }

       

       $header .= "Content-length: " . strlen($data) . "\r\n\r\n";

        $fp = fsockopen($host, 80);
          if ($fp) {
           fputs($fp, $header.$data);
           $rsp = '';
           while(!feof($fp)) {
               $rsp .= fgets($fp,8192);
           }
           fclose($fp);
           $msg = explode("\r\n\r\n",trim($rsp));
           $rMsg = explode(",", $msg[1]);
           $Result= $rMsg[0]; //발송결과
           $Count= $rMsg[1]; //잔여건수

           //발송결과 알림
           if($Result=="success") {
               $alert = "성공";
                $alert .= " 잔여건수는 ".$Count."건 입니다.";
           }
           else if($Result=="reserved") {
               $alert = "성공적으로 예약되었습니다.";
               $alert .= " 잔여건수는 ".$Count."건 입니다.";
           }
           else if($Result=="3205") {
               $alert = "잘못된 번호형식입니다.";
           }

           else if($Result=="0044") {
               $alert = "스팸문자는발송되지 않습니다.";
           }

           else {
               $alert = "[Error]".$Result;
           }
       } else {
           $alert = "Connection Failed";
       }

    //     if($nointeractive=="1" && ($Result!="success" && $Result!="Test Success!" && $Result!="reserved") ) {
    //        echo "<script>alert('".$alert ."')</script>";
    //    }
    //    else if($nointeractive!="1") {
    //        echo "<script>alert('".$alert ."')</script>";
    //    }


       echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><script>alert('담당자에게 전달 되었습니다. 감사합니다.')</script>";
       echo "<script>location.href='".$returnurl."';</script>";
   }

 

# 폼 입력에 따라 메시지 내용이 들어갔으면 해서 변수($mCont)에 post값 받아서 넣어줌

$mName = $_POST['mName'];
$mTel = $_POST['mTel'];
$mPdt = $_POST['mPdt'];
$mArea = $_POST['mArea'];
$mTxt = $_POST['msg'];

$mCont = '이름:'.$mName."\r\n".'연락처:'.$mTel."\r\n".'상품:'.$mPdt."\r\n".'지역:'.$mArea."\r\n".'메모:'.$mTxt;
$sms['msg'] = base64_encode($mCont);

 

# 지역에 따라 수신자(담당자)를 다르게 설정하고 싶어서 switch문 사용

switch ($mArea) {
    default :
    case '지역 1': $sms['rphone'] = base64_encode("!!! 수신 번호 1 !!!"); break;
    case '지역 2': $sms['rphone'] = base64_encode("!!! 수신 번호 2 !!!"); break;
    case '지역 3': $sms['rphone'] = base64_encode("!!! 수신 번호 3 !!!"); break;
}

 

# 로컬은 괜찮은데, 서버에 올리면 alert 스크립트 한글이 깨지길래

스크립트 태그 앞에 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> 붙임 : 성공!!!

echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><script>alert('담당자에게 전달 되었습니다. 감사합니다.')</script>";

 

* calljson.php : 그대로 사용

 

8. 장문이면 오류나서 메모 input에 maxlength 걸어줌

메모 <input id="msg" name="msg" maxlength="7" style="width:455px;"></input>

 

9. 일단 생각나는 건 여기까지 끝

이렇게 폼 입력 후 전송하면
이렇게 문자 도착

 

728x90