アプリ開発界隈で、課金管理をスムーズに行うために多くの開発者が利用する「RevenueCat」だが、導入する際に「The receipt is not valid.(レシートが無効です)」というエラーが発生する。
これは大抵の場合、「アプリ固有の共有シークレット」が間違って設定されているか、設定自体がなされていないことが原因である。
SwiftyStoreKitからRevenueCatへの移行の経緯
現在、SwiftyStoreKitからRevenueCatへの移行作業に取り組んでいる。
Xcode 14.0でのSwiftyStoreKitが動かなくなる問題で苦労したため、新規の案件ではSwiftyStoreKitを使うのを避けている。Swift Concurrency に対応したStoreKit 2や、StoreKit 1をラッピングしたRevenueCatなどのサービスを利用している。今回はRevenueCatを選択した。
RevenueCatを使っていて嬉しい理由として、コードが非常にシンプルであることだ。以下にサブスクリプションの復元処理(リストア)の一例を挙げる。
private func restoreSubscription() async -> Result<Void, Error> { do { let purchaserInfo = try await Purchases.shared.restorePurchases() if let entitlementInfo = purchaserInfo.entitlements.all["premium"] { if entitlementInfo.isActive { logger.debug("課金中: \(String(describing: entitlementInfo.expirationDate)) まで") } else { logger.debug("レシートはあるが有効期間切れで非課金") } } else { logger.debug("レシートがないので非課金") } return .success(()) } catch { return .failure(error) } }
The receipt is not valid.
エラーと解決方法
しかし、復元処理中にThe receipt is not valid.
というエラーが発生し、解決までに少々手間取った。この問題は「アプリ固有の共有シークレット」が適切に設定されていないときに起こることが多い。
共有シークレットの設定については、RevenueCatの公式ドキュメントで詳細に説明されている。適切に設定し直したはずなのにエラーが解消されない場合もある。
Chromeで設定が上手くいかないケース
調査したところ、Chromeを使用してRevenueCatの設定を更新すると、変更が正しく保存されないという問題を発見した。
もしThe receipt is not valid.
エラーが続いている場合、ブラウザをSafariに変えて設定を更新すると良いかもしれない。