Laravel,soap API 需要登录

Laravel, soap API required login

我在使用 SOAP API 时遇到了一点问题,我需要使用它。它需要授权,所以我使用以下登录。

基本上,我需要使用以下登录,我没有得到“需要登录”,这很好。

$client = new \SoapClient('localwsdlfile.wsdl', array(
    'local_cert' => 'localcert.pem',
    'passphrase' => 'passphrase',
    'location' => 'https://wsmurl/login/'
));

$response = $client->Get(array(
    "AccessKey" => "accesskey",
    "ProductID" => "SOMEPRODUCT",
    "Scope" => "SOMESCOPE",
    "Parameters" => array('Param' => array('_' => 'DATATOLOOKUP', 'id'=>'MOREDATATOLOOKUP'))
));

print_r($response);

所以,基本上,在客户端中,我需要取消注释行

'location' => 'https://wsmurl/login/'

如果不这样做,我会收到此登录错误。我尝试使用的服务器有一个缓存,因此我不再需要在接下来的 10 分钟内发送此登录信息以供将来的操作使用。

所以,现在,我已经登录了,我可以成功地进行以下操作。

$client = new \SoapClient('localwsdlfile.wsdl', array(
    'local_cert' => 'localcert.pem',
    'passphrase' => 'passphrase',
    // 'location' => 'https://wsmurl/login/' // Uncomment to login
));

$response = $client->Get(array(
    "AccessKey" => "accesskey",
    "ProductID" => "SOMEPRODUCT",
    "Scope" => "SOMESCOPE",
    "Parameters" => array('Param' => array('_' => 'DATATOLOOKUP', 'id'=>'MOREDATATOLOOKUP'))
));

print_r($response);

如果我保持 'location' => 'https://wsmurl/login/' 未注释,我会收到有关未发送有效 WSDL 的错误消息。

总而言之:- 我正在 Laravel 中使用此肥皂 API,根据上述代码使用 PHP 的 SoapClinet。

我的理解是,我尝试使用的 soap 服务需要先登录。 经过大量测试后,我通过在对 SoapClient.

的调用中包含如上所示的 'location' => 'https://wsmurl/login/' 行,设法达到了没有错误的地步。

这似乎是我第一次调用此 soap 服务时需要的,我想它正在让我登录。如果我不包括它,我会收到错误消息

"SoapFault 需要登录

所以,如果我包含行 'location' => 'https://wsmurl/login/',它似乎让我登录,但我现在收到错误 “肥皂故障 看起来我们没有 XML 文件

如果我保留这条线,我会继续收到这个错误 “肥皂故障 看起来我们没有 XML 文件

删除该行然后给我预期的 SOAP 响应,一切正常。

我尝试使用 try{} ... catch{} 寻找 exceptions/errors 等来捕捉错误,但它没有捕捉到“需要登录”或“看起来我们没有 XML 文档" 作为故障。

所以,我想,是否有更好的方法来检测这种情况,以便我可以在没有线路的情况下发送或不发送,或者是否有更好的方法来登录服务(注意,它只使用证书和密码).

在此先感谢,我希望上面的小重写能让它更清楚。

因为登录的位置和localwsdlfile.wsdl不一样,一通电话就搞不定了。所以我们创建了一个使用 curl 登录的函数,如果登录成功,它将继续到 soap 客户端。在此感谢自由职业者 Brian 的帮助。

$client = new SoapClient('wsdl/VocusSchemas/localwsdlfile.wsdl', array(
    'trace' => 1,
    'exception' => true
));

try {

    $response = $client->Get(array(
        // "AccessKey" => "MADAITABNSAATOT1", 
        "AccessKey" => "accesskey", 
        "ProductID" => "SOMEPRODUCT",
        "Scope" => "SOMESCOPE",
        "Parameters" => array('Param' => array('_' => 'DATATOLOOKUP', 'id' => 'MOREDATATOLOOKUP'))
    ));