PHP设置多个SOAP标头创建错误

时间:2017-02-28 13:04:32

标签: php web-services soap soapheader wsse

我需要在PHP中构建以下XML。

<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-
secext-1.0.xsd" xmlns:wsu="http://docs.oasisopen.
org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-102">
<wsse:Username> string </wsse:Username>
<wsse:Password Type="http://docs.oasisopen.
org/wss/2004/01/oasis-200401-wss-username-token-profile-
1.0#PasswordText"> string </wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
<her:UserToken> string </her:UserToken>
</soapenv:Header>

现在我可以使用以下类连接到服务。

class connect {

    const USER = 'XXX';
    const PASSWORD = 'XXX';
    const NS_WSSE = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
    const NS_WSU = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
    const PASSWORD_TYPE = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
    const ENCODING_TYPE = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';
    const WSDLFILE = '/var/www/vhosts/eteil.stillatwork.de/httpdocs/inc/hermes/ProPS_sbx.wsdl';
    const BENUTZERNAME = 'XXX';
    const KENNWORT = 'XXX';

    public function soapClientWSSecurityHeader($token)
    {

        // Initializing namespaces
        $headers = array();

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

        $security = $root->addChild('wsse:Security', null, SELF::NS_WSSE);


        $usernameToken = $security->addChild('wsse:UsernameToken', null);
        $usernameToken->addChild('wsse:Username', SELF::USER, SELF::NS_WSSE);
        $usernameToken->addChild('wsse:Password', SELF::PASSWORD, SELF::NS_WSSE)->addAttribute('Type', SELF::PASSWORD_TYPE);

        // Recovering XML value from that object
        $root->registerXPathNamespace('wsse', SELF::NS_WSSE);

        $full = $root->xpath('/root/wsse:Security');
        $auth = $full[0]->asXML();

        $auth_u = "<her:UserToken>".$token."</her:UserToken>";

        $headers[] = new SoapHeader(SELF::NS_WSSE,'Security', new SoapVar( $auth, XSD_ANYXML), true);
        if($token != '') {
            $headers[] = new SoapHeader(NULL, 'UserToken',new SoapVar( $auth_u, XSD_ANYXML));
        }

        return $headers;

    }

    public function generateclient($token){
        $this->client = new SoapClient(SELF::WSDLFILE);
        $this->client->__setSoapHeaders($this->soapClientWSSecurityHeader($token));
    }

    public function login(){
        $this->generateclient();
        $user = array('benutzername' => SELF::BENUTZERNAME,'kennwort' => SELF::KENNWORT);
        $result = $this->client->propsUserLogin(array('login' => $user));

        return $result->propsUserLoginReturn;
    }

    public function listOrder($token){
        $this->generateclient($token);
        $result = $this->client->propsListOfProductsATG();

        return $result->propsListOfProductsATGReturn;
    }

    public function check($token){
        $this->generateclient($token);
        $result = $this->client->propsCheckAvailability();

        return $result->propsCheckAvailabilityReturn;
    }

    public function order($token, $order){
        $this->generateclient($token);
        $result = $this->client->propsOrderSave($order);

        return $result->propsOrderSaveReturn;
    }
}

登录API服务非常有效。它会返回正确的令牌。

但是对于进一步的请求,例如要下订单,必须在SOAP Header内发送令牌。

出于任何原因,如果我尝试下订单或尝试接收可用产品列表,API的响应是:

“处理时发生故障。”

如果有人能帮助我解决问题,那将是一个很大的帮助。

供您参考: 有关身份验证和订单放置的文档摘录。

  

SOAP标头还用于验证相关服务   ProfiParcelService门户。在SOAP标头中,加密   传输包含必要身份验证的UserToken   细节。必须由propsUserLogin请求此UserToken   服务。此服务预计用户名和密码   活动门户网站用户帐户并提供加密的UserToken。该   UserToken有效期为六个月。

     

3.1。服务启动时的身份验证

     

每次启动服务时,必须提供合作伙伴ID和API密码   在SOAP标头中传输。只需要填写UserToken   当服务需要在ProfiParcelService上进行身份验证时   门户。每次启动服务都包含以下SOAP标头:

     

4.5。 propsOrderSave服务

     

此服务用于创建新的装运订单或编辑现有订单   那些。装运单包括收件人的地址,即客户   参考,COD装运详情和包裹尺寸。该   托运人的地址是查询的集合地址   ProfiParcelService客户。注册时存储该地址   对于ProfiParcelService门户网站,可能不再修改   订单已创建或编辑。只能修改它   ProfiParcelService门户中的默认收集地址。是否一个   已创建装运订单或已编辑的现有订单依赖于   是否已输入订单号。如果订单号是   转移后,将加载带有此号码的装运单   编辑,否则添加新订单。装运单只能是   在打印之前进行了编辑。

     

4.5.1。 propsOrderSave输入参数

     

除了身份验证详细信息合作伙伴ID,API密码和用户   SOAP主体需要的SOAP标头中的Token(参见第3节)   装运订单的详细信息作为输入参数。这些都是采取的   来自PropsOrder(见4.2.2)。

<soapenv:Body>
<propsOrderSave>
<propsOrder>PropsOrder</propsOrder>
</propsOrderSave>
</soapenv:Body>
  

4.2.2。 PropsOrder

     

此类数据表示装运单的数据。这个数据   type用于创建新订单或编辑现有订单。

<PropsOrder>
<orderNo>string</orderNo>
<receiver>Address</receiver>
<clientReferenceNumber>string</clientReferenceNumber>
<parcelClass>string</parcelClass>
<amountCashOnDeliveryEurocent>int</amountCashOnDeliveryEurocent>
<includeCashOnDelivery>boolean</includeCashOnDelivery>
<withBulkGoods>boolean</withBulkGoods>
</PropsOrder>
  

4.2.1。地址

     

在装运单中,“地址”数据用作收件人   地址。 P.O.箱子和包装站都可以用来   收件人的地址。

<Address>
<firstname>string</firstname>
<lastname>string</lastname>
<street>string</street>
<houseNumber>string</houseNumber>
<addressAdd>string</addressAdd>
<postcode>string</postcode>
<city>string</city>
<district>string</district>
<countryCode>string</countryCode>
<email>string</email>
<telephoneNumber>string</telephoneNumber>
<telephonePrefix>string</telephonePrefix>
</Address>

0 个答案:

没有答案