If you make an in app purchase on Android and using a test account you set the Payment status to ‘Test card, always declines’, you’ll notice that the productPurchaseFinished() method in the InAppPurchases::Listener interface is never called to report the payment failure. So, if a payment failure occurs, your app will be stuck waiting endlessly for the transaction to conclude.
Referencing the code in the develop branch, if you go to line 796 in modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp, this assignment always fails if the transaction fails:
if (auto* object = responseData.getDynamicObject())
Because there is apparently no response data if the transaction fails.
Unfortunately, due to the way the code in this class is structured, it doesn’t seem to be possible to get the listener without this response data, b/c a pointer to the listener is being stuck in the developerPayload of the response data.