【问题标题】:iOS 7 Server Receipt validation (php)iOS 7 服务器收据验证 (php)
【发布时间】:2013-12-27 12:07:42
【问题描述】:

我想验证 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

【问题讨论】:

    标签: php ios iphone objective-c ios7


    【解决方案1】:

    对于 iOS7,您无需向服务器发送 SKPaymentTransactiontransactionReceipt,而是发送应用收据(在 base64 编码后,就像您使用 transactionReceipt 一样)。

    您可以尝试在此answer 中运行实现,以查看如何发送它并查看您从 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 等/格林威治标准时间",
    "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 library 以获得自动更新订阅或 RMStore。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2014-07-19
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多