Macie może jakieś doświadczenia w integracji własnego kodu z systemem e-nadawca Poczty Polskiej? Bo właśnie czytam dokumentację i wrażenia mam raczej negatywne. Może są jakieś lżejsze metody ugryzienia tego tematu?
lżejsze metody niż co? konkretnie z czym masz problem?
Tak ściślej to szukam jakiejś implementacji uproszczonej, coś jak jest np przy płatnościach on-line: można zrobić implementację pełną (dużo czasu), a można uproszczoną(mało czasu, mniejszy stopień skomplikowania). W metodach podanych przez pocztę napisali, że trzeba najpierw utworzyć konto w serwisie, natomiast na jakiejś podstronie, że można zlecać wysłanie paczki bez rejestracji. I tego mniej więcej szukam: prostej metody która po przekazaniu danych zarejestruje paczkę i wypluje użytkownikowi wypełniony blankiet nadania. Nie wiem czy takie coś istnieje i czy tak się da, ale kto pyta nie błądzi:)
Muszę odświeżyć temat. Doszedłem do etapu poprawnego logowania i tworzenia przesyłki [ trochę nomenklatury: paczka-paczka pocztowa sensu stricte, przesyłka -lista paczek przekazywana do systemu e-nadawca ], ale nie mogę przeskoczyć dodawania paczek do przesyłki. Stosując metodę addshipment dostaję błąd: nie znaleziono żądanego nagłówka.
Trochę kodu dla rozjaśnienia:
procedure TForm6.Button2Click(Sender: TObject);
var
E: elektronicznynadawca;
P:paczkaPocztowaType;
A:adrestype;
tmp:addshipment;
inp: hello;
karta:getkarty;
kartaakt:setAktywnaKarta;
bufor1:bufortype;
nrguid:getguid;
begin
inp := hello.Create;
try
E:=(httprio1 as elektronicznynadawca);
inp.in_:='test';
karta:=getkarty.Create;
kartaakt:=setAktywnaKarta.Create;
button1.Caption:=inttostr( kartaakt.idKarta); //ok daje zero
bufor1:=bufortype.Create;
bufor1.active:=true;
tmp:=addshipment.Create;
A:=adrestype.Create;
A.nazwa:='Jan';
A.nazwa2:='Nowak';
A.ulica:='Cicha';
A.numerDomu:='1';
a.numerLokalu:='1';
a.miejscowosc:='Warszawa';
a.kodPocztowy:='00002';
P:=paczkapocztowatype.Create;
P.posteRestante:=true;// Boolean;
P.kategoria:= kategoriaType(0);
P.adres:=A;
//tmp.przesylki[0]:=p;
E.addShipment(tmp);
ShowMessage('OK: ' + inp.ToString + #13#10)
except on E:exception do ShowMessage( e.Message+' not OK');
end;
inp.Free;
end;
Witam
Czy udało się rozwiązać temat ? Mam podobny problem z tm.przesylka[0] := paczkapocztowa;
pozdrawiam
Jacek
No niestety nie, więc chwilowo zarzuciłem pomysł. Ale jak jest nas dwóch to może uda się popchnąć temat do przodu. Pytałem u źródła w Poczcie Polskiej, ale mam wrażenie że sami mają blade pojęcie jak to jest zrobione. Podejrzewam, że moment w którym się zatrzymaliśmy
tm.przesylka[0] := paczkapocztowa
to jest jakaś zupełna pierdoła, ale na dziś zupełnie nie wiem jak to rozwiązać
to nie do końca pierdoła - w/g mojej oceny - autorzy sugerując się środowiskiem VS uznali, że Delphi-arze to dinozaury i zamiast stworzyć alternatywę uznali, że wszyscy pracują na C# a tam są przekazywane zawsze wskaźniki. Dlatego oni sami nie znają rozwiązania problemu w Delphi.
Gdyby nie konieczność rozwiązania problemu w Delphi dopisałbym bibliotekę w C# i zamknąłbym temat, a tak szukam rozwiązania.
Moim zdaniem - Poczta Polska ma prosty temat do zrobienia - stworzyć metodę przekazującą po wskaźniku (TPointer) lub (TObject), Tyle, że pewnie im się zwyczajnie nie chce ruszyć tematu.
Pozdrawiam
Jeśli problem leży po stronie Poczty to nie wiem czy nie lepiej dopisać bibliotekę w innym języku. Podejrzewam, że dużo więcej czasu zajmie poszukiwanie rozwiązania dla Delphi (a i tak nie wiadomo czy nie skończy się na półśrodkach)
o tym to ja już wiem od wczoraj... ale jeszcze szukam...
Taka konstrukcja działa bez problemu na Delphi XE3
tmp := addShipment.Create;
arr := Array_Of_przesylkaType.Create();
SetLength(arr,1);
paczka:=paczkapocztowatype.Create;
arr[0] := paczka;
tmp.przesylki := arr;
Delphi nie przekazuje tak jak w C# danych jako wskaźników. Podejrzewam, że nie sprawdziłeś swojego rozwiązania w realu...
Powyższe rozwiązanie obecnie funkcjonuje od prawie roku od kiedy zaimplementowaliśmy E-Nadawcę do naszego systemu windykacyjnego.
Obawiam się, że Ty nie sprawdziłeś powyższego przykładu.
Witam serdecznie
Mam pytanie - jak zrobić poprawnie autoryzację,bo wywala mi błąd 401 :/
Poszukaj mojego wątku na ten temat
Wybitny Krawiec napisał(a):
Poszukaj mojego wątku na ten temat
Jak byś się podpisał było by łatwiej :)
Szukaj norbert_kacz :)
Próbuje na platformie testowej e-nadawcy
Ustawienia HTTPRIO
WSDLLOCATION https://en-testwebapi.poczta-polska.pl/websrv/en.wsdl
Service ElektronicznyNadawca
Port ENSoap
podpięty do tego jest THTTPReqResp
z wypełnionymi username user i password pass i..lipa:/
PS. Delphi XE5
Metoda używana w webservice sledzenia czyli
var
Hdr: Security;
Headers: ISOAPHeaders;
begin
Hdr := Security.Create;
]
Hdr.MustUnderstand := False;
Hdr.UsernameToken := UsernameToken.Create;
Hdr.UsernameToken.Username := 'sledzeniepp';
Hdr.UsernameToken.Password := Password.Create;
Hdr.UsernameToken.Password.Type_ :=
'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
Hdr.UsernameToken.Password.Text := 'PPSA';
]
htpr1.SOAPHeaders.SetOwnsSentHeaders(True);
Headers := GetSledzenie(TRUE,'', htpr1) as ISOAPHeaders;
Headers.Send(hdr);
po zmianie user/pass nie chce działać - ten sam błąd 401
Z kolei
procedure TForm1.htpr2BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
var
xml: IXMLDocument;
n1, n2: IXMLNode;
begin
SOAPRequest.Position := 0;
xml := TXMLDocument.Create(Application);
xml.LoadFromStream(SOAPRequest);
n1 := xml.ChildNodes.FindNode('SOAP-ENV:Envelope');
if n1 <> nil then
begin
n1 := n1.AddChild('SOAP-ENV:Header', 0);
n1 := n1.AddChild('wsse:Security');
n1.Attributes['SOAP-ENV:mustUnderstand'] := '1';
n1.Attributes['xmlns:wsse'] := 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
n1 := n1.AddChild('wsse:UsernameToken');
n1.Attributes['xmlns:wsu'] := 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
n2 := n1.AddChild('wsse:Username');
n2.Text := 'user';
n2 := n1.AddChild('wsse:Password');
n2.Attributes['Type'] := 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
n2.Text := 'pass';
end;
SOAPRequest.Position := 0;
xml.SaveToStream(SOAPRequest);
end;
daje błąd Header not understod
Ok autoryzacje przeskoczyłem.
Ale jak wygenerować guid dla przesyłki itp ??
a to widziales?
https://e-nadawca.poczta-polska.pl/download/en_opis_webapi.pdf
https://e-nadawca.poczta-polska.pl/websrv/en.wsdl
I jeszcze jedno - dane w sledzeniu sa tylko przez 30 dni.
Dokumentacje widziałem, tylko w dokumentacji piszą sobie cwaniaki na stronie 17 w C# "paczka.guid = Guid.NewGuid().ToString();" ,a nie wiem jak to na Delphi przełożyć
Ps. fragment mojego kodu masz na PW.
no rzeczywiście ciężko poszukać... https://www.google.pl/search?q=delphi+generate+guid
abrakadaber napisał(a):
no rzeczywiście ciężko poszukać... https://www.google.pl/search?q=delphi+generate+guid
Jest jedno "ale" w dokumentacji do enadawcy dostępnej tutaj https://e-nadawca.poczta-polska.pl/download/specyfikacja-webapi-en-v.43-7.0.1-02.02.2016.zip
czytamy
getGuid napisał(a)
Metoda pozwala pobrać lista guidów (1-100), guidy są wykorzystywane podczas transmisji danych
o przesyłkach. Każda przesyłka powinna posiadać unikalny guid. Zalecamy wykorzystywanie tej metody do nadawania guidów przesyłkom w metodzie addShipement.
Sęk w tym,że to wcale nie zwraca po prostu stringa :)
skoro w dokumentacji jest Guid.NewGuid().ToString()
, które robi to https://msdn.microsoft.com/pl-pl/library/system.guid.newguid(v=vs.110).aspx to w delphi aby to (dostać GUID) zrobić trzeba po prostu odpalić to co masz w linku z googla.
GUID ogarnięty tym http://abakalidis.blogspot.com/2010/12/simple-guid-generator-function-for.html ,ale...wywala mi,że Produkt nie znajduje się na umowie zawartej z Pocztą.." wrr,a to zwykły polecony,który na bank jest,bo przez interfejs www e-nadawcy przechodzi...co za szajs :/
Dodaje go metodą z 1 strony tego tematu czyli
tmp := addShipment.Create;
arr := Array_Of_przesylkaType.Create();
SetLength(arr,1);
paczka:=paczkapocztowatype.Create;
arr[0] := paczka;
tmp.przesylki := arr;
w var mam zadeklarowane
resp : addShipmentResponse;
i niżej w kodzie po w/w
resp := ten.addShipment(tmp);
i w resp[0] mam błąd nr 8304 "'Produkt ("") nie znajduje się na umowie zawartej z Poczta Polską S.A.'"
Ja już nie wiem, czy ten system jest chory,czy ze mną coś nie tak ...
Kod https://www.dropbox.com/s/xpk56n5f05zu1mr/poczta.zip?dl=0, zdarzenie na btn2.
Niby pięknie,ładnie a jednak ostatnia linijka numernadania='' i błąd jw :/
Przepraszam, ze odkopuję temat, ale mam bardzo podobny problem co bdkacz. Jestem bardzo, bardzo początkującym programistą Delphi. Utrzymuję w ruchu, poprawiam i dodaje nowe funkcjonalności w starym i dużym systemie zarządzania firmą. Dostałem zlecenie wykonania integracji PP i męczę się z tym już dobry tydzień a zawiesiłem na etapie dodawania przesyłki do pakietu. Metoda addShipment zwraca mi błędy: (33203) Produkt ('Przesyłka nieobsługiwana') Nie znajduje się na umowie zawartej z PP i (81058) Przekazana planowana data dla przesyłki jest w przeszłości. Czyli najważniejszy problem to, że nie rozpoznaje przesyłki. Zmienna przesylka typu pocztex2021KurierType zawiera wszystkie moim zdaniem niezbędne dane a przesdopakietu typu Array_Of_przesylkaType jest bez danych adresowych. Czuję, że to tu jest problem. Próbowałem używać listy jak w przykładowych integracjach udostępnianych przez PP w C# ale problem jest taki sam. Bardzo proszę o pomoc.
procedure TfrmSandbox.btn5Click(Sender: TObject);
var
tEN: ElektronicznyNadawca;
tmp: addshipment;
tmpres: addShipmentResponse;
przesdopakietu: Array_Of_przesylkaType;
przesylka: pocztex2021KurierType;
getUrzNadResp: getUrzedyNadaniaResponse;
send: sendEnvelope;
sendresp: sendEnvelopeResponse;
guid: getGuid;
kom: string;
i,j: Integer;
begin
inherited;
try
//-------------------------- Wysyłka przesyłek do pakietu ----------------------
tEN := GetElektronicznyNadawca(False, '', htprPP);
tEN.clearEnvelope(clearEnvelope.Create);
guid := getGuid.Create;
guid.ilosc := 1;
przesylka := pocztex2021KurierType.Create;
przesylka.guid := tEN.getGuid(guid)[0];
przesylka.masa := 20000;
przesylka.format := formatPocztex2021Type.XL;
przesylka.mpk := 'MPK\DRS';
przesylka.adres := adresType.Create;
przesylka.adres.nazwa := 'Jan Kowalski';
przesylka.adres.ulica := 'Woronicza';
przesylka.adres.numerDomu := '12';
przesylka.adres.miejscowosc := 'Warszawa';
przesylka.adres.kodPocztowy := '00950';
przesylka.adres.telefon := '501123456';
SetLength(przesdopakietu,1);
przesdopakietu[0] := przesylka;
tmp := addShipment.Create;
tmp.przesylki := przesdopakietu;
tmpres := tEN.addShipment(tmp);
kom := '';
for i:= 0 to Length(tmpres)-1 do
begin
kom := kom + 'Numer GUID: ' + tmpres[i].guid + #13#10 +
'Numer nadania: ' + tmpres[i].numerNadania + #13#10 +
'Błędy:' + #13#10;
for j:= 0 to Length(tmpres[i].error)-1 do
begin
kom := kom + '(' + IntToStr(tmpres[i].error[j].errorNumber) + ') ' +
tmpres[i].error[j].errorDesc + #13#10;
end;
kom := kom + #13#10#13#10;
end;
MessageBoxW(Handle, PWideChar(kom),'Komunikat o błędach', MB_OK);
//----------------------------- Dostępne urzędy --------------------------------
getUrzNadResp := tEN.getUrzedyNadania(getUrzedyNadania.Create);
kom := '';
for i:= 0 to Length(getUrzNadResp)-1 do
begin
kom := kom + 'ID urzędu: ' + IntToStr(getUrzNadResp[i].urzadNadania) + #13#10 +
'Nazwa: ' + getUrzNadResp[i].nazwaWydruk + #13#10 +
'Opis: ' + getUrzNadResp[i].opis + #13#10#13#10;
end;
MessageBoxW(Handle, PWideChar(kom),'Dostępne urzędy nadania', MB_OK);
//------------------------- Wysyłka do urzędu nadania --------------------------
send := sendEnvelope.Create;
send.urzadNadania := getUrzNadResp[0].urzadNadania;
sendresp := tEN.sendEnvelope(send);
kom := '';
for i:= 0 to Length(sendresp.error)-1 do
begin
kom := kom + '(' + IntToStr(sendresp.error[i].errorNumber) + ') ' +
sendresp.error[i].errorDesc + #13#10;
end;
MessageBoxW(Handle, PWideChar(kom),'Błędy wysyłki do urzędu nadania', MB_OK);
except
raise;
end;
end;
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.