sms 문자인증

sms 문자인증

QA

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

* /sms_test.php

<?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);

답변 정말 감사드립니다.
그런데...
제가 말씀하신 부분을

https://sir.kr/g5_skin/20988?sfl=wr_subject&stx=%EC%9D%B8%EC%A6%9D

에 적용할려고 하는데...

/adm/config_form.php 와 config_form_update.php
/register_form.skin.php
/register_form_update.php 파일은 변경은 완료 했습니다.
그런데...
말씀하신 부분은 분명
ajax_send.php 에 들어가야 할 것 같은데...
어떻게 넣으면 될까요?

제가 정말 초보이다보니 모르겠습니다. ㅠㅠ
추가적으로 감사한 조언 부탁드립니다. 꾸벅.


sms.php 팝업 창 화면은 이미지 붙여넣기가 안되어서 내용으로 보여드리면


휴대폰인증

1) 문자를 못 받으셨을 경우는 아래에 재전송 눌러주세요.
   *** 개인정보보호를 위한 휴대폰번호 노출방지 ***   재전송(버튼)
2) 휴대폰으로 전송된 5자리 인증번호를 입력하세요.
    인증번호 :                  입력(버튼)


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()");

			$SMS = new SMS; // SMS 연결
			$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']);
			$SMS->Add($recv_number, $send_number, $config['cf_icode_id'], iconv("utf-8", "euc-kr", stripslashes($sms_content)), "");
			$SMS->Send();
		}

		echo "Y";
		exit;
	}else{
		echo "N";
	}
}
?>


ajax_check.php 파일 내용은

<?php
include_once('../common.php');

$a_auth      = trim($_POST['a_auth']);
$auth_num    = trim($_POST['auth_num']);
$recv_number = trim($_POST['mb_hp']);

$sql = "select * from sms_auth where a_hp='$recv_number' and a_auth='$a_auth' order by a_auth desc";
$row = sql_fetch($sql);
if ($row[a_num]==$auth_num){
	echo "Y";
}else{
	echo "N";
}
?>


입니다.

정말 감사드립니다.
말씀하신것 처럼

* 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()");

			$data = array();
			$data['callerNo'] = '발신번호'; // ex.31011112222
			$data['message'] = '내용';
			$data['receiveNos'] = '수신번호'; // ex.31022223333
			
			$url = "https://api.sendm.co.kr/v1/sms/send";
			
			$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);
				
		}

		echo "Y";
		exit;
	}else{
		echo "N";
	}
}
?>


이렇게 바꿨습니다.

그런데...
API 키 받은 것은 어디에 넣어야 하는 건가요?

너무 초보적인 질문이라 죄송합니다. ㅠㅠ
한번 더 감사한 조언 부탁드립니다.

감사합니다.

1. 발신번호, 수신번호, 내용 부분은 해당 페이지의 코드에 맞게 변경해야 됩니다.
관리자 페이지에 발신번호(회신번호) 가 저장되어 있지 않다면, 실제 번호를 입력해야 합니다.
$data['message'] = '내용'; 코드를 그대로 쓰면 SMS 를 받는 사람은 '내용' 이라는 글자를 보게 됩니다.


$data['callerNo'] = $send_number; // or $data['callerNo'] = '실제 발신번호'; 
$data['message'] = $sms_content;
$data['receiveNos'] = $recv_number;


2. 키값을 어디에 어떻게 넣어야 하는지는 제가 알 수 없습니다.
API 매뉴얼에 해당 내용이 나와있는지 확인해 볼 수 있습니다.
다음과 같은 형태일수는 있으나 정확한 것은 매뉴얼을 확인해야 됩니다.

$data['callerNo'] = '31022223333';
$data['message'] = $sms_content;
$data['receiveNos'] = $recv_number;
$data['key'] = 'abc123';

안녕하세요.
아직 완료하지 못하고 추가 조언 부탁드립니다. ㅠㅠ
죄송하고 감사합니다. 꾸벅.

