将php curl转换为iTunes InApp verifyReceipt的GAE urlfetch

将php curl转换为iTunes InApp verifyReceipt的GAE urlfetch,php,google-app-engine,app-store-connect,libcurl,urlfetch,Php,Google App Engine,App Store Connect,Libcurl,Urlfetch,有人能帮忙把这个PHP Curl转换成UrlFetch吗?这用于Apple iTunes验证收据 if (getiTunesProductionLevel($app_id)=="sandbox" || $sandbox_override == TRUE) { $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt'; } else { $endpoint = 'https://buy.itunes.apple.com

有人能帮忙把这个PHP Curl转换成UrlFetch吗?这用于Apple iTunes验证收据

if (getiTunesProductionLevel($app_id)=="sandbox" || $sandbox_override == TRUE) {
    $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';
}
else {
    $endpoint = 'https://buy.itunes.apple.com/verifyReceipt';
}

$postData = json_encode(array(
    'receipt-data' => $receipt,
    'password' => $sharedSecret));

$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$response = curl_exec($ch);
$errno = curl_errno($ch);
$errmsg = curl_error($ch);
curl_close($ch);
这是我能得到的最好的了。但还不够好

logMessage(LogType::Info,"XXX URLFetch 0");
    $postData = json_encode(array(
    'receipt-data' => $receipt,
    'password' => $sharedSecret));
$post_data = json_decode($postData);
logMessage(LogType::Info,"XXX URLFetch 1");
$data = http_build_query($post_data);
logMessage(LogType::Info,"XXX URLFetch 2");

$context = [
  'http' => [
    'method' => 'post',
    'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
    'content' => $data
  ]
];

logMessage(LogType::Info,"XXX URLFetch 3");
$context = stream_context_create($context);
logMessage(LogType::Info,"XXX URLFetch 4");
$result = file_get_contents($endpoint, false, $context);
logMessage(LogType::Info,"XXX result:" . $result);
$response = $result;
$errno = 0;
logMessage(LogType::Info,"XXX response:");
它可以发布,但返回此响应
XXX结果:{“status”:21002}

我有一个这样的错误,结果是在本地运行时,“POST”必须是大写的。
在.appspot上,它使用小写字母“post”,但在我的电脑上不在本地使用。

为什么要在urlfetch代码中对$post\u数据进行json解码,而不是在curl中进行解码?

服务器的响应状态21002是什么意思?下面是一些类似的内容,但它使用的是curl 21002,接收数据属性中的数据格式不正确或丢失。不,这不是它。我把它改为POST,在appspot上还是一样。你知道如何在urlfetch中设置这些吗?CURLOPT_RETURNTRANSFER、CURLOPT_SSL_VERIFYHOST、CURLOPT_SSL_VERIFYPEER?这不是答案。使用decode是因为它已被编码。仅供参考的是,我也尝试过直接创建postdata数组,就像$post_data=array('receivedata'=>$receivement,'password'=>$sharedSecret);并将其直接输入$data=http_build_query($post_data)。同样的地位。不是解决办法。我需要更多的故障排除技术,如何转储请求?我想看看GAE是如何构建这篇文章的。对不起,我的回答不清楚。基于此,您需要“提交此JSON对象作为HTTP POST请求的有效负载”。换句话说,$data=json_encode(数组('receipt-data'=>…);完全正确测试并确认其工作正常。非常感谢。。。你真的来自火星!