8

过去几天我一直在尝试测试我的第一个应用内购买 iphone 应用程序。不幸的是,我找不到与 iTunes 服务器对话以验证 transactionReceipt 的方法。

因为这是我第一次尝试使用这项技术,所以我选择直接从 iPhone 验证收据,而不是使用服务器支持。但是在尝试使用来自谷歌代码的 JSON api 创建的 JSON onbject 发送 POST 请求后,iTunes 总是返回一个奇怪的响应(而不是我等待的“status = 0”字符串)。

这是我用来验证收据的代码:

- (void)recordTransaction:(SKPaymentTransaction *)transaction {
    NSString *receiptStr = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding];
    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"algo mas",@"receipt-data",nil];

    NSString *jsonString = [jsonDictionary JSONRepresentation];
    NSLog(@"string to send: %@",jsonString);

    NSLog(@"JSON Created");
    urlData = [[NSMutableData data] retain];

    //NSURL *sandboxStoreURL = [[NSURL alloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"will create connection");
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

也许我忘记了请求标头中的某些内容,但我认为问题出在我用来创建 JSON 对象的方法上。

这是我将 JSON 对象添加到 HTTPBody 之前的样子:

    string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY

       ...........

D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"}

我得到的回应:

完整响应 { exception = "java.lang.IllegalArgumentException: 尝试读取未加引号的字符串时属性列表解析失败。未找到允许的字符。行号:1,列:0。"; 状态 = 21002;}

非常感谢您的指导。

4

2 回答 2

20

经过两天的挣扎,我刚刚解决了这个问题。在插入 json 对象之前,您必须使用 Base64 对收据进行编码。像那样(红宝石):

dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json

官方文档(至少对于 SDK 3.0)中的任何地方都没有提到 Base64,只有几个博客。

例如,这里的人在将收据传递给 PHP 服务器之前以 Base64 编码收据,但没有在 PHP 中将其解码,因此将 Base64 编码的字符串发送到 iTunes。

于 2009-09-01T22:21:14.107 回答
2

回复:“21002:java.lang.IllegalArgumentException:propertyListFromString 解析了一个对象,但字符串中还有更多文本。:”

我通过在编码之前将收据数据包装在 {} 中来修复了我的代码中的类似问题。

生成的收据如下所示:

{
    "signature" = "A[...]OSzQ==";
    "purchase-info" = "ew[...]fQ==";
    "pod" = "100";
    "signing-status" = "0";
}

这是我使用的代码:

receipt = "{%s}" % receipt    // This step was not specified - trial and error
encoded = base64.b64encode(receipt)
fullpost = '{ "receipt-data" : "%s" }' % encoded
req = urllib2.Request(url, fullpost)
response = urllib2.urlopen(req)

苹果的回应:

{"receipt":{"item_id":"371235", "original_transaction_id":"1012307", "bvrs":"1.0", "product_id":"com.foo.cup", "purchase_date":"2010-05-25 21:05:36 Etc/GMT", "quantity":"1", "bid":"com.foo.messenger", "original_purchase_date":"2010-05-25 21:05:36 Etc/GMT", "transaction_id":"11237"}, "status":0}

祝你好运!

于 2010-05-26T23:10:29.227 回答