문자서비스 회사에 문의하니까 POST 방식으로 와야 하는데 GET 방식으로 호출을 해서 끊긴다고 하네요. ㅠㅠ
어떻게 하면 좋을까요?

그리고,
조언해주신
$data['message'] = $sms_content; 부분은
$data['message'] = '[회사명] 인증번호를 입력해 주세요.';
이렇게 바꿨는데 이렇게 하면 보통 문자인증 번호 받는 것 처럼
"[회사명] 인증번호 [00000]를 입력해 주세요" 이렇게 문자가 전송되는 건가요?
정말 초보다 보니 구글링을 해서 알아봐도 잘 모르겠네요.
추가적인 감사한 조언 부탁드립니다. 꾸벅.


1. api-key 부분 문의 드린 것은 API  호출시 공통된 해더 파일 값이라고 하여
API Common Header 로 처리하였습니다.
그래서
ajax_send.php 과 ajax_check.php 맨 윗 부분에 이렇게 넣었습니다.


<?php
include_once('../common.php');

// API 엔드포인트 URL
$apiUrl = "문자서비스 회사가 제공한 서버 URL을 넣었습니다.";

// 공통 헤더 설정
$commonHeaders = array(
    "user-id: 받은 id 입력했습니다",
    "api-key: 받은 api-key 입력했습니다.",
);

// cURL 초기화
$ch = curl_init();

// cURL 옵션 설정
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $commonHeaders);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// API 호출 수행
$response = curl_exec($ch);

// cURL 세션 종료
curl_close($ch);

// API 응답 처리
if ($response === false) {
    echo "API 호출 실패: " . curl_error($ch);
} else {
    echo "API 응답: " . $response;
}
// 공통 헤더 설정 완료



ajax_send.php 파일 내용 중에
$a_auth  = trim($_POST['a_auth']); 이 부분은
$sendDate = trim($_POST['sendDate']); 이렇게 바꿨습니다. 문자 발송 시간이 들어가는 것 같아서요.
그리고, 2줄 추가했습니다.
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:: application/json'));

그래서 최종적으로 이렇게 만들었습니다.

api-key 들어가는 공통 header


$receiveNos = trim($_POST['mb_hp']);

$sql = "select count(*) as cnt from sms_auth where a_hp='$receiveNos' and sendDate>'".(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($receiveNos) {
			sql_query("insert into sms_auth set sendDate='$sendDate', a_num='$a_num', a_hp='$receiveNos', a_regdate=now()");

			$data = array();
			$data['callerNo'] = $send_number; // or $data['callerNo'] = '실제 발신번호'; 
			$data['message'] = '[회사명] 인증번호를 입력해 주세요.';
			$data['receiveNos'] = $receiveNos;
			
			$url = "문자서비스 회사가 제공한 서버 URL을 넣었습니다";
			
			$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);       
			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
			curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:: application/json'));
		
			$response = curl_exec($ch);
			curl_close($ch);
			
			//echo $response;
			$arr = json_decode($response);
			print_r($arr);
				
		}

		echo "Y";
		exit;
	}else{
		echo "N";
	}
}
?>


그리고,
ajax_check.php 파일 내용은
$a_auth  = trim($_POST['a_auth']); 이 부분은
$sendDate = trim($_POST['sendDate']); 이렇게 바꿨습니다. 문자 발송 시간이 들어가는 것 같아서요.
그래서 최종적으로 이렇게 만들었습니다.

api-key 들어가는 공통 header

$sendDate = trim($_POST['sendDate']);
$auth_num = trim($_POST['auth_num']);
$receiveNos = trim($_POST['mb_hp']);

$sql = "select * from sms_auth where a_hp='$receiveNos' and sendDate='$sendDate' order by sendDate desc";
$row = sql_fetch($sql);
if ($row[a_num]==$auth_num){
	echo "Y";
}else{
	echo "N";
}

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)

