[英]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.