使用PHP调用WCF服务(使用联合安全性)

使用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

我正在尝试从PHP调用WCF服务(.NET)。这比仅仅使用
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

    • ?wsdl

      看起来很短,但包含了对(注意
      wsdl0
      ?wsdl=wsdl0
    • ?单一WSDL

      似乎什么都有
  • 我需要指定SOAP 1.2吗?当我这样做时,我会得到一个连接超时(
    [HTTP]获取HTTP头时出错
    )。当我不这样做时,使用默认的SOAP1.1,我得到一个
    [HTTP]无法处理消息,因为内容类型为'text/xml;charset=utf-8“不是预期的类型”application/soap+xml;字符集=utf-8'
    。这是因为我还没有通过身份验证,还是因为我使用了错误的SOAP版本

  • 如何在PHP中进行身份验证?下面是相应的.NET/C代码。我是否需要以某种方式将这些作为SOAP头?或者我认为这一切都错了,我甚至需要在调用该方法之前进行某种身份验证(从我所读到的内容来看,我应该拿回一个令牌,然后在将来的所有方法调用中使用它——我想我在中看到了一个这样的例子)。

  • 如果我使用WSDL和SOAP版本调用
    $client->\uuu getFunctions()
    ,我会得到所有函数的有效列表,因此我假设这两个都可以,我真正的问题是身份验证

    与我交谈过的其他程序员花了很多时间试图实现这一点,但放弃了,而是在.NET中实现了一个代理。他们将参数从PHP传递到自己的不安全的.NET服务,而该服务又称为这个安全服务。它可以工作,但对我来说效率极低,而且事与愿违,因为WCF的目的是为了支持所有类型的客户端(即使是非HTTP的!)

    我读过MSDN,但没用

  • 您可以将此URL用于WSDL。此WSDL具有所有定义

  • 您必须使用1.2,因为此Web服务与SOAP 1.2版本配合使用。我使用1.1和1.2进行了尝试,但两个版本都出现了错误。1.1是版本错误,1.2是超时错误。我认为此测试服务器存在错误。我使用它与svcutil生成代码,但它也出现了错误。通常,它应该获取信息并生成代码调用服务的示例

  • 通常,您可以使用SoapHeader添加身份验证参数或直接添加到SoapClient构造中的选项(如果服务身份验证是基本身份验证)。我根据您的屏幕截图编写以下代码。但长时间等待后会出现超时

    $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