조언 너무나 감사드립니다. 꾸벅.

말씀하신데로 다 했는데 안되네요. ㅠㅠ
한번만 더 확인 부탁드립니다.
만약 틀린 부분이 없다면 해당 코드에서 $data['callerNo'] ~ $data['receiveNos'] 부분만 문자메세지 업체에 확인하겠습니다.

너무나 감사드립니다.

ajax_send.php 원본 파일에서
1. $commonHeaders 를 넣었습니다.
2. 발신번호는 사이트에 등록 및 승인 되어야 한다고 해서 $data['callerNo'] = $send_number; 이렇게 바꾸고, $data['message'], $data['callerNo'] = $send_number; 만 바꿨습니다.
3. //echo $response;
  $arr = json_decode($response);
  print_r($arr);  삭제했습니다
4. $ch = curl_init(); 이 부분은 맨 마지막에 말씀해주신데로 바꿨습니다.

그래서 이렇게 했습니다.


<?php
include_once('../common.php');

$commonHeaders = array(
    "user-id: 회원id",
    "api-key: 받은 api-key",
);

$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');

		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()");

			$data = array();
			$data['callerNo'] = $send_number; // 실제 발신번호(회신번호)로 변경
			$a_num = rand(10000, 99999);
			$data['message'] = '본인확인 인증번호[' . $a_num . ']를 화면에 입력해주세요.';
			$data['receiveNos'] = $recv_number; // 실제 테스트 수신번호로 변경
			 
			$url = "문자메세지회사 서버 URL";

			$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 "Y";
		exit;
	}else{
		echo "N";
	}
}
?>


그리고
ajax_check.php 는 원래데로 돌려 놓았습니다.
$recv_number = trim($_POST['mb_hp']); 이 부분 포함 원본 파일 그대로 입니다.


<?php
include_once('../common.php');

$a_auth      = trim($_POST['a_auth']);
$auth_num    = trim($_POST['auth_num']);
$recv_number = trim($_POST['mb_hp']);

$sql = "select * from sms_auth where a_hp='$recv_number' and a_auth='$a_auth' order by a_auth desc";
$row = sql_fetch($sql);
if ($row[a_num]==$auth_num){
	echo "Y";
}else{
	echo "N";
}
?>

1차는 테스트 파일(샘플 파일)로 테스트를 수행하는 것입니다.

1. 웹 루트 디렉토리에 sms_test.php 생성
2. sms 발송 테스트 코드 작성
3. 브라우저에서 ~/sms_test.php  접속
4. 테스트 성공/실패 여부 확인

성공시 -> ajax_send.php 파일에 맞게 적용
실패시 -> 디버깅(문제 원인 찾기) 및 업체에 문의

조언 너무나 감사드립니다.
말씀하신데로 sms_test.php 파일을 만들어서 테스트 했습니다.
그런데 아무것도 뜨지를 않네요.

sms_test.php 파일을 이렇게 만드는 것이 맞는 건가요?
제가 테스트 파일을 잘못 만든 건가요? ㅠㅠ



<?php
        $url = "문자서비스 회사가 제공한 서버 URL을 넣었습니다.";
        $commonHeaders = array(
               "user-id: 받은 id 입력했습니다",
               "api-key: 받은 api-key 입력했습니다.",

        );
        $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)
        ?>


그래서 제가 잘못 만들었나해서

원 sms.php 파일의 맨처음 나오는 <script 전에 위의 코드를 입력했는더니
"요청하신 휴대폰으로 '인증번호'가 발송되었습니다." alert 내용은 안뜨고
sms.php 팝업했을 때 화면만 뜨네요. ㅠㅠ

맞습니다.

화면에 아무것도 뜨지 않는다면,

에러가 발생했고.. (보안상의 이유로) 에러메시지 출력 off 상태일 수 있습니다.

에러 메시지 출력을 위해 상단에 다음의 코드를 추가해서 다시 확인해 볼 수 있습니다.
https://www.codingfactory.net/12217

