As far as I know, you should always call finish() on non-consumable items. On Android they are called “managed” products.
As for consumables and unmanaged products, I think you should also call finish() and manage them yourself in your app. That is if a user reinstalls the game, it’s not required to restore such products. On iOS you instead use iCloud to restore the game progress and consumables.
On Android you can use Google Play Game Services or maybe Firebase to do the same thing for unmanaged products.
Again, as far as I know, if you don’t call finish(), after some time the purchase would be cancelled and the money would be returned to the user.
Calling finish() supposed to protect users from crashes during the purchase. You get the transaction, update internal values and only after that you call finish(). That way if the app crashes during update of the internal values - the user receives unfinished transactions when the app starts again.