iOS 7 服务器收据验证 (php)[英] iOS 7 Server Receipt validation (php)

本文是小编为大家收集整理的关于iOS 7 服务器收据验证 (php)的处理方法,想解了iOS 7 服务器收据验证 (php)的问题怎么解决?iOS 7 服务器收据验证 (php)问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想验证 iOS 6 和 iOS 7 的 iap 收据(非消耗性订阅和自动更新订阅).

由于我使用服务器来遵循 iOS 6 的最佳实践,我也想将它用于 iOS 7(主要用于订阅).这是一个报亭杂志应用程序,所以我在我的服务器上保留收据,我想检查哪些收据包含有效订阅,以便我可以向这些用户发送推送通知以后台下载下一期.对于 iOS 6,一切正常,但在 iOS 7 中,有很多混乱.

收据验证文档它说要验证自动更新订阅收据,我们发送带有共享密钥的 JSON 对象,然后我们会收到具有特定状态的响应.

这适用于 iOS 7 吗?这对我来说不是很清楚.

iOS 7 收据的状态是指应用收据本身(而不是特定的应用内购买).那么,如果我必须检查应用收据中的每个 iap 条目(例如,将 iap 到期日期与当前日期进行比较),我是否必须在我的服务器上实现应用收据解析?

还有一种方法可以通知我要检查的具体购买吗?我猜没有.

我是否必须将我的服务器用于 iOS 6 和 iOS 7 的设备验证?如果是,如何?:S

推荐答案

对于 iOS7,您将发送应用收据而不是发送 SKPaymentTransaction 的 transactionReceipt 到您的服务器(在 base64 编码后就像您一样transactionReceipt).

您可以尝试在此 answer 中运行实现,以查看如何发送并查看 JSON 的结构您从 App Store 收到的回复.

JSON 响应有一个 latest_receipt_info 字段,其中包含用户进行的应用内购买的列表以及有关其到期的信息,例如:

<块引用>

"latest_receipt_info":({
"数量":"1",
"product_id":"com.example.subscription_30",
"transaction_id":"1000000097606958",
"original_transaction_id":"1000000097606821",
"purchase_date":"2014-01-01 13:22:25 等/格林威治标准时间",
"purchase_date_ms":"1388582545000",
"purchase_date_pst":"2014-01-01 05:22:25 America/Los_Angeles",
"original_purchase_date":"2014-01-01 11:10:40 Etc/GMT",
"original_purchase_date_ms":"1388574640000",
"original_purchase_date_pst":"2014-01-01 03:10:40 America/Los_Angeles",
"expires_date":"2014-01-01 11:14:35 等/格林威治标准时间",
"expires_date_ms":"1388574875000",
"expires_date_pst":"2014-01-01 03:14:35 America/Los_Angeles",
"web_order_line_item_id":"1000000027707568"},
...)

JSON 响应还包括一个 latest_receipt 字段,其中包含您可以存储在服务器上并发送到 Apple 验证服务器的收据(base64 编码),就像您使用存储的 iOS6 收据一样.

您似乎需要手动计算是否有任何有效订阅.也许是这样的(未经测试):

$desired_product_identifier = <identifier of your in-app purchase>;
$response = <JSON response you get from Apple verification server>;
$receipt = json_decode($response);  
$latest_expiration_interval_since_1970 = 0;
for ($receipt_info in $receipt['latest_receipt_info']) {
    if ($receipt_info['product_id'] != $desired_product_identifier)
        continue;

    $expiration_interval_since_1970 = intval(doubleval($receipt_info['expires_date_ms']) / 1000.0);
    if ($expiration_interval_since_1970 > $latest_expiration_interval_since_1970) {
        $latest_expiration_interval_since_1970 = $expiration_interval_since_1970;
    }
}

$is_subscription_active = ($latest_expiration_interval_since_1970 > time());

如果这不起作用并且您需要为 iOS7 执行本地应用收据验证,您可以查看我的 github库 用于自动更新订阅或 RMStore.希望这会有所帮助!

本文地址:https://www.itbaoku.cn/post/924454.html