지난번 편에서 네이버 캡챠 이미지 API 이용방법에 대해 알아보았다. 이번편에서 소개할 API는 캡챠 음성 API로 사용자가 음성에서 제공해주는 소리를 듣고 입력하여 검증하는 방식이다. 본 API 사용할려면 네이버 애플리케이션에 사용 API 등록이 필요하니 하단 링크를 참고하여 미리 설정해 주어야 한다.
캡챠 음성 API 역시 캡챠 이미지 API와 동일하게 사용량 제한이 있으며 이는 일 1,000건 이니 실 서비스시에는 유료 전환에 대한 고려가 반드시 필요하다.
<?php # https://developers.naver.com/docs/utils/scaptcha/reference/ 참고
define('NV_CLIENT_ID', '');
define('NV_CLIENT_SECRET', '');
$nkey = request_skey();
$scaptcha = request_scaptcha($nkey);
// 캡차 키 발급 요청
function request_skey(){
$url = 'https://openapi.naver.com/v1/captcha/skey?code=0';
// 요청
$response = request_curl($url); // ex) Array ( [rst] => success [data] => {"key":"v2klm4SGVHG5tiQ9"} )
if( $response['rst'] != 'success'){ return false; } // 메시지 echo $response['msg'];
$data = json_decode($response['data'],true);
if( $data['errorCode'] > 0){ // ex) Array ( [errorMessage] => NID AUTH Result Invalid (1000) : Authentication failed. (인증에 실패했습니다.) [errorCode] => 024 )
return false;
}
return $data['key'];
}
// 캡차 음성 요청
function request_scaptcha($key = false){
if($key == false){ return false; }
$url = 'https://openapi.naver.com/v1/captcha/scaptcha?key='.$key;
// 요청
$response = request_curl($url); // 성공시 음성 데이터
if( $response['rst'] != 'success'){ return false; } // 메시지 echo $response['msg'];
$data = json_decode($response['data'],true); // ex) Array ( [result] => [errorMessage] => Invalid key. [errorCode] => CT001 )
if( $data['result'] === false){
return false;
}
return $response['data'];
}
// 사용자 입력값 검증 요청
function request_svalid($key = false, $value = false){
if($key == false || $value == ''){ return false; }
$url = 'https://openapi.naver.com/v1/captcha/skey?code=1&key='.$key."&value=".$value;
// 요청
$response = request_curl($url); // 성공시 음성 데이터
if( $response['rst'] != 'success'){ return false; } // 메시지 echo $response['msg'];
$data = json_decode($response['data'],true); // ex) Array ( [result] => [errorMessage] => Invalid key. [errorCode] => CT001 )
if( $data['result'] === false){
return false;
}
return true;
}
// 공통 CURL 처리
function request_curl($url){
// 공통헤더
$headers = array(
'X-Naver-Client-Id: '.NV_CLIENT_ID,
'X-Naver-Client-Secret: '.NV_CLIENT_SECRET
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 0);
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$data = curl_exec($ch);
$response = array();
// 통신 실패 처리
if (curl_error($ch)){
$response = array('rst'=>'fail','msg'=>'CURL Error('.curl_errno( $ch ).') '.curl_error($ch));
}
// 통신에 대한 성공이며, 실제 데이터에 대한 성공은 별도 처리 필요
else{
$response = array('rst'=>'success','data'=>$data);
}
curl_close($ch);
return $response;
}
?>
<?php
if( !empty($_POST['key']) && !empty($_POST['value'])){
$nvalid = request_svalid($_POST['key'], $_POST['value']);
$resultMsg = '';
if( $nvalid !== true){ $resultMsg = '인증실패'; }
else{ $resultMsg = '인증성공'; }
?>
<h1>네이버 캡챠 음성 인증 결과</h1>
<h3><?php echo $resultMsg ?></h3>
<p><a href="">다시 인증하기</a></p>
<?php
}else{
?>
<h1>네이버 캡챠 음성 인증 요청</h1>
<form method="post">
<input type="hidden" name="key" value="<?php echo $nkey ?>">
<p><audio src="<?php echo "data:audio/wav;base64,".base64_encode($scaptcha) ?>" controls></audio></p>
<p><input type="text" name="value" placeholder="음성 문자를 입력해주세요." style="width:200px"></p>
<p><input type="submit" value="전송"></p>
</form>
<?php } ?>