前提
- UnityIAP v4.9.3以前を使用
- iOS課金のレシート検証をローカルでやっている
起きる現象
InvalidSignatureExceptionが発生して、CrossPlatformValidator.Validateが通らなくなる。
コード的には以下のようなコードで例外(InvalidSignatureException)が発生する。
var validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.identifier); if(validator.Validate(args.purchasedProduct.receipt)) { // レシート検証成功後の処理 }else { // 失敗時の処理 }
気づかずにAppStoreでそのバージョンを公開してしまうと、そのアプリでは修正するまで課金ができなくなる
対応
Unity IAP v4.9.4にアップデートする。
以上。
何が起きているのか
Appleのお知らせより https://developer.apple.com/jp/news/?id=smofnyhj
Appleプラットフォームのセキュリティとプライバシーを改善するための継続的な取り組みの一環として、Appの販売や関連するApp内課金を検証する際に使用されるApp Storeのレシート署名中間証明書がアップデートされ、SHA-256暗号化のアルゴリズムが使用されることになります。
このアップデートは段階的に実施され、新規AppおよびAppのアップデートに影響が及ぶかどうかはレシートの検証方法によって決まります。
重要なスケジュール
2023年8月14日:App Storeに提出される新規AppやAppのアップデート、およびSandbox環境のAppでは、レシートがSHA-256中間証明書で署名されるようになります。
つまり2023/8/14以降にストアにアップロードしたアプリのレシートはSHA-256で暗号化されます。
UnityIAP v4.9.3以前では、SHA-1でレシートが暗号化されている前提の作りになっているので、検証時に失敗してしまうということになります。
UnityIAPのChangelogにも記載があります。
- Apple - Using the CrossPlatformValidation (or AppleValidator), receipts will now be validated if their certificate chain is encoded in SHA-256 instead of SHA-1. Old receipts encoded in SHA-1 will still be validated. See Apple Technical Note.
Official - Unity IAP package 4.9.4 is now available | Page 3 - Unity Forum
これ気づかずにアプリのアップデートを公開すると課金収益がゼロになる可能性もあるってことですね。
レシート検証は大手とかではサーバー側でやるケースが多いかと思いますが、ローカルの検証で済ませているところもあるかと思いますので、参考になれば幸いです。