在 PHP 中检测 iTunes 订阅状态

Posted

技术标签:

【中文标题】在 PHP 中检测 iTunes 订阅状态【英文标题】:Detect iTunes Subscription Status in PHP 【发布时间】:2018-11-15 04:19:53 【问题描述】:

我正在尝试找到一种方法来从后端(php/Laravel)检查 Apple Store 上的用户订阅状态。我们已经知道用户的 UUID,并且我们在 Apple 上设置了订阅。用户通过Apple订阅服务试用期后访问应用程序,我需要检查的是用户是否在试用期结束后实际订阅了该服务。

我的问题是您如何与 Apple Store 通信以使用 PHP/Laravel 作为后端获取用户的订阅状态?

为了澄清,该应用程序允许用户通过网络和移动应用程序订阅服务。通过 web 很容易获得用户的订阅状态,因为我们使用的是 Stripe。但是,在应用程序上,用户通过 Apple Store 订阅服务。那么再次,您如何与 Apple Store 通信以使用 PHP/Laravel 作为后端获取用户的订阅状态?

【问题讨论】:

Apple 商店没有某种 API 可供查询,就像您通过条带确定用户是否订阅一样?快速谷歌搜索返回这个,但我不是 ios 开发者developer.apple.com/library/archive/documentation/… 这个问题也可能有帮助。 ***.com/questions/5120177/… 也许这会对你有所帮助:github.com/aporat/store-receipt-validator 【参考方案1】:

您可以从受信任的服务器向 App Store 查询此信息。

沙盒环境的端点是https://sandbox.itunes.apple.com/verifyReceipt 对于生产来说,它是https://buy.itunes.apple.com/verifyReceipt

您需要将以下内容作为 JSON 有效负载发送:

receipt-data 如果您的服务器上没有它,可以通过调用NSBundleappStoreReceiptURL 方法来检索它。读取该文件的全部内容并将其发送到您的服务器。

Password(仅适用于自动续订订阅,这将是您应用的共享密钥)

exclude-old-transactions 仅用于包含自动续订或非续订订阅的 iOS7 样式应用收据。如果值为 true,则响应仅包括任何订阅的最新续订交易。

然后它会返回一个包含收据status 和一些其他附加信息的有效负载。

Check this article at Apple

编辑

使用 cURL 调用 App Store 端点(上面链接)。这是一个粗略的示例,您需要针对您的特定环境对其进行修改并填写所需的变量。

$service_url = [one of the two above];
$curl = curl_init($service_url);
$curl_post_data = array(
        'receipt-data' => $receiptData,
        'password' => $password, //Only required for certain types of subscription
        'exclude-old-transactions' => $excludeoldtransactions //Depends on your use case, check Apple link
);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
$curl_response = curl_exec($curl);
if ($curl_response === false) 
    $info = curl_getinfo($curl);
    curl_close($curl);
    die('error occured during curl exec. Additioanl info: ' . var_export($info));

curl_close($curl);
$decoded = json_decode($curl_response);
if (isset($decoded->response->status) && $decoded->response->status == 'ERROR') 
    die('error occured: ' . $decoded->response->errormessage);

echo 'response ok!';
var_dump($decoded->response);

http://php.net/manual/en/book.curl.php

【讨论】:

能否请您显示在 PHP 中进行这些调用 receipt-dataappStoreReceiptURL 的代码。 你从哪里得到收据$receiptData 您需要将该数据从 iOS 设备发送到您的服务器。将其保留在您的数据库中,然后在此脚本中检索它。因此,您需要 iOS 应用调用的第二个脚本,以便将该信息输入您的数据库。

以上是关于在 PHP 中检测 iTunes 订阅状态的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序构建状态在 iTunes 上为“处理中”

如何在“共享您的信息”中更改公司名称以在 iTunes 中自动更新订阅?

将 App 上传到 iTunes 时的 iOS 构建状态

检测用户是不是在 iTunes 商店中登录

iTunes 中没有 AutoRenewable In-App Purchases 选项

iTunes 跨平台 IAP 订阅 - Netflix 是如何做到的?