在应用程序中的应用程序购买收据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了帮助表单,
…你没有解雇你的请求。 所以你的回答是空的,因为你还没有提出要求!
要么添加一个[request startSynchronous]
调用(这通常是一个坏主意,你应该总是asynchronous运行你的networking调用),或者更好地重写你的代码来支持asynchronousnetworking调用,并使用[request startAsynchronous]
。
如果您需要更多信息,我build议您查看ASI文件: http : //allseeing-i.com/ASIHTTPRequest/How-to-use
从以下参考资料中,我了解到您的应用程序需要使用单独的服务器来“validation存储收据”。 我认为收据validation我们需要使用来自静态IP的请求。
谢谢,
参考