我需要在 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>