-
IOS 인앱 결제 PHP 영수증 체크 (2016년 8월 기준)ETC 2016. 8. 31. 13:11
1. Client app 에서 결제처리를 완료 하면 json 형식으로 된 영수증을 받게 된다.
검증에는 이 내용중 payload 의 값만 사용한다.
payload 는 이와같이 생겼다.
MIIT0QYJKoZIhvcNAQcCoIITwjCCE74CAQExCzAJB .... (중략) ....
인자가 상당히 길기때문에 반드시 POST 방식으로 전달해야한다.
2. 서버측 PHP 영수증 검증 코드 작성
define("VERIFY_URL", "https://sandbox.itunes.apple.com/verifyReceipt"); //개발 테스트시 //define("VERIFY_URL", "https://buy.itunes.apple.com/verifyReceipt"); //실제 서비스시 function CheckReceipt() { $s_payload = $_REQUEST['payload']; $post = json_encode( Array( 'receipt-data' => $s_payload ) ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, VERIFY_URL); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result=curl_exec($ch); curl_close ($ch); $o_bill = json_decode($result); if($o_bill->status != 0) { echo "invalid_recipt"; return -1; } //option : package name checking if($o_bill->receipt->bundle_id != "package name goes here") { echo "invalid_pkg_name"; return -1; } //option : product id checking if($o_bill->receipt->in_app{0}->product_id != "hp_potion") { echo "invalid_pid"; return -1; } return 0; }
3. 에러 발생시 번호에 따른 대처
- 21002 : Client 측에서 Server php로 payload때 해당 값을 url encode를 해줬는지 확인한다.
- 21007 : 테스트용 영수증을 실 서비스 VERIFY_URL로 보냈는지 확인한다.
- 21008 : 실제 서비스 영수증을 테스트 VERIFY_URL로 보냈는지 확인한다.
클라이언트 결재 처리 과정에서 중단하거나, 문제가 발생하면
사용처리가 완료되지 않을 수 있다. 이 경우 또 결제를 또 실패하면
$o_bill->receipt->in_app{0}, $o_bill->receipt->in_app{1} 과 같이
배열 형태로 완료처리(Consume)되지 않은 모든 구매 정보가
전달되므로 이점 참고하기 바란다.
(즉, 정상적으로 1개 항목만 결제된 경우 {0} 만 접근하여 사용하면 된다.)
기존 결제가 완료되지 않은경우, 가능하면 이전 결제 항목에 대한 처리를
완료하고 그 다음 구매가 이뤄질 수 있도록 클라이언트 처리하는것을 권장한다.
4. 참고 링크
(2016년 8월 기준 정상적으로 작동함을 확인하였다.)
'ETC' 카테고리의 다른 글
mysqldump 파일에서 definer 모두 제거하기 (0) 2017.05.12 리눅스 pkill과 동일한 리눅스 명령 (0) 2016.11.14 git 일부 디렉토리만 clone 받기 (sparse checkout) (1) 2016.10.14 Android 인앱 결제 PHP 영수증 체크 (2016년 8월 기준) (1) 2016.08.31 구글 플러스 초간단 access token 체크 방법 (0) 2016.01.12