酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

RevenueCatで `The receipt is not valid.` エラーが発生して、共有シークレットを更新してもエラーが解決できなかった

アプリ開発界隈で、課金管理をスムーズに行うために多くの開発者が利用する「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の公式ドキュメントで詳細に説明されている。適切に設定し直したはずなのにエラーが解消されない場合もある。

www.revenuecat.com

Chromeで設定が上手くいかないケース

調査したところ、Chromeを使用してRevenueCatの設定を更新すると、変更が正しく保存されないという問題を発見した。

もしThe receipt is not valid.エラーが続いている場合、ブラウザをSafariに変えて設定を更新すると良いかもしれない。

関連記事

zenn.dev