Gdy
mamy już gotowego prostego klienta, czas wrzucić jakąś przesyłkę.
Ale
na początek może wytłumaczę czym jest karta, którą definiuje
się jako dodatnią liczbę całkowitą. Najprościej wyobrazić
sobie ją jako kontener, który umożliwia wkładanie do niego tylko
przesyłek, które są do niego przypisane. Tak więc jeśli mamy
umowę z Pocztą i dostajemy od nich jakieś numery kart, to każda z
tych kart definiuje co w jej ramach można wysyłać.
Przed
wysłaniem przesyłki potrzebny jest nam bufor, do którego będziemy
mogli ją wrzucić. Oczywiście system pozwala nam się czymś takim
nie przejmować, będziemy wówczas musieli korzystać z bufora
domyślnego, dlatego przedstawię tu dwie strategie:
1. korzystanie z
bufora domyślnego
2. korzystanie, z
świadomie tworzonych przez użytkownika buforów
Dziś zajmę się
punktem pierwszym: korzystanie z bufora domyślnego
Użytkowanie
bufora domyślnego ma swoje ograniczenie, dzień w którym coś do
niego wrzucamy musi być dniem jego wysłania a jednocześnie jest
dniem nadania. Dodatkowo, najbezpieczniej przed wrzuceniem do niego
nowych przesyłek wyczyścić go całkowicie (metoda clearEnvelope)
tak aby mieć pewność, że nie ma tam przesyłek, których
zapomnieliśmy wysłać dzień wcześniej.
Całą
procedurę wysyłania przesyłek opisać można w 7 krokach.
1.
ustalenie dostępnych numerów kart (getKarty)
2.
ustawienie bieżącej karty (setAktywnaKarta)
3.
wyczyszczenie istniejącego bufora (clearEnvelope)
4.
utworzenie przesyłki
5.
wysłanie przesyłki do elektronicznego nadawcy (addShipmnet)
6.
pobranie dostępnych urzędów nadania dla bieżącej karty
(getUrzedyNadania)
7.
wysłanie informacji o utworzonych przesyłkach na wybrany urząd
nadania (sendEnvelope)
Pominąłem
na tą chwilę pobieranie nalepek adresowych aby nie zaciemniać
kodu, nalepki adresowe można pobrać po utworzeniu przesyłek jaki i
po ich wysłaniu na wybrany urząd nadania. Dodatkowo uprościłem sprawę wybierania karty oraz urzędu nadania, po przez użycie zawsze pierwszej z dostępnych.
Poniżej
wrzucam, mam nadzieję czytelny kod, który wykona wszystkie
czynności od 1 do 7. Najlepiej go odpalić i sprawdzić jak działa, oraz dla pewności co pozostaje po jego wykonaniu w folderze "Wysłane" na stronie
Testowej Elektronicznego Nadawcy.
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <?php include "ElektronicznyNadawca.php"; class client { protected $guid = null; public $urzedyNadania = null; protected $karty = null; protected $przesylki = array(); protected $przesylkiDodane = array(); protected $login = 'nazwa użytkownika w systemie elektroniczny nadawca'; protected $location = 'https://en-testwebapi.poczta-polska.pl/websrv/labs.php'; protected $password = 'hasło'; protected $en = null; // ------------------------------------------------------------------------- public function __construct() { $this->en = new ElektronicznyNadawca("labs.wsdl", array('login' => $this->login, 'password' => $this->password, 'location' => $this->location )); } // ------------------------------------------------------------------------- public function testGetKarty() { echo "========<b>testGetKarty</b>====================<BR>"; $parameters = new getKarty(); $response = $this->en->getKarty($parameters); var_dump($response); $response->karta = $this->convertToArray($response->karta); $this->karty = $response->karta; } // ------------------------------------------------------------------------- public function testSetAktywnaKarta() { echo "========<b>setAktywnaKarta</b>====================<BR>"; $parameters = new setAktywnaKarta(); $parameters->idKarta = reset($this->karty)->idKarta; $response = $this->en->setAktywnaKarta($parameters); var_dump($parameters); $response = new setAktywnaKartaResponse(); if(!is_null($response->error)) { $this->printErrors($response->error); throw new Exception("Błąd ustawiania karty."); } } // ------------------------------------------------------------------------- public function testClearEnvelope() { echo "========<b>testClearEnvelope</b>====================<BR>"; $response = $this->en->clearEnvelope(new clearEnvelope()); var_dump($response); } // ------------------------------------------------------------------------- public function testPaczkaPocztowaType() { echo "========<b>testPaczkaPocztowaType</b>====================<BR>"; $paczka = new paczkaPocztowaType(); $paczka->adres = new adresType(); $paczka->adres->nazwa = "Jan Kowalski"; $paczka->adres->ulica = "Kowalska"; $paczka->adres->numerDomu = "666"; $paczka->adres->numerLokalu = "666"; $paczka->adres->kodPocztowy = "66-666"; $paczka->adres->miejscowosc = "Warszawa"; $paczka->kategoria = kategoriaType::PRIORYTETOWA; $paczka->gabaryt = gabarytType::GABARYT_B; $paczka->wartosc = 20000; $paczka->guid = $this->getGuid(); var_dump($paczka); $this->przesylki[] = $paczka; } // ------------------------------------------------------------------------- public function testAddShipment() { echo "========<b>testAddShipment</b>====================<BR>"; $parameters = new addShipment(); $parameters->przesylki = $this->przesylki; $response = $this->en->addShipment($parameters); var_dump($response); $response->retval = $this->convertToArray($response->retval); foreach($response->retval as $przesylka) { if(is_null($przesylka->error)) $this->przesylkiDodane[] = $przesylka; else { echo "<B>Nie udało się dodać przesyłki </B>" . $przesylka->guid . " z powodu błędów.<BR>"; $this->printErrors($przsylka->error); } } } // ------------------------------------------------------------------------- public function testSendEnvelope() { echo "========<b>testSendEnvelope</b>====================<BR>"; $parameters = new sendEnvelope(); $parameters->urzadNadania = $this->urzedyNadania[0]->urzadNadania; $response = $this->en->sendEnvelope($parameters); var_dump($response); if(!is_null($response->error)) { $this->printErrors($response->error); } echo "<B>Status wysłanego kontenera przesyłek: </B>" . $response->envelopeStatus . "<BR>"; echo "<B>Identyfikator kontenera przesyłek: </B>" . $response->idEnvelope . "<BR>"; return $response->idEnvelope; } // ------------------------------------------------------------------------- public function testGetUrzadNadania() { echo "========<b>testGetUrzadNadania</b>====================<BR>"; $response = $this->en->getUrzedyNadania(new getUrzedyNadania()); var_dump($response->urzedyNadania); $response->urzedyNadania = $this->convertToArray($response->urzedyNadania); if(count($response->urzedyNadania) == 0) throw new Exception("Brak urzędów nadania."); $this->urzedyNadania = $response->urzedyNadania; } // ------------------------------------------------------------------------- function getGuid() { mt_srand((double)microtime() * 10000); $charid = strtoupper(md5(uniqid(rand(), true))); $retval = substr($charid, 0, 32); return $retval; } // ------------------------------------------------------------------------- function convertToArray($data) { if(!is_array($data)) $data = array( $data ); return $data; } // ------------------------------------------------------------------------- function printErrors($errors) { $errors = $this->convertToArray($errors); foreach($errors as $error) { echo "[" . $error->errorNumber . "] " . $error->errorDesc . " " . $error->guid . "<BR>"; } } } $c = new client(); $c->testGetKarty(); $c->testSetAktywnaKarta(); $c->testClearEnvelope(); $c->testPaczkaPocztowaType(); $c->testAddShipment(); $c->testGetUrzadNadania(); $c->testSendEnvelope(); ?> </body> </html>
Hej. Dzięki wielkie za wskazówki. Wszystko działa - ale, mam problem z funkcją pocztexKrajowyType - otrzymuję błąd:
OdpowiedzUsuń========testAddShipment====================
object(addShipmentResponse)#20 (1) {
["retval"]=>
object(addShipmentResponseItemType)#21 (3) {
["error"]=>
object(errorType)#22 (3) {
["errorNumber"]=>
int(40102)
["errorDesc"]=>
string(74) "Produkt ("832") nie znajduje się na umowie zawartej z Poczta Polską S.A."
["guid"]=>
string(32) "AA43DC14D9462D056237873B3A3F370C"
}
["numerNadania"]=>
NULL
["guid"]=>
string(32) "AA43DC14D9462D056237873B3A3F370C"
}
}
Dodam, że tylko przy dodawaniu opcji POCZTEX i tylko na wersji produkcujnej (na testowej działa) .
Spotkałeś się już może z czymś takim? Pozdrawiam, Krzysiek
Witam
OdpowiedzUsuńBędzie trzeba się zgłosić do przedstawiciela handlowego, wygląda na to, że karta na której przygotowywana jest przesyłka, nie ma pocztexKrajowyType (to jest stary pocztex), tylko oni mogą dopisywać takie rzeczy do karty.
Po za tym myślę, że to może być błędny typ, bowiem o ile się orientuję, aktualnie w ofercie PP pocztex udostępniany jest jako typ uslugaKurierskaType.
Jesteś MASTER!
OdpowiedzUsuńHello, please how I can add a description (eg. Order number) on the label? Also, you can not specify the type of insurance U1. Can you please publish a sample script for describing and insurance? Thank you very much.
OdpowiedzUsuńŚwietny opis, naprawdę mi pomógł. Małe pytanie, jak uzyskałeś dostęp do konta testowego - dane które otrzymałem do konta produkcyjnego nie działają i nie wiem jak zdobyć dane do testowego.
OdpowiedzUsuńWitam
UsuńFaktycznie, wszelkie kontakty wydają się jakby ukryte, udało mi się na stronie coś znaleźć, i jestem pewien, że tam będą w stanie udzielić jakiejś konkretnej informacji z kim rozmawiać o dostępie do konta testowego
"Dla telefonów stacjonarnych 801 333 444 (opłata jak za połączenie lokalne),
dla telefonów komórkowych i zagranicy (+48) 43 842 06 00 (opłata wg cennika operatora).
Infolinia czynna jest od poniedziałku do piątku w godz. 8:00 - 20:00"
Hej, mam problem, wszystko działa niby ok, skrypt niby tworzy przesyłkę i otrzymuję numer przesyłki, lecz nie widzę tej przesyłki po zalogowaniu się do e-nadawcy. W czym jest problem?
OdpowiedzUsuńWitam
OdpowiedzUsuńNależy wejść na ENa w zakładkę Ustawienia, po lewej stronie w sekcji Inne zaznaczyć checkboxa "Pokaż bufory webapi w przygotowanych"
Pozdrawiam
Dzięki wielkie za pomoc!:) Teraz już widzę zbiory, mam jeszcze tylko jedno pytanie, czy mogę w jakiś sposób odczytać istniejące bufory?
OdpowiedzUsuńBo poradziłem sobie w taki sposób, id zbioru jest widoczne na końcu linku zbioru: https://e-nadawca.poczta-polska.pl/przesylki/?action=GetZbiorClose&arg1=16079228
i gdy podstawiam w
$parameters->idBufor = $bufor->idBufor
wartość arg1 zamiast $bufor->idBufor to mi dodaje paczkę do tego zbioru. Czy da się z poziomu Api odczytać id zbiorów/buforów?
Ok widzę że się nie da pobrać listy buforów utworzonych ręcznie w EN tylko te co zostały utworzone poprzez API, więc pozostaje poprzez api dodawać nowy zbiór :) Już sobie poradziłem przerabiając nieco Twoją funkcję testgetkarty(), kod
OdpowiedzUsuńprotected $bufory = null;
public function testEnvelopeBuforList()
{
echo "========testBuforList====================
";
$parameters = new getEnvelopeBuforList();
$response = $this->en->getEnvelopeBuforList($parameters);
var_dump($response);
$response->bufor = $this->convertToArray($response->bufor);
$this->bufory = $response->bufor;
}
Dokładnie, niestety nie da się metodą getEnvelopeBuforList wylistować buforów utworzonych po za webapi, myślę że zamysł był taki by ewentualny mechanizm po stronie webapi nie miał wpływu na przesyłki tworzone przez www.
OdpowiedzUsuńDobra ogarnąłem już prawie wszystko, pozostało mi tylko generowanie etykiet, podeślesz w jaki sposób można to zrobić?
OdpowiedzUsuńWitam, jestem nowy w języku polskim, a także jestem integracji Polski Integracja Post .net Project, próbowałem wiele rzeczy, ale siedzę w błąd "PRODUKT (& quot; & quot;) Nie znajduje SIĘ na umowie zawartej z Poczta Polska SA " struggeling od tygodni. można zasugerować, jakie rzeczy można zrobić, aby rozwiązać ten problem. Ja was posyłam jak poniżej przykładowy plik xml:
OdpowiedzUsuń0
Maybe better to write in English? Most of polish people know english :) In this case you propably use wrong delivery type, thats not on the deal that customer (owner of account that you connect to API) of Polish Post have. Its very complicated with amount of delivery types and the best solution is to contact Sales department of Polish Post, thru the account owner, and they for sure gonna help you with that - they were very helpfull for me with the integration!
UsuńThanks a lot for your quick response :), i have tried lots of Shipment types but not get success, as per your suggestion i will contact to polish post team. your blog helped me a lot. thanks again :)
UsuńWitam, jestem nowy w języku polskim, a także jestem integracji Polski Integracja Post .net Project, próbowałem wiele rzeczy, ale siedzę w błąd "PRODUKT (& quot; & quot;) Nie znajduje SIĘ na umowie zawartej z Poczta Polska SA " struggeling od tygodni. można zasugerować, jakie rzeczy można zrobić, aby rozwiązać ten problem. Ja was posyłam jak poniżej przykładowy plik xml:
OdpowiedzUsuń0
Ten komentarz został usunięty przez autora.
OdpowiedzUsuńTen komentarz został usunięty przez autora.
OdpowiedzUsuńOdbijam się od "Produkt ("") nie znajduje się na umowie zawartej z Poczta Polską S.A." Dla każdego rodzaju paczki. Zarówno dla Twojego kodu, jak i kodu z dokumentacji jak i zupełnie od zera napisanej komunikacji. Czy coś jeszcze z PP trzeba załatwić aby webapi działało?
OdpowiedzUsuńSkontaktuj się z handlowcem przypisanym do konta i Ci poda dokładny produkt, który jest przypisany do umowy. W PP jest tak, że działają Ci tylko produkty, na które podpiszesz umowę, a ich nazwy często są mylące i trzeba się naszukać.
UsuńWitam
UsuńCzy mógłbyś dodać treść SOAPa, który jest wysyłany do EN, bowiem wygląda na jakiś błąd w typie przesyłki.
;)
OdpowiedzUsuńJasne, że to świetna sprawa. I jakbyś kiedyś sam za pośrednictwem brokerów nadawał jakieś przesyłki to polecam wyposażyć się w porządne taśmy pakowe jak np. https://tcmservice.pl/pl/tasmy-pakowe .
OdpowiedzUsuń