我想验证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.希望这有帮助!
原文地址:https://codeday.me/bug/20190714/1459933.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。