Проверка квитанции с использованием учетной записи iTunes, отличной от той, которая использовалась для подписки
Надеюсь, это не слишком неловко! Вот проблема:
- У меня есть приложение, которое имеет свою собственную пользовательскую систему, поэтому вы можете иметь несколько учетных записей на одном устройстве (использует Firebase)
- Я реализовал автообновляемые подписки.
- Когда пользователь подписывается и транзакция прошла успешно, я сохраняю их
original_transaction_id
в базе данных под ихUID
и в отдельном узле. Как это:
[Their UID]
- oti: [their original_transaction_id]
И это:
originalTransactionIds
- [their original_transation_id]: [their UID]
Я сделал это так, чтобы, если другой пользователь вошел в систему и попытался подписаться с той же учетной записи iTunes, я смог найти, использует ли их OTI и, если да, попросить его подписаться с использованием другой учетной записи iTunes. Наряду с этим я изменяю некоторые значения в базе данных, чтобы дать им доступ к содержимому участника, например, сохранение даты истечения срока действия, типа подписки и т. Д.
Теперь, когда пользователь входит в систему, я проверяю, подписаны ли они, выполняя поиск в базе данных для bool под isSubscribed
, Если это так, я запускаю функцию SwiftyStoreKit, чтобы проверить данные об истечении срока действия. Если истек срок действия, я:
- Изменить некоторые значения членов в БД
- Удалить их OTI из
originalTransactionIds
узел, так что другой пользователь из той же учетной записи iTunes может подписаться.
Однако проблема заключается в том, что если пользователь, использовавший для покупки подписки, входит в систему, используя устройство с другой учетной записью iTunes (или на устройстве с другой учетной записью iTunes), функции SwiftyStoreKit будут проверять получение этой самой учетной записи iTunes и использовать OTI этого аккаунта, а не тот, который использовался для покупки подписки. Та же проблема возникает при восстановлении покупок.
Вот пример функции, которую я использую при входе в систему, чтобы проверить, не истек ли срок подписки:
func checkExpiry() {
let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: "my_shared_secret")
SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
switch result {
case .success(let receipt):
let productIds = Set(["com.app.sub.monthly", "com.app.sub.quarterly", "com.app.sub.yearly"])
let purchaseResult = SwiftyStoreKit.verifySubscriptions(productIds: productIds, inReceipt: receipt)
switch purchaseResult {
case .purchased(let expiryDate, let items):
print(expiryDate)
case .expired(let expiryDate, let items):
setExpired() //handle it in db
print("expired on: ", expiryDate)
case .notPurchased:
print("not purchased")
}
case .error(let error):
print("Receipt verification failed: \(error)")
}
}
}
Как я мог справиться с этим?