홈페이지에서 문의 폼 작성하면
그 내용이 담당자 휴대폰 메시지로 발송되게끔 작업
1. cafe24 sms 호스팅
2. 문자 보내기 설정
3. API 발송IP 설정
4. 발신번호 관리
* 발신번호 등록시 서류 필요한데 아래 링크 참고하여, 서류 제출
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