如何通过JSON POST向苹果发送收据验证请求?

时间:2015-02-24 23:21:39

标签: php ios json api app-store

我已经看到了一些这方面的问题,但没有一个真正解决我的问题,我收到{“状态”: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_encodejson_decode $收据,但我得到的回复相同。除了base64_encode也让我"exception":"java.lang.IllegalArgumentException"

我确定发布是正确的,但我发错了内容吗?应该包含其他数据的$收据?或者我应该只发送这些数据的子集?

1 个答案:

答案 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确实看起来不错。