gpt4 book ai didi

php - 在 PHP 中通过 CURL 调用 SOAP 方法,调用需要客户端身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:22 25 4
gpt4 key购买 nike

概述:

这段代码是关于使用 SOAP 和 Curl 调用 escreen 网络服务,需要客户端身份验证。目前我没有得到任何结果,只有 HTTP 403 和 500 错误。该调用要求客户端验证证书位于调用站点上。

代码:

$content = "<TicketRequest>
<Version>1.0</Version>
<Mode>Test</Mode>
<CommitAction></CommitAction>
<PartnerInfo>
<UserName>xxxxxxxxxx</UserName>
<Password>xxxxxxxxxxx</Password>
</ PartnerInfo>
<RequestorOrderID></RequestorOrderID>
<CustomerIdentification>
<IPAddress></IPAddress>
<ClientAccount>xxxxxxxxxx</ClientAccount>
<ClientSubAccount>xxxxxxxxxx</ClientSubAccount>
<InternalAccount></InternalAccount>
<ElectronicClientID></ElectronicClientID>
</CustomerIdentification>
<TicketAction>
<Type></Type>
<Params>
<Param>
<ID>4646</ID>
<Value></Value>
</Param>
</Params>
</TicketAction>
</TicketRequest>";

$wsdl = "https://services.escreen.com/SingleSignOnStage/SingleSignOn.asmx";

$headers = array( "Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
// "SOAPAction: \"\"",
"Content-length: ".strlen($content),
);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
//curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//curl_setopt($ch, CURLOPT_HTTPHEADER, array('SOAPAction: ""'));
curl_setopt($ch, CURLOPT_CAPATH, '/home/pps/');
curl_setopt($ch, CURLOPT_CAINFO, '/home/pps/authority.pem');
curl_setopt($ch, CURLOPT_SSLCERT, 'PROTPLUSSOL_SSO.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'xxxxxxxxxxxx');

$output = curl_exec($ch);

// Check if any error occured
if(curl_errno($ch))
{
echo 'Error no : '.curl_errno($ch).' Curl error: ' . curl_error($ch);
}

print_r($output);

问题:

  1. 我需要调用 RequestTicket 方法并将 XML 字符串传递给它。这里不知道怎么弄(传方法名调用)。

  2. 对于客户端身份验证,他们给了我们三个证书,一个根证书,一个中间证书证书和客户端身份验证证书 PROTPLUSSOL_SSOpem(它是一个 .pfx 文件)。由于我们在 linux 上,我们将它们转换为 pem 。在 curl 调用中,我找不到如何同时包含根证书和中间证书的方法,所以我通过制作一个新的 pem 文件并复制中间证书和根证书并将其命名为 authority.pem 来组合它们。我不确定它是否有效,希望得到您的意见。

  3. 对于当前代码,我收到了错误错误号:77 Curl 错误:错误设置证书验证位置:CAfile:/home/pps/authority.pem CApath:/home/pps/

    如果我禁用 curl 错误消息,我将得到页面标题为 403 - Forbidden 的空白页面。访问被拒绝。

    如果我注释掉 CURLOPT_CAPATH 和 CURLOPT_CAINFO 行,它会给出 http 500 错误页面,消息作为内容,下面是顶部。

    HTTP/1.1 500 Internal Server Error. Cache-Control: private Content-Type: text/html Server: Microsoft-IIS/7.5 X-AspNet-Version: 1.1.4322 X-Powered-By: ASP.NET Date: Thu, 02 Sep 2010 14:46:38 GMT Content-Length: 1208

如果我如上所述注释掉 CURLOPT_SSLCERT 和 CURLOPT_SSLCERTPASSWD,它会给出 403 错误消息作为内容。

因此,我请求您指出当前代码的问题,以帮助我解决问题。

谢谢。

最佳答案

PHP 自带一个 soap 客户端:

http://php.net/manual/en/book.soap.php

您可以通过将选项 local_cert 传递给构造函数来告诉它使用证书。

关于php - 在 PHP 中通过 CURL 调用 SOAP 方法,调用需要客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3628312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com