Sandbox can purchase auto-renewable subscriptions but non-consumable IAP is always invalid

I’m testing In-App Purchases in the sandbox on a real iPhone.

Auto-renewable subscriptions work correctly with the same app build, bundle ID, and sandbox tester account:

  • com.aifalling.sides.vip.monthly
  • com.aifalling.sides.vip.yearly

However, a non-consumable product can’t be purchased:

  • Product ID: com.aifalling.sides.vip.onetime
  • App Store Connect IAP Apple ID: 6794812888
  • Type: Non-Consumable
  • Status: Ready to Submit
  • Bundle ID: com.aifalling.sides

The native StoreKit payment request fails immediately with:

The purchase identifier was invalid.

The wrapper reports error code 700605. I verified the non-consumable product through the App Store Connect API:

  • Product ID exists and is returned by the API
  • One localization exists: zh-Hans
  • A price schedule is configured, including a base territory and prices
  • Availability includes China (CHN) and many other territories
  • availableInNewTerritories is true
  • I waited more than one hour after the latest metadata changes
  • I completely removed the app, rebuilt/reinstalled the custom development build, and retried
  • The same signed build can successfully purchase the two auto-renewable subscriptions

This is the first non-consumable IAP type for this app. The app and IAPs have not been submitted for App Review yet because I’m trying to complete sandbox testing first.

Does a non-consumable IAP require any additional App Store Connect setup or association that an auto-renewable subscription doesn’t require for sandbox testing? Is Ready to Submit sufficient for sandbox testing of a non-consumable product in this situation?

Any guidance would be appreciated.

here the result of obtaining the product list using the IAP API:

App Store Connect app 6791526137: 3 Product ID(s)

  • com.aifalling.sides.vip.monthly (月会员; SUBSCRIPTION | AUTORENEWABLE_SUBSCRIPTION | ONE_MONTH | READY_TO_SUBMIT | SIDES VIP)
  • com.aifalling.sides.vip.onetime (onetime; IN_APP_PURCHASE | NON_CONSUMABLE | READY_TO_SUBMIT)
  • com.aifalling.sides.vip.yearly (年会员; SUBSCRIPTION | AUTORENEWABLE_SUBSCRIPTION | ONE_YEAR | READY_TO_SUBMIT | SIDES VIP)

here the result of obtaining the product info using the IAP API:

StoreKit diagnostic: com.aifalling.sides.vip.onetime (6794812888)

  • State: READY_TO_SUBMIT
  • Localizations: 1 (zh-Hans:终身卡)
  • Price schedule: base territory=yes, manual=1, automatic=50, returned prices=51
  • Availability: new territories=true, returned=50, territories=USA,FRA,DEU,GBR,AUT,BEL,FIN,GRC,IRL,ITA,LUX,NLD,PRT,ESP,CAN,SWE,NOR,DNK,CHE,AUS,NZL,JPN,HKG,SGP,CHN,KOR,IND,MEX,RUS,TWN,VNM,ZAF,MYS,PHL,THA,IDN,PAK,POL,SAU,TUR,ARE,HUN,CHL,NPL,PAN,LKA,ROU,MDV,CZE,ISR
Sandbox can purchase auto-renewable subscriptions but non-consumable IAP is always invalid
 
 
Q