使用PHP调用WCF服务(使用联合安全性)
我正在尝试从PHP调用WCF服务(.NET)。这比仅仅使用使用PHP调用WCF服务(使用联合安全性),php,web-services,wcf,soap,Php,Web Services,Wcf,Soap,我正在尝试从PHP调用WCF服务(.NET)。这比仅仅使用SoapClient要复杂一些,因为该服务使用WS2007FederationHttpBinding进行身份验证 这是我目前正在使用的代码。我甚至还没有添加凭据,因为我不知道如何添加,但无论如何,我甚至没有遇到访问被拒绝的错误 $wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl"; $client = new SoapClient($wsdl,array
SoapClient
要复杂一些,因为该服务使用WS2007FederationHttpBinding
进行身份验证
这是我目前正在使用的代码。我甚至还没有添加凭据,因为我不知道如何添加,但无论如何,我甚至没有遇到访问被拒绝的错误
$wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl";
$client = new SoapClient($wsdl,array(
//'soap_version'=>SOAP_1_2 // default 1.1, but this gives 'Uncaught SoapFault exception: [HTTP] Error Fetching http headers'
));
$params = array();
$params['SiteID'] = 123;
$params['GetPromoData'] = false;
$ret = $client->GetSiteUnitData(array('GetSiteUnitData_Request'=>$params));
print_r($ret);
?wsdl
看起来很短,但包含了对(注意
)wsdl0
?wsdl=wsdl0
?单一WSDL
似乎什么都有
[HTTP]获取HTTP头时出错
)。当我不这样做时,使用默认的SOAP1.1,我得到一个[HTTP]无法处理消息,因为内容类型为'text/xml;charset=utf-8“不是预期的类型”application/soap+xml;字符集=utf-8'
。这是因为我还没有通过身份验证,还是因为我使用了错误的SOAP版本$client->\uuu getFunctions()
,我会得到所有函数的有效列表,因此我假设这两个都可以,我真正的问题是身份验证
与我交谈过的其他程序员花了很多时间试图实现这一点,但放弃了,而是在.NET中实现了一个代理。他们将参数从PHP传递到自己的不安全的.NET服务,而该服务又称为这个安全服务。它可以工作,但对我来说效率极低,而且事与愿违,因为WCF的目的是为了支持所有类型的客户端(即使是非HTTP的!)
我读过MSDN,但没用
$wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl";
$client = new SoapClient($wsdl,array('trace' => 1,'soap_version' => SOAP_1_2));
$security = array(
'UserName' => array(
'UserName'=>'TestUser',
'Password'=>'TestPassword',
'SupportInteractive'=>false
)
);
$header = new SoapHeader('ChannelFactory','Credentials',$security, false);
$client->__setSoapHeaders($header);
$params = array();
$params['SiteID'] = 100000000;
$params['Channel'] = 999;
try {
$ret = $client->GetSiteUnitData($params);
print_r($ret);
}catch(Exception $e){
echo $e->getMessage();
}
\uuu getFunctions
可以工作,因为它打印WSDL中定义的函数。在第一次调用时获取WSDL信息没有问题。但真正的问题是通信。PHP获取WSDL,生成所需的SOAP请求,然后发送到服务器,但服务器没有正确响应。SOAP服务器始终给出响应,即使参数或请求正文不正确
你们应该和服务商沟通,我认为他们可以给你们的问题明确的答案如果SOAP调用在C#应用程序中起作用,则可以使用(使用过滤器
ip.dst==204.246.130.80
)查看实际发出的请求,然后从php构造类似的请求
查看如何进行自定义SOAP调用
还可以选择执行原始curl请求,因为构建xml主体可能更容易,但是您必须自己使用simplexml解析响应。在使用PHP中的.NET WS之前,我认为您需要从PHP中的类创建与.NET所期望的名称相匹配的对象SDL应该告诉您它所期望的类型。我希望这有助于您前进!wsdl或?singleWsdl都可以。前者引用多个按目的划分的文档,后者将所有文档都放在一个位置。wsdl确实指定了使用的soap版本,因此在下载wsdl后仍然需要它似乎很奇怪ds将被告知使用哪个soap版本。如果除了wsdl之外还需要提供这些基本信息,我会建议库不成熟/质量差,并且我不希望您使用它。我建议您找到一个不同/更好的soap库。@MattC感谢您的评论。很高兴了解wsdl,但希望是soap库不是问题(它是原生PHP库)。我查看了nuSoap,但看起来它没有任何优势。我真的不想听起来很刺耳,@ShaneN,但内置到PHP中并不能保证质量。请参阅例如蹩脚的
mail()
。未使用PHP中的SOAP,因此我无法提供帮助。我试图提供帮助,至少通过编辑问题使其更易于阅读。请将代码截图替换为实际代码块。将代码发布为截图可防止其他人对其进行篡改。非常感谢您的回复。不幸的是,服务提供商没有这样做愿意提供帮助。他们声称他们的服务适用于.NET客户端,因此他们没有理由调查它不适用于任何其他客户端类型。本质上,他们强迫我们使用Microsoft堆栈,我们不愿意只为他们这样做。我试过了,但请求都是通过SSL完成的,因此消息的任何有效负载都是安全的加密。有一种方法可以加载证书,这样你就可以解密它,我试过了,但对我不起作用(我想我需要他们的私钥,我没有),如果它在http连接上不起作用,那么ea