LG Centrex REST API 이용 중 에러 해결
API를 이용한 개발을 능숙하게 밥먹듯이 할 수 있는 사람도 있겠지만
나는 API를 사용해본 경험이 많지 않아서 항상 어렵게 느껴진다...
그래도 LG에서 제공하는 센트릭스 open api는 비교적 메뉴얼이 친절하게 되어있어 다행인 편이었다
우선 개발목표는 API에서 제공하는 기능 '전화 수신시 URL 알림' 과 '문자보내기'를 합해서
흔히 메시지 콜백 시스템이라고 하는, 전화 수신시 문자로 안내할 수 있는 기능을 구현하는 것이다.
API 사용법은 대략 이렇다
1. 센트릭스 아이디와 비밀번호(sha512로 암호화 하여야함), 패러미터를 준비한다
2. LG에서 제공하는 RestAPI 경로로 해당 정보를 POST한다
3. 끝
이를 이용해 전화 수신시 URL 알림 설정을 구현하면 다음과 같다
<form action="https://centrex.uplus.co.kr/RestApi/setringcallback" method="POST" id="smsform">
<div>아이디</div>
<input type="hidden" value="(아이디값)" name="id"/>
<div>패스</div>
<input type="hidden" value="<?=$pwd?>" name="pass"/>
<div>콜백URL</div>
<input name="callbackurl" value="/smssend.php"/>
<div>콜백HOST</div>
<input type="hidden" name="callbackhost" value="(아이피값)"/>
<input type="hidden" name="callbackport" value="(사용할 포트)"/>
<button type="submit">
제출하기
</button>
</form>
$pwd는 sha512 암호화를 해야되므로
$pwd = hash('sha512', '원래 비밀번호', false);
이런식으로 해주었다
이렇게 설정하여 폼을 제출해주면
앞으로 해당 번호로 전화가 오게되면 (아이디가 전화번호) 자동으로 아이피:포트/smssend.php 경로로
http 리퀘스트가 오게된다. 리퀘스트에는 발신자 정보등의 간단한 정보도 패러미터로 같이오게됨
그래서 smssend.php에서 발신자 번호를 받아 다시 문자보내기 API 로 POST를 하게되면
전화 수신시 문자보내기 기능을 구현하게 될 수 있게된다
...인 줄 알았으나 에러가 여기서 발생하게 된다.
일단 smssend.php를 이런식으로 짜 주었다
<?if(isset($_REQUEST['sender']) ) { $destnumber = $_REQUEST['sender']; } else { $destnumber = ""; }?>
<form action="https://centrex.uplus.co.kr/RestApi/smssend" method="POST" id="smsform">
<!-- <div>아이디</div> -->
<input type="hidden" value="<?=$id?>" name="id"/>
<!-- <div>패스</div> -->
<input type="hidden" value="<?=$pwd?>" name="pass"/>
<div>수신번호</div>
<input name="destnumber" value="<?=$destnumber?>"/>
<div>문자내용</div>
<input name="smsmsg" value="콜백 시스템 테스트중입니다!"/>
<button type="submit">
제출하기
</button>
</form>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$('#smsform').submit();
</script>
URL 알림기능에서 온 패러미터 sender를 destnumber에 담아서 자동으로 submit까지 해주는 식.
여기까지는 테스트가 성공적이었다
1. 테스트로 전화 수신시 발신자 정보를 DB에 담아봤는데 기능하였음
2. smssend.php 페이지만 따로 들어가면 자동으로 submit이 되어 설정해준 내 핸드폰에 문자가 왔음
그러면 패러미터도 잘들어오고 기능도 잘하니까 합치기만 하면 되는상태
그런데 그게 작동이 되지 않았다..
여기저기 개발자 포럼에 질문도 해보고 하다가 LG open api 를 제공하는 쪽에서 답변을 받을 수 있었다
POST를 form을 만들어서 submit 하는 식으로 진행했는데
애초에 이런 방식은 웹에서 동작하는 방식이고, API에서는 이러한 기능이 동작하지 않는다는 것.
즉, 서버단에서만 할 수 있는 작업들로 POST해야 한다는 것이었다.
옛날에 어디서 배웠던 내용이라 짐작은 하고 있었는데 역시나였다
패러미터를 받아 DB에 저장하는 것은 되고 POST하는 것은 안되는 것이 문제였는데
DB저장은 서버단에서만 동작하는 로직이기 때문에 가능했던것
여기서 내 상식은 POST라는 것 자체가 웹에서만 쓸수있는 것 아닌가??
일단 DB로 값을 넘긴다음에 후처리해야되나?? 등등의 생각을 했지만
찾아보니 의외로 쉽게 서버단에서 POST 할 수 있는 기능이 있었다
다음 링크가 도움이 많이 되었다. 감사합니다
[php] PHP로 POST 요청을 보내려면 어떻게해야합니까? - 리뷰나라
실제로 검색이 끝나면 내용을 읽고 싶습니다. 문제는 URL이 POST메소드 만 허용하며 메소드에 대한 조치를 취하지 않는다는 것입니다 GET. domdocument또는 의 도움으로 모든 내용을 읽어야합니다 file_
daplus.net
아무튼 CURL이라는 것을 쓰면 가능한 것인데 이것이 익숙치 않아
php만으로도 동작하는 curl-less 방법이 있어 사용했다.
대략 완성된 smssend.php 코드는 이렇다
$url = 'https://centrex.uplus.co.kr/RestApi/smssend';
$data = array('id' => $id, 'pass' => $pwd, 'destnumber' => $destnumber,
'smsmsg' => '콜백 테스트중입니다');
// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }
var_dump($result);
이렇게 하니까 설정해둔 인터넷 전화로 전화를 걸었을 때 문자메시지 알림이 왔다.. 완성!
오늘도 지식이 하나 늘었다