在app中的App Purchase Receipt验证中

时间:2011-05-08 11:52:54

标签: ios in-app-purchase

我想在我的应用中验证交易收据,

这是我的代码,

- (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”}

有人可以帮助我获得正确的收据验证吗?

4 个答案:

答案 0 :(得分:26)

只为那些可能会觉得有帮助的人。我注意到苹果已经在In App Purchasing Guide中更新了一些用于自动续订订阅购买的状态代码,但似乎也适用于此处。

  • 21000 App Store无法读取您提供的JSON对象。
  • 21002 receipt-data属性中的数据格式错误。
  • 21003收据无法通过身份验证。
  • 21004您提供的共享密码与您帐户的共享密码不符。
  • 21005收据服务器当前不可用。
  • 21006此收据有效但订阅已过期。当此状态代码返回到您的服务器时,收据数据也会被解码并作为响应的一部分返回。
  • 21007此收据是沙盒收据,但已发送至生产服务部门进行验证。
  • 21008此收据是生产收据,但已发送至 沙箱服务进行验证。

重要信息:此处的非零状态代码仅适用于恢复有关自动续订订阅的信息。在测试其他类型产品的响应时,请勿使用这些状态代码。 (真的?)

我希望这有助于作为参考。我用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

我找到了帮助表单,

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

答案 2 :(得分:4)

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

添加[request startSynchronous]调用(这通常是一个坏主意,您应该始终异步运行网络调用),或者更好地重写代码以支持异步网络调用,并使用[request startAsynchronous]代替。

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

答案 3 :(得分:-2)

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

感谢,

Reference