Мне нужно построить следующий XML в PHP.
<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 должен быть запрошен The propsUserLogin
оказание услуг. Эта служба предполагает имя пользователя и пароль для
активная учетная запись пользователя портала и доставляет зашифрованный UserToken.
UserToken действителен в течение шести месяцев.3.1. Аутентификация при запуске сервиса
При каждом запуске службы идентификатор партнера и пароль API должны быть
передается в заголовке SOAP. UserToken должен быть заполнен только
когда сервис требует аутентификации в ProfiParcelService
портал. Каждый запуск службы содержит следующий заголовок SOAP:4,5. Сервис propsOrderSave
Этот сервис используется для создания новых заказов на доставку или для редактирования существующих
из них. Заказ на отправку содержит адрес получателя, клиента
ссылка, подробности доставки наложенным платежом и размер посылки.
адрес грузоотправителя является адресом сбора запросов
ProfiParcelService клиент. Этот адрес сохраняется при регистрации
для портала ProfiParcelService и больше не могут быть изменены, когда
заказы создаются или редактируются. Это возможно только изменить
адрес сбора по умолчанию на портале ProfiParcelService. Будь
создан заказ на доставку или отредактирован существующий заказ
был ли введен номер заказа. Если номер заказа
переведен, заказ на доставку с этим номером загружен для
редактирование, в противном случае добавляется новый заказ. Доставка заказа может быть только
отредактировано перед печатью.4.5.1. propsOrderSave входные параметры
Помимо данных аутентификации, идентификатор партнера, пароль API и пользователь
Токен (см. Раздел 3) в заголовке SOAP, тело SOAP требует
детали заказа на доставку в качестве входных параметров. Они приняты
из PropsOrder (см. 4.2.2).
<soapenv:Body>
<propsOrderSave>
<propsOrder>PropsOrder</propsOrder>
</propsOrderSave>
</soapenv:Body>
4.2.2. PropsOrder
Этот тип данных представляет данные заказа на доставку. Эти данные
Тип используется для создания новых заказов или для редактирования существующих.
<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>
Задача ещё не решена.
Других решений пока нет …