iOS 7服务器收据验证(php)

我想验证iOS 6和iOS 7的iap收据(非消费和自动续订).

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

receipt validation documentation中,它表示要验证可自动更新的订阅收据,我们会发送带有共享密钥的JSON对象,然后我们会收到具有特定状态的响应.

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

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

还有办法通知我要检查哪个特定的购买?
我猜不是.

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

解决方法:

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

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

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

“latest_receipt_info”:({
“quantity”:”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的验证服务器,就像您存储的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 library自动续订订阅或RMStore.希望这有帮助!

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...