Copyright © 2026 Unity Technologies
Description
In IAP 5.1.0, the default value of m_RefreshAppReceipt in AppleStoreImpl was silently changed from true to false as part of as part of the StoreKit 1 reinstatement work. This causes order.Info.Receipt to always return an empty Payload field for StoreKit 2 purchases, breaking any third-party SDK or backend that relies on the App Receipt for iOS purchase validation.
The issue has two compounding problems:
This was reported by a customer who experienced a 25-30% drop in validated revenue events after upgrading from IAP 5.0.4 to 5.2.1. All purchases reported to Singular were marked as {}iapInvalid{} due to the empty Payload.
Initial setup
Reproduction steps
Expected behaviour
order.Info.Receipt should contain a populated Payload field containing the base64-encoded App Receipt, consistent with IAP 5.0.x behaviour and consistent with the existing XML documentation which states the refresh is "True by default".
{"Payload":"MIIUZ...==","Store":"AppleAppStore","TransactionID":"2000001162882605"}
Actual behavior
order.Info.Receipt always returns an empty Payload because m_RefreshAppReceipt defaults to false in AppleStoreImpl.cs. This affects both OnPurchasePending (new purchases) and OnPurchasesFetched (fetched confirmed orders).
{"Payload":"","Store":"AppleAppStore","TransactionID":"2000001164329034"}
The only available workaround is calling the deprecated SetRefreshAppReceipt(true):
Unable to find source-code formatter for language: csharp. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yamlstoreController.AppleStoreExtendedPurchaseService?.SetRefreshAppReceipt(true);
The XML documentation on IAppleStoreExtendedPurchaseService is also incorrect:
// TODO: IAP-3929 /// [summary] /// Indicates whether to automatically refresh the app receipt when a purchase is made. /// This is useful if you are still using the receipt to validate purchases. /// True by default. [-- INCORRECT: default is false since ULO-7255 /// </summary] [Obsolete] void SetRefreshAppReceipt(bool refreshAppReceipt);
Issues you vote on will appear here