我已经看到了一些这方面的问题,但没有一个真正解决我的问题,我收到{“状态”:21002}的回复
我的PHP代码:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://sandbox.itunes.apple.com/verifyReceipt');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(array('receipt-data' => $receipt)));
print curl_exec($curl);
print curl_getinfo($curl, CURLINFO_HEADER_OUT);
这是我的原始HTTP标题转到apple:
POST /verifyReceipt HTTP/1.1
Host: sandbox.itunes.apple.com
Accept: */*
Content-Type: application/json
Content-Length: 3382
Expect: 100-continue
$ receipt的价值是:
{"receipt_type":"ProductionSandbox","app_item_id":0,"original_purchase_date": ....
我不会包含整个内容,但它包含应用内字段。
我还尝试了base64_encode
或json_decode
$收据,但我得到的回复相同。除了base64_encode
也让我"exception":"java.lang.IllegalArgumentException"
我确定发布是正确的,但我发错了内容吗?应该包含其他数据的$收据?或者我应该只发送这些数据的子集?
答案 0 :(得分:0)
根据$receipt
参数的值,您似乎正在混合本地和服务器收据验证。根据收据验证指南,特别是Validating Receipts With the App Store部分,receipt-data参数应该是" base64编码的收据数据。"只需将接收数据编码为字符串,而不是解码客户端上的收据数据,并将其用于$receipt
。
我发现在客户端对base64编码收据数据更简单,然后将其发送到php。这是doc示例中的精简版本,因为您正在谈论iTunes商店收据,我希望obj-c是您所需要的。要获取此字符串,请检索收据数据URL,从中读取数据,然后对其进行base64编码:
NSURL *url = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *encoded = [data base64EncodedStringWithOptions:0];
否则POST确实看起来不错。