2

我需要在 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 标头内发送令牌。

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

“处理时发生故障。”

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

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

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

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

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

4.5. propsOrderSave 服务

此服务用于创建新的运输订单或编辑现有订单。运输订单包括收件人地址、客户参考、货到付款的详细信息和包裹尺寸。发件人地址是查询ProfiParcelService 客户的收件地址。此地址在注册 ProfiParcelService 门户时存储,并且在创建或编辑订单时可能不再修改。只能在 ProfiParcelService 门户中修改此默认收件地址。是创建发货订单还是编辑现有订单取决于是否输入了订单号。如果转移了订单号,则会加载具有此编号的装运订单以进行编辑,否则会添加新订单。

4.5.1。propsOrder保存输入参数

除了 SOAP 标头中的身份验证详细信息合作伙伴 ID、API 密码和用户令牌(参见第 3 节)之外,SOAP 正文还需要运输订单的详细信息作为输入参数。这些取自 PropsOrder(参见 4.2.2)。

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

4.2.2. 道具订单

这种类型的数据表示运输订单的数据。此数据类型用于创建新订单或编辑现有订单。

<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。地址

在运输订单中,“地址”数据用作收件人的地址。邮政信箱和包装站都不能用作收件人地址。

<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>
4

0 回答 0