はじめに
あるとき突然、「テスト課金ができない。特に課金周りのコードはいじっていないのに...」ということがあったので記事を書いておこうと思います。
この記事で問題を解決できるかもしれない人
以下の3つ条件に当てはまればおそらく解決できます。
逆に以下の3つの条件を満たさない場合は、この記事で問題を解決できない可能性が高いです。
- サーバー側、アプリ側のコードをいじっていないのに、消費型の課金テストが急にできなくなった
- レシート検証で「21003」が返ってくる
- 直近で
サブスクのアイテム
をAppStoreConnectに追加した
※レシート検証時のstatusの値のそれぞれの意味は以下のドキュメントに記載があります。
結論
- レシート検証の時に
App用共有シークレット
をレシート情報と一緒に送れば解決!
解決方法
①AppStoreConnectから該当アプリの「App用共有シークレット」の値を取得する
- AppStoreConnectにログインします
- 課金ができなくなってしまったアプリのメニューの
サブスクリプション
を開きます(以下の画像参照)
※画像は2022年7月14日現在のもので、この記事をご覧いただいている時点では場所が変わっているかもしれません - App用共有シークレットの
管理
をクリックします
- 以下の画像のような画面が表示されると思います
- もし
共有シークレット
が表示されていない場合は作成してください -
共有シークレット
の値をコピーします
②レシート検証時に共有シークレットをリクエストのBodyに入れる
- レシート検証を行う際には自前のサーバーからAppleに対して「
"receipt-data": "Base64エンコードしたレシート情報"
」を送っているはず - そこに「
"password": "取得したApp共有シークレット"
」も追加する
これで、テスト課金ができるようになっているはずです。
※レシート検証時リクエストとレスポンスのbody
-
リクエスト
https://developer.apple.com/documentation/appstorereceipts/requestbody -
レスポンス
https://developer.apple.com/documentation/appstorereceipts/responsebody
※一応レシート検証用のエンドポイントも載せておきます
本番課金のレシート検証用エンドポイント
https://buy.itunes.apple.com/verifyReceipt
テスト課金のレシート検証用エンドポイント
https://sandbox.itunes.apple.com/verifyReceipt
原因
結論から言うと詳細はよくわかりませんでした。しかし、消費型の課金のみの場合はレシート検証時にpassword
をレシート検証時のパラメータに追加しなくても大丈夫なようですが、サブスクを追加すると消費型課金のレシート検証においてもApp共有シークレット
をpassword
のキーと共にパラメータとして入れておかなければならないみたいです。
もし、詳細情報を知っている方がいたら教えてほしいです....
終わりに
もし誰かの役に立っていたら嬉しいです。
おーわーり。
参考記事