Я работаю над подтверждением квитанции для подписки с автоматическим продлением. Встреча с большой проблемой, когда дело доходит до восстановления. Восстановление, похоже, восстанавливает старую транзакцию с другим product_id, поэтому мой пользовательский интерфейс помечен как просроченный.
Покупка работает отлично.
Вот ответ JSON, когда я делаю покупку:
LAST RECEIPT INFORMATION:
{
"expires_date" = "2019-01-20 18:29:02 Etc/GMT";
"expires_date_ms" = 1548008942000;
"expires_date_pst" = "2019-01-20 10:29:02 America/Los_Angeles";
"is_in_intro_offer_period" = false;
"is_trial_period" = false;
"original_purchase_date" = "2019-01-20 18:26:03 Etc/GMT";
"original_purchase_date_ms" = 1548008763000;
"original_purchase_date_pst" = "2019-01-20 10:26:03 America/Los_Angeles";
"original_transaction_id" = 1000000484645981;
"product_id" = "com.mywebsite.weekly"; // The CORRECT product_id of what I am purchasing in sandbox.
"purchase_date" = "2019-01-20 18:26:02 Etc/GMT";
"purchase_date_ms" = 1548008762000;
"purchase_date_pst" = "2019-01-20 10:26:02 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000495942050;
"web_order_line_item_id" = 1000000042313304;
}
- DATE BOUGHT SUBSCRIPTION = 2019-01-20 18:26:03 +0000
- DATE SUBSCRIPTION EXPIRES = 2019-01-20 18:29:02 +0000
Вы можете видеть, что разница между "original_purchase_date" = "2019-01-20 18:26:03 Etc/GMT";
и "expires_date" = "2019-01-20 18:29:02 Etc/GMT";
составляет 3 минуты, как это должно быть в песочнице для недельной подписки.
Теперь приходит проблема ..
Когда я восстанавливаю, ИЛИ , когда я повторно покупаю тот же продукт (и получаю сообщение, что StoreKit уже подписан на него), я получаю совершенно другие product_id
и expires_date
:
LAST RECEIPT INFORMATION:
{
"expires_date" = "2019-01-17 16:47:19 Etc/GMT";
"expires_date_ms" = 1547743639000;
"expires_date_pst" = "2019-01-17 08:47:19 America/Los_Angeles";
"is_in_intro_offer_period" = false;
"is_trial_period" = false;
"original_purchase_date" = "2019-01-20 18:38:59 Etc/GMT";
"original_purchase_date_ms" = 1548009539000;
"original_purchase_date_pst" = "2019-01-20 10:38:59 America/Los_Angeles";
"original_transaction_id" = 1000000495390111;
"product_id" = "com.mywebsite.group2.weekly2"; // WRONG product_id
"purchase_date" = "2019-01-17 16:44:19 Etc/GMT";
"purchase_date_ms" = 1547743459000;
"purchase_date_pst" = "2019-01-17 08:44:19 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000495942766;
"web_order_line_item_id" = 1000000042278610;
}
- DATE BOUGHT SUBSCRIPTION = 2019-01-20 18:38:59 +0000 // This is the time that I "re-bought" the product and StoreKit told me I'm already subscribed.)
- DATE SUBSCRIPTION EXPIRES = 2019-01-17 16:47:19 +0000 // This is the completely wrong date.
Вот часть моего средства проверки квитанции, которую я получаю купленным / срок действия:
if let receiptInfo: NSArray = appReceiptJSON!["latest_receipt_info"] as? NSArray {
let lastReceipt = receiptInfo.lastObject as! NSDictionary
// Get last receipt
print("\nLAST RECEIPT INFORMATION: \n", lastReceipt)
// Format date
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
// Get "original_purchase_date" as NSDate
let subscriptionBoughtDate: NSDate = formatter.date(from: lastReceipt["original_purchase_date"] as! String)! as NSDate
print("\n - DATE BOUGHT SUBSCRIPTION = \(subscriptionBoughtDate)\n")
// Get "expires_date" as NSDate
let subscriptionExpirationDate: NSDate = formatter.date(from: lastReceipt["expires_date"] as! String)! as NSDate
print("\n - DATE SUBSCRIPTION EXPIRES = \(subscriptionExpirationDate)\n")
// Save the expiration date.
// ...
// Done saving the expiration date.
}
Почему при восстановлении / повторной покупке у меня совершенно неправильный product_id и дата истечения срока действия, а первоначальная покупка работает нормально?
При необходимости я могу опубликовать больше кода, чтобы помочь отладить эту причудливую проблему. Просто дайте мне знать, что вы хотели бы увидеть.