我可以读取应用内购买的收据(在沙盒中)。我想验证它们是否检查已取消的订阅。但问题是,当我订阅任何产品时,我得到">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
字段。再次来自苹果:
对于为 特定订阅。此值对于关联在一起很有用 同一人的多张iOS 6样式的交易收据 客户的订阅。
但根据你写的内容,这似乎过于复杂了。¯_(ツ)_/¯