Проверка квитанции с использованием учетной записи 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)")
        }
    }
}

Как я мог справиться с этим?

0 ответов

Другие вопросы по тегам