使用transactionReceipt生成JSON对象

时间:2009-08-19 16:37:52

标签: objective-c json iphone-sdk-3.0 itunesconnect storekit

过去几天我一直试图测试我的第一个应用程序中的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;   }

非常感谢您的指导。

2 个答案:

答案 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}
祝你好运!