2017-05-31 130 views
0

我必须使用wssecurity与肥皂客户端连接,我正在使用MySoapClient类(下面的代码),我做错了什么?连接到肥皂在php

我可以列出肥皂功能:

Array (
    [0] => tcreateQuejaResponse createQueja(tcreateQuejaRequest $input) 
    [1] => tgetListaValoresResponse getListaValores(tgetListaValoresRequest $input) 
    [2] => getVersionResponse getVersion(getVersion $output) 
) 

当我尝试启动肥皂功能我得到这个错误:

SoapFault exception: [soapenv:Server] integration error in prueba-5.php:79 Stack trace: #0 prueba-5.php(79): SoapClient->__call('getListaValores', Array) #1 prueba-5.php(79): SoapClient->getListaValores() #2 {main} 

我尝试不同的方式,我得到这个错误太:

Fatal error: Uncaught SoapFault exception: [soapenv:Server] integration error in prueba-3.php:116 Stack trace: #0 prueba-3.php(116): SoapClient->__call('createQueja', Array) #1 prueba-3.php(116): SoapClient->createQueja(Object(stdClass)) #2 {main} thrown in prueba-3.php on line 116 

我有一个数组有不同的字段(名称,姓......)。

$var = new MySoapClient; 
$var_client = $var->getClient('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', '**USER**', '**PASSWORD**', 'soap/name.wsdl', null); 

类别:

class WSSoapClient extends SoapClient 
{ 
    private $OASIS = 'http://docs.oasis-open.org/wss/2004/01'; 
    /** 
    * WS-Security Username 
    * @var string 
    */ 
    private $username; 

    /** 
    * WS-Security Password 
    * @var string 
    */ 
    private $password; 

    /** 
    * WS-Security PasswordType 
    * @var string 
    */ 
    private $passwordType; 

    /** 
    * Set WS-Security credentials 
    * 
    * @param string $username 
    * @param string $password 
    * @param string $passwordType 
    */ 
    public function __setUsernameToken($username, $password, $passwordType) 
    { 
     $this->username = $username; 
     $this->password = $password; 
     $this->passwordType = $passwordType; 
    } 

    /** 
    * Overwrites the original method adding the security header. 
    * As you can see, if you want to add more headers, the method needs to be modified. 
    */ 
    public function __call($function_name, $arguments) 
    { 
     $this->__setSoapHeaders($this->generateWSSecurityHeader()); 
     //var_dump($this); 
     return parent::__call($function_name, $arguments); 
    } 

    /** 
    * Generate password digest. 
    * 
    * Using the password directly may work also, but it's not secure to transmit it without encryption. 
    * And anyway, at least with axis+wss4j, the nonce and timestamp are mandatory anyway. 
    * 
    * @return string base64 encoded password digest 
    */ 
    private function generatePasswordDigest() 
    { 
     $this->nonce = mt_rand(); 
     $this->timestamp = gmdate('Y-m-d\TH:i:s\Z'); 

     $packedNonce = pack('H*', $this->nonce); 
     $packedTimestamp = pack('a*', $this->timestamp); 
     $packedPassword = pack('a*', $this->password); 

     $hash = sha1($packedNonce . $packedTimestamp . $packedPassword); 
     $packedHash = pack('H*', $hash); 

     return base64_encode($packedHash); 
    } 

    /** 
    * Generates WS-Security headers 
    * 
    * @return SoapHeader 
    */ 
    private function generateWSSecurityHeader() 
    { 
     if ($this->passwordType === 'PasswordDigest') 
     { 
      $password = $this->generatePasswordDigest(); 
      $nonce = sha1($this->nonce); 
     } 
     elseif ($this->passwordType === 'PasswordText') 
     { 
      $password = $this->password; 
      $nonce = sha1(mt_rand()); 
     } 
     else 
     { 
      return ''; 
     } 
     $xml = ' 
<wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="' . $this->OASIS . '/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
    <wsse:UsernameToken> 
    <wsse:Username>' . $this->username . '</wsse:Username> 
    <wsse:Password Type="' . $this->OASIS . '/oasis-200401-wss-username-token-profile-1.0#' . $this->passwordType . '">' . $password . '</wsse:Password> 
    <wsse:Nonce EncodingType="' . $this->OASIS . '/oasis-200401-wss-soap-message-security-1.0#Base64Binary">' . $nonce . '</wsse:Nonce>'; 

     if ($this->passwordType === 'PasswordDigest') 
     { 
      $xml .= "\n\t" . '<wsu:Created xmlns:wsu="' . $this->OASIS . '/oasis-200401-wss-wssecurity-utility-1.0.xsd">' . $this->timestamp . '</wsu:Created>'; 
     } 

     $xml .= ' 
    </wsse:UsernameToken> 
</wsse:Security>'; 

     return new SoapHeader(
      $this->OASIS . '/oasis-200401-wss-wssecurity-secext-1.0.xsd', 
      'Security', 
      new SoapVar($xml, XSD_ANYXML), 
      true); 
    } 
} 

回答

0

应首先使用WSDL到PHP generaror如PackageGenerator项目,以便与对象容易地构建该请求,并处理与已知的对象类的反应,

其次,您应该尝试使用WsSecurity库轻松添加WsSecurity标头