ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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. 참고 링크

    https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html



    (2016년 8월 기준 정상적으로 작동함을 확인하였다.)

Designed by Tistory.