Integracja kodu z systemem e-nadawca Poczty Polskiej

0

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?

0

lżejsze metody niż co? konkretnie z czym masz problem?

0

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:)

0

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; 
0

Witam

Czy udało się rozwiązać temat ? Mam podobny problem z tm.przesylka[0] := paczkapocztowa;

pozdrawiam
Jacek

0

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ć

0

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

0

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)

0

o tym to ja już wiem od wczoraj... ale jeszcze szukam...

0

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; 
0

Delphi nie przekazuje tak jak w C# danych jako wskaźników. Podejrzewam, że nie sprawdziłeś swojego rozwiązania w realu...

0

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.

0

Witam serdecznie

Mam pytanie - jak zrobić poprawnie autoryzację,bo wywala mi błąd 401 :/

0

Poszukaj mojego wątku na ten temat

0
Wybitny Krawiec napisał(a):

Poszukaj mojego wątku na ten temat

Jak byś się podpisał było by łatwiej :)

0

Szukaj norbert_kacz :)

0

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

0

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

0

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

0

Ok autoryzacje przeskoczyłem.

Ale jak wygenerować guid dla przesyłki itp ??

0

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.

0

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.

1

no rzeczywiście ciężko poszukać... https://www.google.pl/search?q=delphi+generate+guid

0
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 :)

0

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.

0

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.'"

0

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 :/

0

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.