Been working through this and have a couple new things to add to this discussion in case it helps someone. (or I learn more when someone corrects me! )
First:
The V2 ReadIAP node fails if the user isn’t logged in to GPS, but that isn’t actually a requirement. The google version of the query function call StoreInterface->QueryOffersById(…) doesn’t even use the ID. It may just be included in the interface for other platforms.
I commented out the IsValid() check on the networkID and it works perfectly. This is obviously a hack, and it seems like the check should be the responsibility of the QueryOffersById function of each platform if some need it and some don’t.
See: UInAppPurchaseQueryCallbackProxy2::TriggerQuery in Engine\Plugins\Online\OnlineSubsystemUtils\Source\OnlineSubsystemUtils\Private\InAppPurchaseQueryCallbackProxy2.cpp
Second:
I found one minor issue with the life saving custom java code, so thought I would add a note here.
The part that adds [Failed] tags can cause the string comparison to fail if there are multiple IAP and the one you are looking for isn’t first in line. (since it adds to the string being compared)
Easy to just remove that, but in case someone gets stuck on it.