I had a problem with SagePay and IP address. This post really helped me out:

The problem was differing IP address setup on the server.

http://drupal.org/node/541746

I have traced the code to see what the issue is. If I put:

print_r($response);

after

list($response, $http_response_code, $curl_error) = uc_protx_vsp_direct_curl($url, $post);

which is line 535 of the module file I get:

Array
(
[VPSProtocol] => 2.23
[Status] => INVALID
[StatusDetail] => 3058 : The CardHolder field is required.
)

There is indeed no field on the screen for “CardHolder.” If I hard code that field in the code, then it proceeds. I actually realize now that the reason I thought it wasn’t connecting was because I was logging into the SagePay live system and it was configured for the Test system. When I set it for Live, then it indeed connects and I see the error in my SagePay transaction listing: “INVALID – 3058 : The CardHolder field is required.”

I have temporarily set the CardHolder value to be Billing First Name, space, Billing Last Name and now it works fine.

But why do I not have a CardHolder field in the form?