I don't see any if this not being easily solved by the traditional model of using authorize and capture with external payment processors.
It's been a while since I've worked on such a system, so I suppose it's possible newer processors implement things differently. However, that model was solid because you always knew the state of the charge in your system and finding the state in the processor's system was pretty easy too (in the case of communication errors).
Also, authorize can be run multiple times. Sure, you may place a hold on some extra amount in the customer's account, but it falls off after a few days (and I believe you could release it too, if a different authorize transaction was captured).
This seems like an overly conlmplex solution to a problem that's been solved for years.
Edit: fixed typo.