error_reporting( E_ALL );
ini_set( "display_errors", 1 );

에러 메시지가 나오면.. 에러 메시지를 구글에 검색하여 문제를 해결해가면 됩니다.

에러가 없는데, 빈화면이라면..
해당 테스트 코드에 어떤 문제가 있는지 sms 업체에 문의해볼 수 있습니다.

조언 너무나 감사합니다.
말씀하신데로 하면서 업체에 문의했더니 수정해 줘서 호출까지는 성공했습니다.
너무나 감사드립니다.
그런데 호출에 성공한 것은 sms_test.php 파일로 했을때 성공한 것이고.
ajax_send.php 파일에 적용했더니 호출이 안되네요. ㅠㅠ

그리고,
sms_test.php 파일을 그냥 ajax_send.php 파일로 적용해서 해보면
호출 문자는 오는데...
호출하면서 받은 문자 메세지 인증번호를 입력하면
"입력하신 '인증번호'가 일치하지 않습니다." 라고 뜨네요.

너무나도 감사한 조언 한번더 부탁드립니다. 꾸벅.

ajax_send.php 파일 입니다.


<?php
include_once('../common.php');

		$url = "문자서비스 회사가 제공한 서버 URL을 넣었습니다.";

		$commonHeaders = array(
			"user-id: 받은 id 입력했습니다",
			"api-key: 받은 api-key 입력했습니다."
		);

		$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);
				$data2 = '{"callerNo": "발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "수신번호"}';		

				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()");

					$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 파일 입니다.

<?php
include_once('../common.php');

$a_auth      = trim($_POST['a_auth']);
$auth_num    = trim($_POST['auth_num']);
$recv_number = trim($_POST['mb_hp']);

$sql = "select * from sms_auth where a_hp='$recv_number' and a_auth='$a_auth' order by a_auth desc";
$row = sql_fetch($sql);
if ($row[a_num]==$auth_num){
	echo "Y";
}else{
	echo "N";
}
?>

sms_test.php 파일은 sms 발송 테스트 파일입니다.
이 파일이 ajax_send.php 를 대체할 수 없는 것은 자명한 사실입니다.

sms_test.php 파일로도 sms 발송이 안된다면..
해당코드를 적용한 ajax_send.php 파일에서 sms 발송이 될 리는 없습니다.

ajax 파일은 백그라운드로 작동하는 파일이기 때문에 디버깅(테스트/확인)이 어렵기도 합니다.
그래서 테스트 파일을 꼭 먼저 생성하고 테스트하기를 추천한 것입니다.
그렇지를 않아서.. 저 또한 많은 시간 소모와 고생을 했습니다.

아마도 sms_test.php 파일에서 잘못된 부분은 api 주소에 데이터를 json 타입으로 전달해주어야 하는데.. 그렇지 않은 것으로 보입니다.
json_encode() 함수를 활용할 수 있습니다.
$data2 = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data2);

그리고 ajax_send.php 에서 발신넘버는 $send_number 이고,
$send_number 는 sms 관리자의 발신번호 DB 값과 매칭되어 있습니다.

그누보드 관리자 > SMS 관리자 > 발신번호 항목에 발신번호가 꼭 등록되어 있어야 합니다.
이러한 부분도 발신번호, 수신번호 부분 등은 sms_test.php 와 똑같이 해서
먼저 테스트해본 다음..
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()");

			$data = array();
			$data['callerNo'] = $send_number; 
			$a_num = rand(10000, 99999);
			$data['message'] = '본인확인 인증번호[' . $a_num . ']를 화면에 입력해주세요.';
			$data['receiveNos'] = $recv_number; 
			
			$data2 = json_encode($data);
						
			$url = "https://api.sendm.co.kr/v1/sms/send";
			$commonHeaders = array(
			    "user-id: 회원id",
			    "api-key: 받은 api-key",
			);

			
			$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, $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_test.php 파일은 정상적으로 발송이 되어서
