我想在我的应用中验证交易收据,
这是我的代码,
- (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”}
有人可以帮助我获得正确的收据验证吗?
答案 0 :(得分:26)
只为那些可能会觉得有帮助的人。我注意到苹果已经在In App Purchasing Guide中更新了一些用于自动续订订阅购买的状态代码,但似乎也适用于此处。
重要信息:此处的非零状态代码仅适用于恢复有关自动续订订阅的信息。在测试其他类型产品的响应时,请勿使用这些状态代码。 (真的?)
我希望这有助于作为参考。我用21007钉了。
Apple网站上的状态代码列表:https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
答案 1 :(得分:10)
经过多次尝试,我决定从服务器端进行收据验证。实际上这是推荐的方式。
这是我的代码,
-(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
我找到了帮助表单,
答案 2 :(得分:4)
...你没有解雇你的请求。所以你的回复是空的,因为你还没有提出请求!
添加[request startSynchronous]
调用(这通常是一个坏主意,您应该始终异步运行网络调用),或者更好地重写代码以支持异步网络调用,并使用[request startAsynchronous]
代替。
如果您需要更多信息,我建议您查看ASI文档: http://allseeing-i.com/ASIHTTPRequest/How-to-use
答案 3 :(得分:-2)