Posted
Filed under 프로그래밍/PHP


원본 : http://blog.evendanan.net/2012/03/In-App-Purchase-Verification-using-PHP-OR-Making-sure-you-ain-t-getting-ripped-off-PHP-style


Google

function verify_market_in_app($signed_data, $signature, $public_key_base64) 
{
 $key = "-----BEGIN PUBLIC KEY-----\n".
  chunk_split($public_key_base64, 64,"\n").
  '-----END PUBLIC KEY-----';   
 //using PHP to create an RSA key
 $key = openssl_get_publickey($key);
 //$signature should be in binary format, but it comes as BASE64. 
 //So, I'll convert it.
 $signature = base64_decode($signature);   
 //using PHP's native support to verify the signature
 $result = openssl_verify(
   $signed_data,
   $signature,
   $key,
   OPENSSL_ALGO_SHA1);
 if (0 === $result) 
 {
  return false;
 }
 else if (1 !== $result)
 {
  return false;
 }
 else 
 {
  return true;
 }
} 




Apple
애플의 경우는 프로덕션에 한번 던지고 21007 코드가 나오면 샌드박스로 다시 던져야 한다.
function verify_app_store_in_app($receipt, $is_sandbox) 
{
 //$sandbox should be TRUE if you want to test against itunes sandbox servers
 if ($is_sandbox)
  $verify_host = "ssl://sandbox.itunes.apple.com";
 else
  $verify_host = "ssl://buy.itunes.apple.com";
 
 $json='{"receipt-data" : "'.$receipt.' }';
 //opening socket to itunes
 $fp = fsockopen ($verify_host, 443, $errno, $errstr, 30);
 if (!$fp) 
 {
  // HTTP ERROR
  return false;
 } 
 else
 { 
  //iTune's request url is /verifyReceipt     
  $header = "POST /verifyReceipt HTTP/1.0\r\n";
  $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  $header .= "Content-Length: " . strlen($json) . "\r\n\r\n";
  fputs ($fp, $header . $json);
  $res = '';
  while (!feof($fp)) 
  {
   $step_res = fgets ($fp, 1024);
   $res = $res . $step_res;
  }
  fclose ($fp);
  //taking the JSON response
  $json_source = substr($res, stripos($res, "\r\n\r\n{") + 4);
  //decoding
  $app_store_response_map = json_decode($json_source);
  $app_store_response_status = $app_store_response_map->{'status'};
  if ($app_store_response_status == 0)//eithr OK or expired and needs to synch
  {
   //here are some fields from the json, btw.
   $json_receipt = $app_store_response_map->{'receipt'};
   $transaction_id = $json_receipt->{'transaction_id'};
   $original_transaction_id = $json_receipt->{'original_transaction_id'};
   $json_latest_receipt = $app_store_response_map->{'latest_receipt_info'};
   return true;
  }
  else
  {
   return false;
  }
 }
}





원본 : https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/RenewableSubscriptions/RenewableSubscriptions.html

Table 7-1  Status codes for auto-renewable subscriptions

Status Code

Description

21000

The App Store could not read the JSON object you provided.

21002

The data in the receipt-data property was malformed.

21003

The receipt could not be authenticated.

21004

The shared secret you provided does not match the shared secret on file for your account.

21005

The receipt server is not currently available.

21006

This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response.

21007

This receipt is a sandbox receipt, but it was sent to the production service for verification.

21008

This receipt is a production receipt, but it was sent to the sandbox service for verification.

표 7-1   자동 재생 구독에 대한 상태 코드

상태 코드

기술

21000

앱 스토어가 제공 한 JSON 객체를 읽을 수 없습니다.

21002

수신 데이터 속성의 데이터 형식이 잘못되었습니다.

21003

영수증 인증 할 수 없습니다.

21004

당신이 제공하는 공유 비밀은 귀하의 계정에 대한 파일의 공유 비밀과 일치하지 않습니다.

21005

수신 서버는 현재 사용할 수 없습니다.

21006

이 영수증은 유효하지만 구독이 만료되었습니다. 이 상태 코드는 서버에 반환 될 때, 수신 데이터는 디코딩과 응답의 일부로 반환됩니다.

21007

이 영수증은 샌드 박스 영수증이지만 확인을 위해 생산 서비스로 전송되었습니다.

21008

이 영수증은 제품 수령이지만 확인을 위해 샌드 박스 서비스로 전송되었습니다.



2013/08/29 11:38 2013/08/29 11:38