Signals to the rescue!
1) Using the payment.signals.payment_form_init signal, add your fields to the form. See the examples at payment.listeners
2) Using the contact.signals.form_save signal, catch the contact form save event. Grab the data from the formdata parameter, and save it in your own custom app model which has a foreignkey to Contact.
Don't monkeypatch if you can possibly avoid it.
Note: I just added the form_save signal, so you'll need at least rev 1602 to use it.
Bruce Kroeze