iOSのアプリ内課金を使うときにはApp用共有シークレットを使おう

はじめに

iOSのアプリ内課金には癖がある。 このブログで6年前に書いたアプリ内課金の記事が未だにアクセスが多いのは、みんな困っているからなのだろう。

iOSのアプリ内課金(In App Purchase)での注意点

今回もアプリ内課金でハマったので書いておきます。

経緯

App Store Connectではアプリ毎に別のAppleアカウントにアプリを譲渡することができる。 アプリの運営元が変わったときにアプリを別のアカウントに統合するため等に利用する。

今回、既にリリースしているアプリを別のAppleアカウントに譲渡することになった。 しかもそのアプリは月額課金のサブスクリプションモデル。

このアプリで、譲渡前に月額課金を利用していたユーザーから、アプリを再インストールすると課金情報が復元できずアプリが利用できないという連絡をもらいました。 試してみると実は新規購入も出来ないことがわかった。

原因は共有シークレットを利用していたから

アプリ内課金を行う場合には課金の妥当性を確認するためにレシートの検証を行う必要がある。 コードとしては下記のような感じでレシートの検証を行っていた。

ここで8行目のpasswordに共有シークレットを設定していることが主な原因だった。 この影響で「購入データの検証に失敗しました(21004)」というエラーが発生して課金情報を復元することができなかった。

In App Purchase

共有シークレットとApp共有シークレット

実は共有シークレットには2つの種類がある。 まずはAppleアカウントに紐付いてる共有シークレット。

In App Purchase

そして、もう一つがアプリに紐付いているApp用共有シークレット。

In App Purchase

そして、今回のアプリはAppleアカウントに紐付いている共有シークレットを使ってレシートの検証を行っていた。 通常ならコレで問題ない。実際に課金処理は動作していた。

しかし、今回はアプリの譲渡を行った事で問題が発生した。 譲渡の際にはアプリと一緒に、証明書やApp用共有シークレットが譲渡されるが、アカウントに紐付いている共有シークレットは変わってしまう。

アプリではアカウントに紐づく共有シークレットを利用していたため、アプリ譲渡のタイミングでレシートの検証が行えなくなってしまった。

レシートの検証にはApp用共有シークレットを使う

後で気がついたが、App用共有シークレットの画面に注意書きが書いてある。

このAppを他のデベロッパに譲渡する、またはマスター用共有シークレットを非公開にする場合に、App用共有シークレットを使用します。

実は、App用共有シークレットはアプリ譲渡の際に新しく生成した。 つまり、いままでは生成もされていなかった。

では公式ドキュメントには書いてあるのか?

レシート検証 プログラミングガイド

自動更新購読が含まれているレシートにのみ使用。アプリケーションの共有シークレット(16 進数文字列)。

20ページ目に共有シークレットについて書かれている。 今見れば確かに「アプリケーションの〜」と書かれているが、アカウントに紐付いている方も「共有シークレット」なので気が付かなかった。

まとめ

アプリ内課金には色々と考慮すべき点がある。 今回はアプリ譲渡という頻繁には発生しない条件下で発生したため、ネットにも情報が少ない。 だからこそ、忘れた頃にハマらない為にもアプリ内課金でレシート検証を行う際にはApp用共有シークレットを利用する癖を付けておいたほうが良さそう。

今回は、利用者からの連絡がアプリ譲渡後の早い段階だった為、大事には至らなかった。 そもそも、アプリ譲渡のタイミングで課金処理を一度試してみるべきだった。

ということで皆さんもアプリ内課金を実装する際には気をつけて。

Let’s enjoy development.