繁体   English   中英

iOS在app中购买收据,缺少最近的交易

[英]iOS in app purchase receipt, missing recent transactions

我可以阅读应用内购买的收据(在沙箱中)。 我想验证它们是否取消订阅。 但问题是,当我订阅任何产品时,我得到' transaction_id '值,但是当我重新启动我的应用并再次获得收据时,我之前的' transaction_id '值丢失了。 我希望我的订阅' transaction_id '始终显示在我的收据数组中。

这是我的代码:

func receiptValidation() {

    let receiptFileURL = Bundle.main.appStoreReceiptURL
    let receiptData = try? Data(contentsOf: receiptFileURL!)
    let recieptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    let jsonDict: [String: AnyObject] = ["receipt-data" : recieptString! as AnyObject, "password" : "My-App-Shared-Secret" as AnyObject]
    do {
        let requestData = try JSONSerialization.data(withJSONObject: jsonDict, options: JSONSerialization.WritingOptions.prettyPrinted)
        let verifyReceiptURL = "https://sandbox.itunes.apple.com/verifyReceipt"
        let storeURL = URL(string: verifyReceiptURL)!
        var storeRequest = URLRequest(url: storeURL)
        storeRequest.httpMethod = "POST"
        storeRequest.httpBody = requestData

        let session = URLSession(configuration: URLSessionConfiguration.default)
        let task = session.dataTask(with: storeRequest, completionHandler: { [weak self] (data, response, error) in
            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
                print("=======>",jsonResponse)
                if let date = self?.getExpirationDateFromResponse(jsonResponse as! NSDictionary) {
                    print(date)
                }
            } catch let parseError {
                print(parseError)
            }
        })
        task.resume()
    } catch let parseError {
        print(parseError)
    }
}

func getExpirationDateFromResponse(_ jsonResponse: NSDictionary) -> Date? {

    if let receiptInfo: NSArray = jsonResponse["latest_receipt_info"] as? NSArray {

        let lastReceipt = receiptInfo.lastObject as! NSDictionary

        // Get last receipt
        print("LAST RECEIPT INFORMATION \n",lastReceipt)

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
        formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale

        if let expiresDate = lastReceipt["expires_date"] as? String {
            print("\n   - DATE SUBSCRIPTION EXPIRES = \(expiresDate)")
            return formatter.date(from: expiresDate)
        }

        return nil
    }
    else {
        return nil
    }
}

任何帮助将不胜感激。

谢谢

我认为您不应该依赖transaction_id来检查已取消的订阅。

根据Apple的文档 (搜索“transaction_id”),它可以随时间变化:

对于恢复先前交易的交易,该值与原始购买交易的交易标识符不同。 在自动续订订阅收据中,每次订阅在新设备上自动续订或恢复时,都会生成事务标识符的新值。

相反,最好使用来自latest_receipt_info数组的最新expires_date
将其与今天的日期进行比较,以检查订阅是否已过期。


此字段还可能支持您的用例: auto_renew_status

如(从Apple的验证JSON响应):

{
  "status": 0,
  "environment": "Sandbox",
  "receipt": {...},
  "latest_receipt_info": [{...}],
  "latest_receipt": "...",
  "pending_renewal_info": [
    {
      "auto_renew_product_id": "<yourAutoRenewProductID>",
      "original_transaction_id": "<transacionID>",
      "product_id": "<yourProductID>",
      "auto_renew_status": "1" <<=== This one here
    }
  ]
}

“1” - 订阅将在当前订阅期结束时续订。

“0” - 客户已关闭其订阅的自动续订。

记住:

此密钥仅适用于自动续订订阅收据,适用于活动订阅或过期订阅。 此密钥的值不应被解释为客户的订阅状态。 您可以使用此值在应用程序中显示备用订阅产品,例如,客户可以从其当前计划降级到的较低级别订阅计划。


如果你真的需要知道原始的transaction_id ,那么就有original_transaction_id字段。 再次来自Apple:

对于为特定订阅生成的所有收据,此值都相同。 此值对于将多个iOS 6样式的交易收据关联到同一个人客户的订阅非常有用。

但根据你所写的内容,这似乎过于复杂。 ¯\\_(ツ)_/¯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM