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


How do i send a receipt validation request to apple via JSON POST?

我看到了一些问题,但没有一个真正解决我的问题,我得到了{"status":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头到苹果:

POST /verifyReceipt HTTP/1.1
Host: sandbox.itunes.apple.com
Accept: */*
Content-Type: application/json
Content-Length: 3382
Expect: 100-continue

$receive的值为:

{"receipt_type":"ProductionSandbox","app_item_id":0,"original_purchase_date": ....

我不会包括全部内容,但它包括应用程序内字段。

我也尝试过base64_encodejson_decode$收据,但我得到了相同的回复。除了base64_encode也给我"exception":"java.lang.IllegalArgumentException"

我确信帖子是正确的,但我发错内容了吗?$收据应该用其他数据包装吗?还是我应该只发送这个数据的一个子集?

$receipt参数的值来看,您似乎在混合本地和服务器收据验证。根据收据验证指南,特别是"使用应用商店验证收据"部分,收据数据参数应该是"base64编码的收据数据"。与其在客户端上解码收据数据,不如简单地将收据数据编码为字符串,并将其用于$receipt

我发现在客户端对收据数据进行base64编码,然后将其发送到php更简单。这是文档示例的浓缩版本,既然你说的是iTunes商店收据,我希望obj-c是你需要的。要获取此字符串,请检索收据数据url,从中读取数据,然后对其进行base64编码:

NSURL *url = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *encoded = [data base64EncodedStringWithOptions:0];

POST在其他方面看起来确实正确。