I know there are a good portion of people looking for a good solution to handle offline cc payments. I'm currently building a system that has a partial need for this. Some orders will be processed immediately online, others, however have to be entered into a separate system (lame!) and held there until the service is used...
I've been going round and round with this for the past several hours trying to figure out the best solution because there is always the likelihood of someone selecting both that service, AND something that is to be charged immediately. Well, firstly, the actual price of the service that is to be charged later will be $0, and simply display an alternate price in the product listing. As for transferring the information securely, I intend to have the system encrypt an email (using PGP) and shoot it off to the email address of the person who will physically enter it into the other system.
All this email will contain is all but the last 4 of the CC# (which will be stored with the order info), the expiration date, and a link to view the order details.
The decryption key will only exist on that one terminal that handles the physical order entry. Since login information is required at that terminal, and to get into the admin section of drupal to view the order details, and the email is encrypted, that's certainly secure enough. And once the information is entered into the other system, the email will be deleted.
The other system is PCI compliant, and as the cc info isn't stored in the webserver at all, it remains PCI compliant.
That's my plan anyway.. please shoot some holes in it if you see anything I've overlooked. The idea is that I will write a module that will handle this, conditionally for the selected product(s), prior to the order proceeding through to the standard cc payment routine. I'm not entirely certain how that will work just yet, but I imagine it will involve creating a new payment method that handles all orders, and basically acts as a middle man between ubercart core and the cc_payment module. Seems like it should work -- in theory anyway.