【问题标题】:How to find the latest receipt of in app purchase using iOS 7 style receipt如何使用 iOS 7 样式收据查找应用内购买的最新收据
【发布时间】:2014-10-13 10:52:45
【问题描述】:

当用户购买应用内商品时,我正在尝试在设备上本地获取最新的收据信息。我的问题是我不知道如何从 latest_receipt_info 字段中的收据数组中获取最新的收据(应该是最新购买的收据)。不知何故,所有收据中的所有 pruchase_date_ms 字段都具有相同的值。

 {
        "expires_date" = "2014-07-09 20:32:10 Etc/GMT";
        "expires_date_ms" = 1404937930000;
        "expires_date_pst" = "2014-07-09 13:32:10 America/Los_Angeles";
        "is_trial_period" = false;
        "original_purchase_date" = "2014-07-09 20:27:10 Etc/GMT";
        "original_purchase_date_ms" = 1404937630000;
        "original_purchase_date_pst" = "2014-07-09 13:27:10 America/Los_Angeles";
        "original_transaction_id" = 1000000116335839;
        "product_id" = "product1";
        "purchase_date" = "2014-10-13 10:28:39 Etc/GMT";
        "purchase_date_ms" = 1413196119831;
        "purchase_date_pst" = "2014-10-13 03:28:39 America/Los_Angeles";
        quantity = 1;
        "transaction_id" = 1000000116358850;
        "web_order_line_item_id" = 1000000028383484;
    },
            {
        "is_trial_period" = false;
        "original_purchase_date" = "2014-09-15 13:34:17 Etc/GMT";
        "original_purchase_date_ms" = 1410788057000;
        "original_purchase_date_pst" = "2014-09-15 06:34:17 America/Los_Angeles";
        "original_transaction_id" = 1000000123804432;
        "product_id" = "product2";
        "purchase_date" = "2014-10-13 10:28:39 Etc/GMT";
        "purchase_date_ms" = 1413196119831;
        "purchase_date_pst" = "2014-10-13 03:28:39 America/Los_Angeles";
        quantity = 1;
        "transaction_id" = 1000000123804432;
    }

在上面的示例中,我实际上为 product2 进行了测试购买,但现在我也收到了具有相同 purchase_date_msproduct1 >。有谁知道为什么?

【问题讨论】:

  • 你是怎么拿到收据的?从应用程序包?从恢复? “对于恢复之前交易的交易,购买日期为恢复日期。使用原始购买日期获取原始交易的日期”(developer.apple.com/library/ios/releasenotes/General/…)。我不记得 100%,但我认为原始购买日期总是更安全的选择。
  • 我收到收据后发送到苹果服务器进行验证。我不明白的是,在上面的示例中,我在购买 product2 之前很久就购买了 product1,但在收据中,两种产品的购买日期相同
  • 可以继续使用原购买日期吗?

标签: ios in-app-purchase receipt-validation


【解决方案1】:

此代码可用于获取自动更新应用内购买的最后一笔交易收据

if let receipt =  NSBundle.mainBundle().appStoreReceiptURL {
        if let data = NSData(contentsOfURL: receipt) {
            let requestContents:[String:String] = ["receipt-data":data.base64EncodedStringWithOptions([]), "password": “Your Shared Secret from iTunes Connect App”]
            let requestData = try! NSJSONSerialization.dataWithJSONObject(requestContents,options: [])
            let request = NSMutableURLRequest(URL: NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!)
            request.HTTPMethod = "POST"
            request.HTTPBody = requestData
            let (param, _) = Alamofire.ParameterEncoding.URL.encode(request, parameters: nil)

            Alamofire.request(param)
                .responseJSON(options: [], completionHandler: { (result) -> Void in

                    if(result.result.isSuccess)
                    {
                        let dictionary : NSDictionary = result.result.value as! NSDictionary

                        let status = dictionary["status"] as! Int

                        if(status == 0)
                        {
                            let receipts: NSMutableArray = dictionary["latest_receipt_info"] as! NSMutableArray

                            let latestRecipt = receipts.lastObject as? NSDictionary
                           // This is receipt of your last transaction for auto renewable in-App purchases only
                              print(“Last Receipt \(latestRecipt)")
                        }
                        else
                        {
                            NSLog("Something went wrong Status = \(status)")
                            if(status == 21006)
                            {
                                NSLog("subscription is Expired or cancelled")
                            }

                        }

                    }

                })
        } else {
            NSLog("Reciept has no data")
        }
    }else {
        NSLog("Reciept not found")

    }

【讨论】:

    【解决方案2】:

    只需按降序排列expires_time_ms,然后排在最后。 Ruby代码如下:

    data['receipt']['in_app'].sort_by { |x| x['expires_date'] }.last
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2017-12-19
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多