过去几天我一直试图测试我的第一个应用程序中的purchse 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。”; status = 21002; }
非常感谢您的指导。
答案 0 :(得分:20)
经过2天的挣扎,我刚刚解决了这个问题。在插入json对象之前,必须使用Base64对收据进行编码。就像那样(Ruby):
dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json
官方文档中没有提到Base64(至少对于SDK 3.0),仅在几个博客上提及。
例如,here该人在将其传递给PHP服务器之前对Base64中的收据进行编码,但不会将其解码回PHP,从而将Base64编码的字符串发送到iTunes。
答案 1 :(得分:2)
Re:“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)
Apple的回应:
{"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}
祝你好运!