开发者

PHP Soap is hell

If I run this

$HostTransactionInfo = new HostTransactionInfo();  // std Object
$HostTransactionInfo->SecurenetID = $cc->merchant->data[$t开发者_运维技巧his->name]['secure_net_id'];
$HostTransactionInfo->SecureKey = $cc->merchant->data[$this->name]['secure_key'];
$HostTransactionInfo->Test = self::TEST;

$securenet = new SoapClient(self::WSDL, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));
$host_trans_info = new SoapVar($HostTransactionInfo, SOAP_ENC_OBJECT);
var_dump($host_trans_info);

$save = $securenet->Process_Save($host_trans_info);

I receive this on every variation: "Server was unable to process request. ---> Object reference not set to an instance of an object."

My SoapClient::__getTypes() request gives me this:

array(
 [2] => struct HostTransactionInfo {
 string SecurenetID;
 string SecureKey;
 string Test;
}
 [6] => struct Process_Save {
 HostTransactionInfo oTi;
}
)

My SoapClient::__getFunctions() request gives me this:

array (
    [2] => Process_SaveResponse Process_Save(Process_Save $parameters)
)

Does anyone have any clue as to what I'm doing wrong?


The error is returned by the securenet webservice. Why not contact their support?

But in any case, the server should return a more informative message than "Object reference not set to an instance of an object". The fact that their code dereferences null pointers when it gets some unexpected input doesn't bode well for something that's supposed to be a "secure" payment system.


Please check the XML request that is sent to the server and the XML response you get back:

// ...
$securenet = new SoapClient(self::WSDL, array(
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
    'trace'    => true  // that's important for the debugging methods to work
));
// ...
$save = $securenet->Process_Save($host_trans_info);
var_dump($securenet-> __getLastRequestHeaders());
var_dump($securenet-> __getLastRequest());
var_dump($securenet-> __getLastResponseHeaders());
var_dump($securenet-> __getLastResponse());

This will help to get you an overview of what's happening on the wire. If you can rule out any server-related problem, the error will most likely be related to a XML-SOAP-request that is not in the required format.


Hi this might be to late for the original asker, But for anyone who may have the same error ...

this is a trick i learned when i was working with M$.Net or C# (CVS) or any other flavor of M$ Soap servers... M$ changes something in the envelope and that is where things go wrong...

class MSSoapClient extends SoapClient {
   function __doRequest($request, $location, $action, $version) {
        $namespace = "http://tempuri.org/";

        $request = preg_replace('/<ns1:(\w+)/', '<$1 xmlns="'.$namespace.'"', $request, 1);
        $request = preg_replace('/<ns1:(\w+)/', '<$1', $request);
        $request = str_replace(array('/ns1:', 'xmlns:ns1="'.$namespace.'"'), array('/', ''), $request);        

        // parent call
        return parent::__doRequest($request, $location, $action, $version);
    }
}

This will correct the envelope and correct the error in most cases... look at the variable $namespace = "http://tempuri.org/"; make sure this is correct based on the WSDL file

I dont know if this will fix the USER's error but it might help others with similar errors

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