在应用程序中的应用程序购买收据validation

我想validation我的应用程序内的交易收据,

这是我的代码,

- (void)recordTransaction:(SKPaymentTransaction *)transaction { NSData *receiptData = [NSData dataWithData:transaction.transactionReceipt]; NSString *encodedString = [Base64 encode:receiptData]; NSURL *url = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url]; [request setPostValue:encodedString forKey:@"receipt-data"]; [request setRequestMethod:@"POST"]; [request setDelegate:self]; [request startAsynchronous]; } 

我得到输出:

{“status”:21002,“exception”:“java.lang.NullPointerException”}

有人可以帮助我得到正确的收据validation吗?

只为那些可能会觉得有用的人。 我注意到,苹果已经更新了“应用内购买指南”,其中包含一些用于自动续订订购的状态代码,但似乎也适用于此。

  • 21000 App Store无法读取您提供的JSON对象。
  • 21002收据数据属性中的数据格式不正确。
  • 21003收据无法validation。
  • 21004您提供的共享密钥与您帐户的共享密钥不匹配。
  • 21005收据服务器当前不可用。
  • 21006此收据有效,但订阅已过期。 当这个状态码返回到你的服务器时,收据数据也被解码并作为响应的一部分返回。
  • 21007此收据是沙盒收据,但已发送到生产服务进行validation。
  • 21008此收据是生产收据,但已发送到沙箱服务进行validation。

重要提示:此处的非零状态代码仅适用于恢复有关自动续订订阅的信息。 testing其他types产品的响应时不要使用这些状态码。 (真?)

我希望这有助于作为参考。 我用21007钉了

Apple网站上的状态代码列表: https : //developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

经过多次尝试,我决定从服务器端进行收据validation。 其实这是推荐的方法。

这是我的代码,

 -(void)recordTransaction:(SKPaymentTransaction *)transaction { NSString* receiptString = [[[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding] autorelease]; // POST this string to your server // I used ASIFormDataRequest } // server side $url = 'https://sandbox.itunes.apple.com/verifyReceipt'; // encode the receipt data received from application $purchase_encoded = base64_encode( $purchase_receipt ); //Create JSON $encodedData = json_encode( Array( 'receipt-data' => $purchase_encoded ) ); // POST data //Open a Connection using POST method, as it is required to use POST method. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $encodedData); $encodedResponse = curl_exec($ch); curl_close($ch); //Decode response data using json_decode method to get an object. $response = json_decode( $encodedResponse ); // check response if ($response->{'status'} != 0) // Invalid receipt else // valid reciept 

我find了帮助表单,

http://gamesfromwithin.com/in-app-purchases-part-3

…你没有解雇你的请求。 所以你的回答是空的,因为你还没有提出要求!

要么添加一个[request startSynchronous]调用(这通常是一个坏主意,你应该总是asynchronous运行你的networking调用),或者更好地重写你的代码来支持asynchronousnetworking调用,并使用[request startAsynchronous]

如果您需要更多信息,我build议您查看ASI文件: http : //allseeing-i.com/ASIHTTPRequest/How-to-use

从以下参考资料中,我了解到您的应用程序需要使用单独的服务器来“validation存储收据”。 我认为收据validation我们需要使用来自静态IP的请求。

谢谢,

参考