sms 문자인증
본문
안녕하세요.
회원가입 시 sms 문자인증으로 실 사용 핸드폰번호 인증을 받을려고 합니다.
그래서,
문자서비스 업체에 api 서비스를 신청해서 api 연동 정의서를 받았는데요.
어떻게 세팅해야 하는지 모르겠네요.
고수님들의 감사한 조언 부탁드립니다.
1. POST 방식으로 호출
2. API 키 받았습니다.
3. HTTP URL 받았습니다.
4. Method = POST
5. Content-Type = application/json
- API Common Header
- Parameter 형식 (POST 방식)
파라미터명 타입 필수여부 기본값 설명
callerNo texs Y 발신번호 사이트에 등록 및 승인 되어야 한다
smsType text SMS SMS:단문문자, LMS:장문문자
adYn text N N:일반문자, Y:광고문자, E:선거문자
reserveYn text N N:즉시발송, Y:예약발송
sendDate text 현재시간 문자발송 시간 YYYYMMDD24HHMM
title text 문자제목 (장문문자일 경우 지원)
message text Y 문자내용
receiveNos text Y 수신번호 구분자# 예) *** 개인정보보호를 위한 휴대폰번호 노출방지 ***#*** 개인정보보호를 위한 휴대폰번호 노출방지 ***
kind text I:국제문자, L:국자문자 MMS(국제문자 사용시에만)
contry text 국가코드 (81, 86 등) (국제문자 사용시에만)
어떻게 하면 될까요?
고수님들의 감사한 조언 부탁드립니다.
답변 6
<?php
$data = array();
$data['callerNo'] = '발신번호'; // ex.31011112222
$data['message'] = '내용';
$data['receiveNos'] = '수신번호'; // ex.31022223333
$url = "https://~";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, true);
$response = curl_exec($ch);
curl_close($ch);
//echo $response;
$arr = json_decode($response);
print_r($arr);
1.
$data['message'] = '[회사명] 인증번호를 입력해 주세요.';
->
$data['message'] = '[회사명] 인증번호 [' . $a_num . ']를 입력해 주세요.';
2. SMS 호출 코드는 ajax_send.php 파일에만 들어가야 합니다.
ajax_check.php 는 SMS 발송하는 페이지가 아니기 때문에 SMS 호출코드가 들어가지 않는 것이 맞습니다.
원 ajax_check.php 는 수정할 곳이 없는 페이지입니다.
3. ajax_send.php 와 ajax_check.php 등의 원파일에서..
SMS 발송부분만 변경하면 됩니다.
다른 부분은 변경하지 않는 것이 좋습니다.
변수명 등을 변경하게 되면.. 꼬일 수가 있습니다.
$receiveNos = trim($_POST['mb_hp']);
$data['receiveNos'] = $receiveNos;
$aa = trim($_POST['mb_hp']);
$data['receiveNos'] = $aa;
로 해도 똑같은 작동을 하는 코드입니다.
$receiveNos = trim($_POST['mb_hp']);
게 변경하는 것은 꼭 필요한 경우가 아니라면.. 굳이 하지 않아도 되는 부분입니다.
ajax_send.php, ajax_check.php 등 원 파일을 최초의 상태로 돌린후에 다시 시도하는 것을 추천합니다.
ajax_check.php 등이 정말 문제가 있다면..
SMS 발송 문제를 해결한 뒤에.. 그 때 별도로 검토해도 됩니다.
4. 먼저 SMS 발송 테스트 파일을 만들어서 SMS 발송 테스트를 하고.. ex. /sms_test.php
SMS 발송 테스트가 성공하면.. ajax_send.php 의 SMS 발송부분만 변경하면 되는 것입니다.
* /sms_test.php (브라우저 실행 -> ~/sms_test.php 접속 -> SMS 수신되는지 확인)
SMS 수신이 확인된다면.. 수신이 안된다면 이 테스트 페이지 코드로 업체에 문의
해당 코드에서 $data['callerNo'] ~ $data['receiveNos'] 부분만
해당 페이지의 변수를 활용하는 코드로 변경해주면 됩니다.
and
$arr = json_decode($response);
print_r($arr)
는 삭제
<?php
include_once('./common.php');
$url = "https://api.sendm.co.kr/v1/sms/send";
$commonHeaders = array(
"user-id: abcd",
"api-key: 1234",
);
$data = array();
$data['callerNo'] = '31011112222'; // 실제 발신번호(회신번호)로 변경
$a_num = rand(10000, 99999);
$data['message'] = '인증번호 [' . $a_num . ']를 입력해 주세요.';;
$data['receiveNos'] = '31022223333'; // 실제 테스트 수신번호로 변경
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $commonHeaders);
$response = curl_exec($ch);
curl_close($ch);
//echo $response;
$arr = json_decode($response);
print_r($arr)
$commonHeaders = array(
"user-id: 회원id",
"api-key: 받은 api-key",
);
sms_test.php 에서 이 코드로 발송 성공이 된다면.. 이미 검증이 된 코드인 것입니다.
sms_test.php 에서 이 코드로 발송 성공이 안된다면.. 되는 코드로 변경하여 검증을 하면 됩니다.
검증된 코드는 ajax_send.php 에서 이부분에 뭔가를 추가하거나 수정할 필요가 전혀 없는 것입니다.
$sms_content = "본인확인 인증번호[".$a_num.']를 화면에 입력해주세요';
$sms_content = '본인확인 인증번호['.$a_num.']를 화면에 입력해주세요';
두번째가 더 적절한 편이지만.. 첫번째도 동작은 합니다.
이 부분도 이 코드로 sms 테스트 파일로 sms 발송이 되고, 발송내용이 내가 원하는 대로 왔다면..
수정할 필요가 (긴급하게는) 없는 것입니다.
sms 발송이 되지 않는 직접적 요인은 아닌 것입니다.
***********************************************************************
애초에 이 문제는 ajax_send.php 에서 sms 발송 코드 부분만을.. 새 sms 업체에서 요구하는 것에 맞게 변경해주면 끝인 문제입니다.
1차로 sms_test.php 파일로 sms 발송을 성공시킨 뒤,
2차로 해당 코드를 그대로 옮긴 후 테스트 (최상단의 include와 마지막 echo 부분은 제외)
3차로 하나씩 변경해보면서 테스트하면 됩니다.
1. ajax_send.php 를 최초의 상태로 돌립니다.
2. ajax_send.php 최초의 상태에서.. SMS 발송코드 부분인
$SMS = new SMS;
~
$SMS->Send();
4라인을 삭제합니다.
3. 4라인 삭제한 상태에서, 그 라인에.. sms_test.php 에 적용한 코드를 넣습니다.
$arr = json_decode($response);
print_r($arr)
은 필요없는 내용이니.. 제외
=> 여기서 일단 테스트
* ajax_send.php
<?php
include_once('../common.php');
$a_auth = trim($_POST['a_auth']);
$recv_number = trim($_POST['mb_hp']);
$sql = "select count(*) as cnt from sms_auth where a_hp='$recv_number' and a_auth>'".(time()-60*10)."' "; // 현재 10분 입니다. 추후 10을 변경하시면 됩니다.
$row = sql_fetch($sql);
if ($row[cnt]>5){ //제한 횟수
echo "F";
}else{
if($config['cf_sms_use'] == 'icode') {
include_once(G5_LIB_PATH.'/icode.sms.lib.php');
$a_num = rand(10000, 99999);
$sms_content = "본인확인 인증번호[".$a_num.']를 화면에 입력해주세요';
$send_number = preg_replace('/[^0-9]/', '', $sms5['cf_phone']);
if($recv_number) {
sql_query("insert into sms_auth set a_auth='$a_auth', a_num='$a_num', a_hp='$recv_number', a_regdate=now()");
$url = "문자서비스 회사가 제공한 서버 URL을 넣었습니다.";
$commonHeaders = array(
"content-type: application/json",
"user-id: 회원id",
"api-key: 받은 api-key",
);
$a_num = rand(10000, 99999);
$data2 = '{"callerNo": "등록된 발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "수신번호"}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data2);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $commonHeaders);
$response = curl_exec($ch);
curl_close($ch);
}
echo "Y";
exit;
}else{
echo "N";
}
}
?>
5. 수신번호 부분만 변수로 변경해 줍니다.
$data2 = '{"callerNo": "등록된 발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "수신번호"}';
=>
$data2 = '{"callerNo": "등록된 발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "' . $recv_number . '"}';
* ajax_send.php (최종)
<?php
include_once('../common.php');
$a_auth = trim($_POST['a_auth']);
$recv_number = trim($_POST['mb_hp']);
$sql = "select count(*) as cnt from sms_auth where a_hp='$recv_number' and a_auth>'".(time()-60*10)."' "; // 현재 10분 입니다. 추후 10을 변경하시면 됩니다.
$row = sql_fetch($sql);
if ($row[cnt]>5){ //제한 횟수
echo "F";
}else{
if($config['cf_sms_use'] == 'icode') {
include_once(G5_LIB_PATH.'/icode.sms.lib.php');
$a_num = rand(10000, 99999);
$sms_content = "본인확인 인증번호[".$a_num.']를 화면에 입력해주세요';
$send_number = preg_replace('/[^0-9]/', '', $sms5['cf_phone']);
if($recv_number) {
sql_query("insert into sms_auth set a_auth='$a_auth', a_num='$a_num', a_hp='$recv_number', a_regdate=now()");
$url = "문자서비스 회사가 제공한 서버 URL을 넣었습니다.";
$commonHeaders = array(
"content-type: application/json",
"user-id: 회원id",
"api-key: 받은 api-key",
);
$a_num = rand(10000, 99999);
$data2 = '{"callerNo": "등록된 발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "' . $recv_number . '"}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data2);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $commonHeaders);
$response = curl_exec($ch);
curl_close($ch);
}
echo "Y";
exit;
}else{
echo "N";
}
}
?>
ajax_check.php 파일을 최초의 상태에서 변경한 부분이 있다면..
그 점 때문에 문제가 생겼을 수 있습니다.
ajax_check.php 를 먼저 최초의 상태로 돌린 후 확인해 볼 수 있습니다.
-------------------------------
ajax_send.php 에서는
* 인증번호 생성
* 인증번호 DB 저장 (sms_auth 테이블의 a_num 칼럼에 저장)
* 인증번호 SMS 로 발송
으로 되어 있습니다.
ajax_check.php 는,
사용자가 입력한 인증번호를,
DB 에 저장되어 있는 인증번호와 (sms_auth 테이블의 a_num 칼럼에 저장되어있는 값)
체크하는 것으로 되어 있습니다.
ajax_send.php 에서 인증번호가 DB 에 저장이 되는지,
DB 에 저장된 인증번호로 SMS 발송이 되는지,
ajax_check.php 에서 문제는 없는지 확인해 볼 수 있습니다.
DB 내용을 확인하는 방법중에 하나는 adminer 툴을 사용하는 것입니다. https://sir.kr/g5_tip/15716
ajax_send.php, ajax_check.php 는 ajax로.. 백그라운드로 작동하기 때문에 디버깅이 어려운 편입니다.
DB 저장, DB 체크부분만을 따로 떼어내서..
테스트 파일을 만들어 확인하면서 문제지점을 하나씩 체크해볼 수 있습니다.
처음부터 다시 찬찬히 생각해보면..
휴대폰 인증 스킨 파일 https://sir.kr/g5_skin/20988
에서 기본 핵심파일은,
sms.php
ajax_send.php
ajax_check.php
입니다.
이 파일에서 문제는.. (해당 스킨 등록자의 실수)
db 의 a_num 칼럼 타입은 4자리인데, 인증 번호 발송 소스는 5자리인 것이 있습니다.
=> a_num 칼럼 타입 5자리 수정으로 문제 해결
ajax_send.php 파일은 '인증번호 생성 및 DB 저장', '인증번호 SMS 발송' 역할 파일이고
ajax_check.php 파일은 '인증번호 체크' 역할 파일입니다.
ajax_send.php 파일의 sms 발송 부분이 icode 사용을 기본으로 하였기 때문에.. 이 부분만 새로 계약한 sms 업체 모듈로 변경하는 것이.. 일종의 '과제' 였습니다.
=> 즉, sms.php, ajax_check.php 는 일단 전혀 수정하지 않아도 되는 파일입니다. (혹 변경한 부분이 있다면 최초로 돌리는 것 권장입니다.)
ajax_send.php 의 sms 발송부분만 변경해주면 됩니다.
여기서 저의 실수/잘못은 2가지 정도가 있었습니다.
1) 해당 업체의 api 에서 요청한 것은 전달받으려는 발신번호, 내용, 수신번호 데이터 형태가 JSON 형태이어야 한다는 것..
2) sms_test.php 의 내용을 ajax_send.php 에 적용함에 있어서.. 인증번호 $a_num 두번 생성으로.. db 저장 따로 sms 발송 따로가 된 것..
3) 작은 부분이지만.. 소스상으로 그누보드 관리자의 sms 사용 체크 부분이 안되면 sms 발송이 안된다는 점
최초의 ajax_send.php 에서 1), 2), 3)을 적용하면 다음의 소스가 최종이 될 것입니다.
<?php
include_once('../common.php');
$a_auth = trim($_POST['a_auth']);
$recv_number = trim($_POST['mb_hp']);
$sql = "select count(*) as cnt from sms_auth where a_hp='$recv_number' and a_auth>'".(time()-60*10)."' "; // 현재 10분 입니다. 추후 10을 변경하시면 됩니다.
$row = sql_fetch($sql);
if ($row[cnt]>5){ //제한 횟수
echo "F";
}else{
if (true) {
$a_num = rand(10000, 99999);
$sms_content = '본인확인 인증번호['.$a_num.']를 화면에 입력해주세요';
$send_number = preg_replace('/[^0-9]/', '', $sms5['cf_phone']);
if ($recv_number) {
sql_query("insert into sms_auth set a_auth='$a_auth', a_num='$a_num', a_hp='$recv_number', a_regdate=now()");
$url = "문자서비스 회사가 제공한 서버 URL을 넣었습니다.";
$commonHeaders = array(
"content-type: application/json",
"user-id: 회원id",
"api-key: 받은 api-key",
);
$data2 = '{"callerNo": "등록된 발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "' . $recv_number . '"}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data2);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $commonHeaders);
$response = curl_exec($ch);
curl_close($ch);
}
echo "Y";
exit;
}else{
echo "N";
}
}
?>
초최의 sms.php, ajax_send.php 는 (일단은) 전혀 수정하지 않아도 됩니다.
변수명 수정 등은 향후 변경을 검토할 수 있습니다.
그래도 안된다면..
* ajax_check.php ( ※ https://sir.kr/qa/306759 )
if ($row[a_num]==$auth_num){
→
if ($row['a_num']==$auth_num){
!-->