脱力駆動開発記

ゲームアプリを作るエンジニアの技術メモ

MENU

【Unity/IAP】2023/8/14頃からUnityIAPでのiOSローカルレシート検証で失敗するようになった場合の対策

前提

  • 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

これ気づかずにアプリのアップデートを公開すると課金収益がゼロになる可能性もあるってことですね。
レシート検証は大手とかではサーバー側でやるケースが多いかと思いますが、ローカルの検証で済ませているところもあるかと思いますので、参考になれば幸いです。

参考

forum.unity.com