말씀하신 것 처럼 ajax_send.php 파일에 sms_test.php을 적용시켜서
정상적으로 ajax_send.php 파일을 만드는 것인데...
조언해 주신 내용으로 해 보았는데 발송이 안되네요. ㅠㅠ

그리고, 말씀하신
"그누보드 관리자 > SMS 관리자 > 발신번호 항목에 발신번호가 꼭 등록되어 있어야 합니다."
이 부분은 관리자 페이지에 "아이코드" 문자서비스 밖에 안되네요. ㅠㅠ

저는 다른 업체 등록해서 회원가입 및 발신번호 등록해서.
sms_test.php 파일은 정상적으로 발송되었거든요.

그리고 조언해 주신 파일에 이부부은
$sms_content = "본인확인 인증번호[".$a_num.']를 화면에 입력해주세요';
이렇게 수정했는데
$sms_content = '본인확인 인증번호['.$a_num.']를 화면에 입력해주세요';
맞는 건가요?

그리고, 이 부분은
$commonHeaders = array(
"user-id: 회원id",
 "api-key: 받은 api-key",
);

$commonHeaders = array(
"content-type: application/json",
"user-id: 회원id",
 "api-key: 받은 api-key",
);
이렇게 수정해 봤는데도 발송이 안되어 많이 답답하네요. ㅠㅠ

어떻게 하면 sms_test.php 을 ajax_send.php 파일에 적용할 수 있을까요?

성공적으로 발송된 sms_test.php 파일 다시한번 올리니 다시한번 확인 후 너무나도 감사한 조언 부탁드립니다. 꾸벅

테스트 성공한 sms_test.php 파일


<?php
  error_reporting( E_ALL );
  ini_set( "display_errors", 1 );
?>

<?php
        $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 $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";
    }
}
?>

조언 너무나 감사드립니다.

그런데... 말씀하신 3. 부분에서 테스트 하면 "N" 이 뜨네요.

3. 4라인 삭제한 상태에서, 그 라인에.. sms_test.php 에 적용한 코드를 넣습니다.
$arr = json_decode($response);
print_r($arr)
은 필요없는 내용이니.. 제외
=> 여기서 일단 테스트

N 이 뜨는 이유가 뭘까요?
오류 싸인을 받아볼려고 맨 윗부분에
<?php
  error_reporting( E_ALL );
  ini_set( "display_errors", 1 );
?>
를 추가했는데도 "N" 만 뜨네요.
어떻게 오류를 확인할 수 있을까요?
죄송하지만 추가 조언 부탁드립니다. 감사합니다. 꾸벅

if (조건) {
  echo 'Y';
} else {
  echo 'N';
}

에서 'N' 이 나왔다면  if 조건이 참이 아니라서 'N' 이 나온 것입니다.
에러는 아닙니다.

