iOS 7服务器收据validation(php)

我想validationiOS 6和iOS 7的iap收据(非消费和自动续订)。

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

在收据validation文档中,它表示要validation可自动更新的订阅收据,我们会发送带有共享密钥的JSON对象,并获得具有特定状态的响应。

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

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

还有一种方法可以通知我要检查哪个特定的购买? 我猜不是。

我是否必须使用我的服务器进行iOS 6和iOS 7的设备validation? 如果有,怎么样? :S

对于iOS7,您不会将SKPaymentTransactiontransactionReceipt发送到您的服务器,而是发送应用收据(在base64编码之后,就像使用transactionReceipt )。

您可以尝试在此答案中运行实现,以了解如何发送它以及查看从App Store返回的JSON响应的结构。

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 Etc / GMT”,
“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 Etc / GMT”,
“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字段,其中包含您可以存储在服务器上的收据(base64编码)并发送到Apple的validation服务器,就像您对存储的iOS6收据一样。

看起来您需要手动计算是否有任何有效订阅。 也许是这样的(未经测试):

 $desired_product_identifier = ; $response = ; $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执行本地应用程序收据validation,您可以查看我的github库以获取可自动更新的订阅或RMStore 。 希望这可以帮助!