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