The form classes should not contain any controller logic. Move that into the adapter, or even better, into a new controller class. Figure out how to wrap responses like redirect-iframe.
Thinking out loud:
== GatewayPage ==
* Controller for UI.
* Any reason not to pull in the resultswitcher logic?
* handleRequest
** Reads from POST and SESSION
** Performs UI side-effects.
== GatewayAdapter ==
* Should have processing-specific controller logic, the sequence of API calls to make.
* initiatePayment
** Call validation here?
** Returns PaymentResponse object.
== PaymentResponse ==
Encapsulate and decouple desired UI responses.
* Refresh form, optionally displaying validation errors.
* Redirect to gateway, with GET params.
* IFrame would ideally be handled by template engine simply refreshing and iframeUrl toggles conditional display.
* Redirect shortcuts for Thank You and failure pages.