if ($config['cf_sms_use'] == 'icode') {
가 거짓 판정을 받은 것입니다.

생각해보니...

다운받은  ajax_send.php 는 그누보드 sms를 icode 를 사용한다는 것을 전제로 한 코드입니다.
그누보드 SMS 관리자에서 sms 사용 부분이 체크되어 있지 않아서 생긴 문제인 듯 합니다.

if ($config['cf_sms_use'] == 'icode') {

if (true) {
로 변경하면 됩니다.

말씀하신데로 적용했더니...
발송에 성공해서 인증문자를 받았습니다.
너무나 감사드립니다.

그런데...

발송된 인증문자를 입력하면
"입력하신 '인증번호'가 일치하지 않습니다."
뜨네요. ㅠㅠ

이 부분도 한번 확인 부탁드립니다.
너무나 죄송하고 너무나 감사드립니다. 꾸벅.

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 체크부분만을 따로 떼어내서..

테스트 파일을 만들어 확인하면서 문제지점을 하나씩 체크해볼 수 있습니다.

답변 너무나 감사드립니다. 꾸벅
그런데...
sms_auth 테이블의 a_num 칼럼이 문자메세지로 온 인증번호와 다르네요. ㅠㅠ
숫자도 4자리 숫자로 저장되었구요. ㅠㅠ

추가 조언 부탁드립니다.
너무나 죄송하고 너무나 감사드립니다. 꾸벅

* ajax_send.php
$a_num = rand(10000, 99999);
~
sql_query("insert into sms_auth set a_auth='$a_auth', a_num='$a_num', a_hp='$recv_number', a_regdate=now()");
~
$a_num = rand(10000, 99999);
$data2 = '{"callerNo": "등록된 발신번호", "message": "인증번호 [' . $a_num . ']를 입력해 주세요.", "receiveNos" : "' . $recv_number . '"}';       

* $a_num 생성 ex. 33725
* sms_auth 테이블에 $a_num 저장 (ex. 33725)

* 또다시 $a_num 생성 ex. 44844
* 다른 $a_num 으로 발송 (ex. 44844)

코드로 되어 있습니다.
DB 에는 33725 가 저장되어 있는데.. sms 로는 '44844'를 보내니,
'44844'로 체크하면 맞지 않게 됩니다.

뒤의 $a_num = rand(10000, 99999);
코드를 삭제해야 됩니다.

sms_auth 테이블의 a_num 칼럼에 4자리 숫자가 저장된다면,
저로서는 이해할 수가 없는 현상입니다. 코드상으로는 랜덤 5자리 숫자 저장입니다.
(혹 sms_auth 테이블의 a_num 칼럼 타입이 4자리 숫자까지만 저장할 수 있는 타입으로 되어있다면..
해당 칼럼 타입을 변경하거나..
인증번호 코드를 4자리로 변경하는 방안을 생각해 볼 수 있습니다.  rand(1000, 9999);

답변 너무나 감사드립니다. 꾸벅

말씀하신데로 sms_auth 테이블의 a_num 칼럼을 확인해 보니 길이가 4이더라구요.
그래서 길이를 5로 늘리고,
말씀하신데로 뒤의 $a_num = rand(10000, 99999); 를 삭제했더니
정상 발송되고 sms_auth 테이블의 a_num 칼럼 정상적으로 입력이 되었네요.
그래서 인증문자 a_num 와 sms_auth 테이블의 a_num 칼럼의 값이 같아졌습니다.

그런데...
sms.php 에 인증문자를 입력하여 입력버튼을 누르면
"입력하신 '인증번호'가 일치하지 않습니다." 라고 나오네요.

sms_auth 테이블에는 a_idx, a_hp, a_auth, a_num, a_regdate 의 칼럼이 있어요.
그 중에서 a_hp, a_auth, a_num 이 3개를 매칭 시키는 것 같은데...
서로 매칭이 안되거나 값을 어떤 것을 못가지고 와서 그런것 같은데...
아무리 봐도 잘 모르겠네요. ㅠㅠ

너무나 죄송하고 감사합니다.
추가 조언 부탁드립니다. 꾸벅

ajax_check.php 원파일입니다.


<?php
include_once('../common.php');

$a_auth      = trim($_POST['a_auth']);
$auth_num    = trim($_POST['auth_num']);
$recv_number = trim($_POST['mb_hp']);

$sql = "select * from sms_auth where a_hp='$recv_number' and a_auth='$a_auth' order by a_auth desc";
$row = sql_fetch($sql);
if ($row[a_num]==$auth_num){
	echo "Y";
}else{
	echo "N";
}
?>

* ajax_send.php 의 insert SQL문입니다.
"insert into sms_auth set a_auth='$a_auth', a_num='$a_num', a_hp='$recv_number', a_regdate=now()"

* ajax_check.php 의 select SQL문입니다.
"select * from sms_auth where a_hp='$recv_number' and a_auth='$a_auth' order by a_auth desc";

a_hp (휴대폰 번호)
a_auth (시각)
값이 일치해야 됩니다.

"ajax_send.php 파일 내용 중에
$a_auth  = trim($_POST['a_auth']); 이 부분은
$sendDate = trim($_POST['sendDate']); 이렇게 바꿨습니다. 문자 발송 시간이 들어가는 것 같아서요.
그리고, 2줄 추가했습니다."

중간에 변수명 등을 바꾸면.. 꼬일 수 있습니다.
변수명, db 칼럼명 등을 바꾸고 싶다면..
sms 발송/확인 테스트를 모두 마친 후 변경을 검토해도 됩니다.

DB 에 a_auth 값은 잘 들어갔는지..
sms.php 와 ajax_check.php 파일이 최초의 상태에서 달라진 부분이 있는지..
(최초의 상태로 돌려본다던지..)
sms.php 에서 ajax_send.php 와 ajax_check.php 에 동일한 a_auth 값을 전달하고 있는지 등을 체크해 볼 수 있습니다.

ajax 파일은 디버깅이 어려운 편이긴 한데..
ajax 파일 디버깅 하는 방법입니다. https://sir.kr/g5_tip/16118

답변 너무나 감사드립니다. 꾸벅.

말씀하신데로

ajax_send.php 파일 내용 중
$a_auth  = trim($_POST['a_auth']); 이 부분은
$sendDate = trim($_POST['sendDate']); 이렇게 바꿨습니다.

그리고,
나머지는 바꾸지 않았습니다.

그런데. 답변 중에 2줄 추가하셨다고 하셨는데...
어떤 것을 추가해야 하는 건가요? ㅠㅠ 제가 초보다 보니 잘 모르겠네요.

그렇게 해도 "입력하신 '인증번호'가 일치하지 않습니다."라는 문구가 나오네요. ㅠㅠ

sms_auth 테이블의 a_auth 칼럼 에는 1693910338, 1693910195, 1693899488 이런식으로 숫자가 입력됩니다.

말씀하셨던 것처럼
a_hp (휴대폰 번호)
a_auth (시각) 일치하게 하는 문구가 다 맞는 것 같고.
정상적으로 sms_auth 테이블에는 모두 값이 입력이 되는데...
왜 인증이 안되는 걸까요?

다시한번 감사한 조언 부탁드립니다.
감사합니다. 꾸벅

"ajax_send.php 파일 내용 중에
$a_auth  = trim($_POST['a_auth']); 이 부분은
$sendDate = trim($_POST['sendDate']); 이렇게 바꿨습니다. 문자 발송 시간이 들어가는 것 같아서요.
그리고, 2줄 추가했습니다."

이 글은 제가 한 말이 아닌... "Willfor716" 님이 9월 1일 한 말입니다.
9월 1일 이 처리를 한 것 때문에.. ajax_check.php 에서 체크가 안된 것일 수도 있습니다.

이렇게 함부로 바꾸면 안된다는 말을 한 것입니다.
SMS 테스트를 하기전..
원파일을 이것 저것 바꾸면..
그 바꾼 것때문에.. 동작하지 않을 수 있기 때문입니다.

$a_auth  = trim($_POST['a_auth']);  코드를
$sendDate = trim($_POST['sendDate']); 코드로 바꿀 필요가 없습니다.
이 코드는 sms 발송과는 관련이 없지 않습니까..

현재시각을 나타내는 것 같은데.. 변수명이 마음에 안들면.. 나중에 바꿔도 되지 않습니까..

원 파일을 이것저것 바꾸지 마세요..
원파일을 이것저것 바꾸는 것은 1차 작동/테스트를 마친후에 검토해도 됩니다.
* ajax_check.php, sms.php 모두 최초로 돌리기 바랍니다.
* ajax_send.php 도 sms 발송을 위해 바꾼 부분 외에는 모두 최초 상태로 돌리기 바랍니다.

이렇게 한 후에 확인을 해보기 바랍니다.
그럼에도 ajax_check.php 에서 의도한 대로 인증번호 확인이 되지 않는다면..

sms.php 에서 ajax_send.php 와 ajax_check.php 에 동일한 a_auth 값을 전달하고 있는지 등을 체크해 볼 수 있습니다.

ajax 파일은 디버깅이 어려운 편이긴 한데..
ajax 파일 디버깅 하는 방법입니다. https://sir.kr/g5_tip/16118
ajax_check.php 에서.. echo $sql; 을 하고 sql문 확인한 후에.. adminer 에서 select 가 되는 지 확인해 볼 수 있습니다. sql문 확인후에는 echo $sql; 을 삭제하여 원래 소스로 돌린 후 인증번호 체크 확인을 해야겠지요.

이렇게 해도, 저렇게 해도, 어떻게 해도 도저히 안된다면...

최후의 수단으로

ajax_check.php sql문을 다음과 같이 변경해 볼 수 있습니다.

$sql = "select * from sms_auth where a_hp='$recv_number' and a_auth='$a_auth' order by a_auth desc";
->
$sql = "select * from sms_auth where a_hp='$recv_number' order by a_idx desc";

처음부터 다시 찬찬히 생각해보면..

휴대폰 인증 스킨 파일 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){

너무나 감사드립니다.
sms.php 나 ajax_send.php 는 정상적인 거였고.
말씀하신
if ($row['a_num']==$auth_num){
이 부분이었습니다.
이렇게 수정하니까 정상적으로 인증이되어 sms.php 팝업창이 닫아지네요.

그런데...
이거 다운받아서 할때
adm 폴더의 config_form_update.php 와 config_form.php 를 덮어 씌웠고
skin/basic 폴더의 register_form.skin.php 파일을 덮어씌웠고
bbs 폴더의 register_form_update.php 파일을 덮어씌었거든요.

그래서 그런지.
이제야 인증 완료는 했는데...
회원가입 완료 버튼을 누르면 "올바른 방법으로 이용해 주십시오." 라고 뜨면서
회원가입시 첫 화면인 회원가입약관동의 화면으로 이동하네요. ㅠㅠ

이게 하나의 세트로 설정된거라 덮어 씌우지 않으면 회원 가입시 회원가입페이지에 문자인증 버튼이 나오질 않더라구요. ㅠㅠ
혹시 추가 조언해 주실 부분 있으신가요?

문자인증 완료에 대해 조언해 주신 것에 대해서 너무나 감사드립니다.

마무리 해야해서 회원가입 완료 할 수 있는 방법을 찾아봐야겠네요.

너무나 감사드립니다. 꾸벅

해당 스킨의 설명에서 그누보드 5.3.1 용이라고 나와있습니다.

오래전 버전인데.. 이 스킨을 위해.. 그누보드 5.3.1 버전을 사용하는 것은 바람직하지 않습니다.


현재의 최신버전에 해당 스킨을 사용하여 문제가 발생한 것이라면..
문제 해결이 쉽지 않습니다. 지금 해결한 건보다 3배 이상 어려울 수 있습니다.

제가 추천하는 방법은..
덮어쓰기는 모두 취소하고.. (/adm 파일 2개, /skin/basic 파일 2개)
(5.3.1용 파일을 5.5나 5.4에 사용하면.. 상식적으로 문제가 발생할 가능성이 큽니다.)

해당 스킨의 register_form.skin.php 파일을 참고하여..
현재 설치된 버전의 register_form.skin.php 파일을 수정하는 것입니다. (sms.php 팝업 호출, 파라미터 전달)
다른 3개의 파일은.. 제 개인적인 생각으로는 필수적으로 적용하지는 않아도 되는 파일이라고 생각하고 있습니다.

이번건으로 너무나 지쳤기 때문에.. 저는 이 답을 마지막으로 하겠습니다.


별도로 질문글을 올려보거나 작업의뢰를 검토해볼 수 있습니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 16
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT