【问题标题】:Generate JSON object with transactionReceipt使用 transactionReceipt 生成 JSON 对象
【发布时间】:2009-08-19 16:37:51
【问题描述】:

过去几天我一直在尝试测试我的第一个应用内购买 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}"}

我收到的回复:

完整回复{ 异常=“java.lang.IllegalArgumentException:尝试读取未引用的字符串时属性列表解析失败。找不到允许的字符。行号:1,列:0。”; 状态 = 21002; }

非常感谢您的指导。

【问题讨论】:

  • 文档中没有任何地方说 transactionReceipt 可以解释为 UTF-8 编码的字符串

标签: objective-c json iphone-sdk-3.0 app-store-connect storekit


【解决方案1】:

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

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

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

例如,here 这个家伙在将收据传递给 PHP 服务器之前将其编码为 Base64,但不会将其解码回 PHP,从而将 Base64 编码的字符串发送到 iTunes。

【讨论】:

【解决方案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}

祝你好运!

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2022-10-21
    • 2016-04-30
    • 2020-06-08
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多