Diskuze: SOAP komunikace
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Měla by existovat nějaká třída, který ukážeš .wsdl, nastavíš parametry a ona sama vytvoří SOAP obálku. Metoda služby ti vrátí objekt OdeslaniTrzbyResponse a ten objekt je ta odpověď.. Pomocí prográmku Fiddler (a jiný podobný) můžeš zachitit přímo ten XML co odesíláš a co se ti vrací. V případě EET si dej pozor na co používáš jakej certifikát.. Je jednoduchý se do toho zamotat a pak to samozřejmě nefunguje..
Aha no ta ta třída už má být někde definovaná nebo to musím já sám?
Tady je definice XML a tady WSDL
Když používám funkci new SoapClient() použil jsem tam ted WSDL soubor s
ukaázkovým WSDL a asi není správně že? Jinak ty jsi EET dělal? Tam jsou teď certifikáty pouze
testovací a jsou k nim přiřazeny údaje tak by t snad mělo být jedno ne?
Navíc já potřebuju vůbec
nějakou odpověď i chybová by byla fajn
Pokud použiji
print_r($client->__getFunctions());
vrátí se
Array
(
[0] => OdpovedType OdeslaniTrzby(TrzbaType $parameters)
)
chápu to tedy správně, že to je ta funkce kterou musím použít pro komunikaci?
Volám tedy $client->OdeslaniTrzby($parametrs) s tím, že $parametrs je nějaké pole. Vypíšu si také strukturu kterou by pole mělo mít print_r($client->__getTypes()); Doufám, že to tak píšu správně . Ale moudrej z toho nejsem, struktura vypadá takto
Array
(
[0] => struct TrzbaType {
TrzbaHlavickaType Hlavicka;
TrzbaDataType Data;
TrzbaKontrolniKodyType KontrolniKody;
}
[1] => struct TrzbaHlavickaType {
UUIDType uuid_zpravy;
dateTime dat_odesl;
boolean prvni_zaslani;
boolean overeni;
}
[2] => struct TrzbaDataType {
CZDICType dic_popl;
CZDICType dic_poverujiciho;
IdProvozType id_provoz;
string id_pokl;
string porad_cis;
dateTime dat_trzby;
CastkaType celk_trzba;
CastkaType zakl_nepodl_dph;
CastkaType zakl_dan1;
CastkaType dan1;
CastkaType zakl_dan2;
CastkaType dan2;
CastkaType zakl_dan3;
CastkaType dan3;
CastkaType cest_sluz;
CastkaType pouzit_zboz1;
CastkaType pouzit_zboz2;
CastkaType pouzit_zboz3;
CastkaType urceno_cerp_zuct;
CastkaType cerp_zuct;
RezimType rezim;
}
[3] => struct TrzbaKontrolniKodyType {
PkpElementType pkp;
BkpElementType bkp;
}
[4] => struct PkpElementType {
PkpType _;
PkpDigestType digest;
PkpCipherType cipher;
PkpEncodingType encoding;
}
[5] => struct BkpElementType {
BkpType _;
BkpDigestType digest;
BkpEncodingType encoding;
}
[6] => struct OdpovedType {
OdpovedHlavickaType Hlavicka;
OdpovedPotvrzeniType Potvrzeni;
OdpovedChybaType Chyba;
OdpovedVarovaniType Varovani;
}
[7] => struct OdpovedHlavickaType {
UUIDType uuid_zpravy;
BkpType bkp;
dateTime dat_prij;
dateTime dat_odmit;
}
[8] => struct OdpovedPotvrzeniType {
FikType fik;
boolean test;
}
[9] => struct OdpovedChybaType {
KodChybaType kod;
boolean test;
}
[10] => struct OdpovedVarovaniType {
KodVarovType kod_varov;
}
[11] => string string
[12] => dateTime dateTime
[13] => decimal CastkaType
[14] => int IdProvozType
[15] => int RezimType
[16] => int KodChybaType
[17] => int KodVarovType
[18] => string UUIDType
[19] => string CZDICType
[20] => base64Binary PkpType
[21] => string PkpDigestType
[22] => string PkpCipherType
[23] => string PkpEncodingType
[24] => string BkpType
[25] => string BkpDigestType
[26] => string BkpEncodingType
[27] => string FikType
)
Pokud vložím do pole nějaké údaje (pravděpodobně ve špatném formátu) dostanu chybu
b>Fatal error</b>: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'Hlavicka' property in C:\xampp\htdocs\eet.php:80
Stack trace:
#0 C:\xampp\htdocs\eet.php(80): SoapClient->__call('OdeslaniTrzby', Array)
#1 C:\xampp\htdocs\eet.php(80): SoapClient->OdeslaniTrzby(Array)
#2 {main}
thrown in <b>C:\xampp\htdocs\eet.php</b> on line <b>80</b><br />
Z toho tedy chápu, že mám vytvořit objekt s proměnou hlavicka. Vzhledem k tomu, že neprogramuji objektově pokusy o vytvoření zrovna neprošli. Potřeboval bych tedy vědět jak vytvářet ty objekty ve správném formátu. Díky.
já neumim PhP mam tady hotovou implementaci v C#, ale si na správný cestě.. pro komunikaci použiješ funkci OdeslaniTrzby, která má parametr TrzbaType (TrzbaType obsahuje hlavičku, data a kontrolní kódy). Vrátí se ti objekt, kterej obsahuje buď potvrzovací zprávu, nebo chybovou zprávu. Na tom by nic nemělo bejt, já měl problém až se zabezpečenim (WS-Security). musí se správně nastavit client aby mu server odpověděl..
Tak aspoň, že už tomu začínám celkem rozumět. Dáš mi odkaz na tu implementaci v C#, třeba mi to pomůže. Ale pokud jak jsi psal se vytvoří envelope sama a já zasílám jen hlavičku, body a kódy, tak jak se řeší ten podpis v envelope header? Budu to řešit až dořeším toto ale jen mě to hned napadlo.
no, tu implementaci v c# ti poskytnout nemůžu, moh bych z toho mít problémy, protože je to majetek firmy, pro kterou sem to dělal.. V C# (když to hodně zjednodušim) je třída, který nastavíš adresu webový služby, spousta parametrů (včetně bezpečnostních parametrů a cest k certifikátum), a objekt, kterej posíláš (=TrzbaType) a SOAP obálka se vygeneruje sama. Ty jí ani nevidíš, teda pokud si neodchytneš síťovej provoz(např programem Fiddler). problém byl v tom nastavit ty parametry a certifikáty tak, aby ta SOAP obálka měla správnej tvar a byla správně podepsaná.. (jinak nedostaneš odpověd) podle toho co sem čet, tak v PHP by to mělo jít podobně..
Jo tak to je jasný, já to pochopil tak, že to máš tady přímo na stránkách. Díky za rady já se tím pokusím nějak probrat. Jen tak pro zajímavost kolik tak hodin si nad tím strávil?
Ahoj, tak už jsem se dostal k zabezpečení a musím říct, že netuším jaké parametry do SOAP hlavičky dávat. V dokumentaci EET to není a žádnou dokumentaci pro WS-Security, která by vysvětlovala jak se má implementaci jsem nenašel.
Zobrazeno 11 zpráv z 11.