Thanks for your reply to russpuppy.
In my thought, it seems not right "If you do not consume the purchase after On Purchase Completed, the user always retain the purchase for restoring".
Can you explain other wrapper's right IAP workflow?
That is how its meant to work.
A purchase not consumed is still on Google Server, so users are able to use the Restore Purchase option, or check for Has Product.
CocoonJS previously would automatically consume a purchase, which is why it could not Restore Purchase, they recently fixed it to no longer be auto-consumed but you had control over it with a consume product call.
Manual consume or finalize is the correct way to implement IAP plugins, since devs can code for consumable (potion/gems) or permanent (extra stages, bonus content, ad remove) IAPs.