Php 致命错误:未捕获的SoapFault异常:[客户端]错误查找“;uri“;财产

Php 致命错误:未捕获的SoapFault异常:[客户端]错误查找“;uri“;财产,php,soap,wsdl,Php,Soap,Wsdl,标题给了我一些如此多的链接,但不幸的是,我无法让它们发挥作用。我对肥皂一无所知。我得到了一个wsdl链接,我需要通过soap调用一些方法 我被困在一个特别的地方 未捕获的SoapFault异常:[客户端]在中查找“uri”属性时出错 此代码处生成错误 类SoapClientCompatibility扩展了SoapClient{ 公共函数构造($wsdl$options){ //在这里做一些事情,比如: //使用curl下载wsdl }}函数soapClientWSSecurityHeader($

标题给了我一些如此多的链接,但不幸的是,我无法让它们发挥作用。我对肥皂一无所知。我得到了一个wsdl链接,我需要通过soap调用一些方法

我被困在一个特别的地方

未捕获的SoapFault异常:[客户端]在中查找“uri”属性时出错 此代码处生成错误

类SoapClientCompatibility扩展了SoapClient{
公共函数构造($wsdl$options){
//在这里做一些事情,比如:
//使用curl下载wsdl
}}函数soapClientWSSecurityHeader($user,$password){
//使用yyyy-mm ddThh:mm:ssZ格式创建日期
$tm_created=gmdate('Y-m-d\TH:i:s\Z');
$tm_expires=gmdate('Y-m-d\TH:i:s\Z',gmdate('U')+180);//仅当使用timestamp元素时才需要
//生成和编码随机数
$simple\u nonce=mt\u rand();
$encoded\u nonce=base64\u encode($simple\u nonce);
//编译WSS字符串
$passdigest=base64_编码(sha1($simple_nonce.$tm_created.$password,true));
//初始化名称空间
$ns\u wsse=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
$ns_wsu=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
$password\u type='1http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest';
$encoding\u type='1http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';
//使用SimpleXML创建WSS标识头
$root=新的SimpleXMLElement(“”);
$security=$root->addChild('wsse:security',null,$ns\u wsse);
//并非所有服务器都需要timestamp元素
$timestamp=$security->addChild('wsu:timestamp',null,$ns\u wsu);
$timestamp->addAttribute('wsu:Id','timestamp-28');
$timestamp->addChild('wsu:Created',$tm\u Created,$ns\u wsu);
$timestamp->addChild('wsu:Expires',$tm\u Expires,$ns\u wsu);
$usernameToken=$security->addChild('wsse:usernameToken',null,$ns_wsse);
$usernameToken->addChild('wsse:Username',$user,$ns\wsse);
$usernameToken->addChild($wsse:Password',$passdigest,$ns\u wsse)->addAttribute($Type',$Password\u Type);
$usernameToken->addChild($wsse:Nonce',$encoded\u Nonce,$ns\u wsse)->addAttribute($EncodingType',$encoding\u type);
$usernameToken->addChild($wsu:Created’,$tm\u Created,$ns\u wsu);
//从该对象恢复XML值
$root->registerXPathNamespace('wsse',$ns\wsse);
$full=$root->xpath('/root/wsse:Security');
$auth=$full[0]->asXML();
打印($auth);
返回新的SoapHeader($ns_wsse,'Security',新的SoapVar($auth,XSD_ANYXML),true,'https://mywebsite.com');
}
类有效{
函数有效($hn,$vc)
{
$this->healthNumber=$healthNumber;
$this->versionCode=$versionCode;
}
}
$hcvRequest=数组(
“healthNumber”=>“1286844022”,
“versionCode”=>“YX”
);
$valid=数组(
“hcvRequest”=>hcvRequest美元
);
$params=数组(
“请求”=>$valid
);
$client=新的SoapClientCompatibility('https://example.com/?wsdl');$客户端->\uuu设置OAPHEADER(soapClientWSSecurityHeader('someemail@email.com“,”somepassword');
回声“;
$response=$client->_soapCall(“验证”,数组($params));
打印(客户);
打印(回复);

有人能帮我解决这个问题吗?我已经能够通过服务器传递到soap请求,现在我缺少的是我真的不确定如何添加二进制安全令牌。现在,我正在插入从我的cpanel的manage ssl certificate部分复制的公钥。signedInfo部分中也有一个摘要值,它表示
我正在规范化xml元素,然后使用sha1创建一个哈希,并在此基础上进行base64_编码。我错过了什么?
class SoapClientCompatibility extends SoapClient{
    public function __construct($wsdl, $options){
        // do things here, like:
        // download the wsdl using curl
    }}function soapClientWSSecurityHeader($user, $password){
  // Creating date using yyyy-mm-ddThh:mm:ssZ format
  $tm_created = gmdate('Y-m-d\TH:i:s\Z');
  $tm_expires = gmdate('Y-m-d\TH:i:s\Z', gmdate('U') + 180); //only necessary if using the timestamp element
  // Generating and encoding a random number
  $simple_nonce = mt_rand();
  $encoded_nonce = base64_encode($simple_nonce);
  // Compiling WSS string
  $passdigest = base64_encode(sha1($simple_nonce . $tm_created . $password, true));

  // Initializing namespaces
  $ns_wsse = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
  $ns_wsu = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
  $password_type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest';
$encoding_type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';

  // Creating WSS identification header using SimpleXML
  $root = new SimpleXMLElement('<root/>');

  $security = $root->addChild('wsse:Security', null, $ns_wsse);
  //the timestamp element is not required by all servers
  $timestamp = $security->addChild('wsu:Timestamp', null, $ns_wsu);
  $timestamp->addAttribute('wsu:Id', 'Timestamp-28');
  $timestamp->addChild('wsu:Created', $tm_created, $ns_wsu);
  $timestamp->addChild('wsu:Expires', $tm_expires, $ns_wsu);

  $usernameToken = $security->addChild('wsse:UsernameToken', null, $ns_wsse);
  $usernameToken->addChild('wsse:Username', $user, $ns_wsse);
  $usernameToken->addChild('wsse:Password', $passdigest, $ns_wsse)->addAttribute('Type', $password_type);
  $usernameToken->addChild('wsse:Nonce', $encoded_nonce, $ns_wsse)->addAttribute('EncodingType', $encoding_type);
  $usernameToken->addChild('wsu:Created', $tm_created, $ns_wsu);



  // Recovering XML value from that object
  $root->registerXPathNamespace('wsse', $ns_wsse);
  $full = $root->xpath('/root/wsse:Security');
  $auth = $full[0]->asXML();
  print_r($auth);
  return new SoapHeader($ns_wsse, 'Security', new SoapVar($auth, XSD_ANYXML), true,'https://mywebsite.com');
}
class Valid {
    function Valid($hn, $vc) 
    {
        $this->healthNumber = $healthNumber;
        $this->versionCode = $versionCode;
    }
}
$hcvRequest = array(
    "healthNumber" => "1286844022",
    "versionCode" => "YX"
);
$valid = array(
    "hcvRequest" => $hcvRequest
);

$params = array(
    "requests" => $valid
);

$client = new SoapClientCompatibility('https://example.com/?wsdl');$client->__setSoapHeaders(soapClientWSSecurityHeader('someemail@email.com', 'somepassword'));
echo "<pre>";
$response = $client->__soapCall("validate", array($params));
print_r($client);
print_r($response);