SOAP zwrot zawsze nil

0

wysyłam dane do serwera SOAP
wszystkie funkcje wygenerowało mi automatycznie z tego adresu//ta.inpzu.pl/afi-websrv-dystr-prod/services/ppk-soap/API?wsdl

Na zdarzeniu myHTTPRIOAfterExecute mogę przechwycić response,
mój response:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
	<soap:Header>
		<ns2:PPK_HEADER xmlns:ns2="http://pekaofs.com.pl/ppk/api/2.2">
			<ID_PRZEKAZU>583c1ffe4f3379764493f3b44effddd5cb</ID_PRZEKAZU>
			<API_KLIENT/>
			<WERSJA>1.0</WERSJA>
			<GENERACJA>2020-09-22T11:51:07.468</GENERACJA>
			<ID_TFI>PZU</ID_TFI>
			<TRYB_TESTOWY>0</TRYB_TESTOWY>
		</ns2:PPK_HEADER>
	</soap:Header>
	<soap:Body>
		<ns2:ODP_REJESTRACJA_PPK xmlns:ns2="http://pekaofs.com.pl/ppk/api/2.2">
			<REZULTAT>
				<STATUS>BLAD</STATUS>
				<BLEDY>
					<BLAD>
						<RODZAJ>BLAD_DANYCH</RODZAJ>
						<OPIS>PPK_EXIST_KLI</OPIS>
						<ZNACZNIK>00WVAHYS</ZNACZNIK>
					</BLAD>
				</BLEDY>
			</REZULTAT>
			<STATUSY>
				<ODP_UCZESTNIK>
					<ID_KADRY>23</ID_KADRY>
					<IMIE>ABDUL</IMIE>
					<IMIE_2>ALLAH</IMIE_2>
					<NAZWISKO>OBCOKRAJOWIEC</NAZWISKO>
					<PLEC>M</PLEC>
					<OBYW>AQ</OBYW>
					<NR_PESEL>61031379158</NR_PESEL>
					<REZULTAT>
						<STATUS>BLAD</STATUS>
						<BLEDY>
							<BLAD>
								<RODZAJ>BLAD_DANYCH</RODZAJ>
								<OPIS>PPK_EXIST_KLI</OPIS>
								<ZNACZNIK>00WVAHYS</ZNACZNIK>
							</BLAD>
						</BLEDY>
					</REZULTAT>
				</ODP_UCZESTNIK>
			</STATUSY>
		</ns2:ODP_REJESTRACJA_PPK>
	</soap:Body>
</soap:Envelope>

ale jako wynik funkcji która wysyła moje dane do serwera zawsze dostaję nil

Bo teraz robię to tak:

var ppkHeader : PPK_HEADER;
   rejestracjaPPK: ZADANIE_REJESTRACJA_PPK;
   odpRejestracjaPPK: ODP_REJESTRACJA_PPK;
   dane_pracodawcy  :   PRACODAWCA;

begin
  inherited;

  dane_pracodawcy  :=   EksportPPK_SOAP.pracodawca.Create();
  dane_pracodawcy.NIP := OnlyDigits(DM.FirmTNIP.AsString);
  dane_pracodawcy.REGON := OnlyDigits(DM.FirmTRegon.AsString);
  dane_pracodawcy.KONTAKT := DM.FirmTImiosreprez.AsString + ' ' + DM.FirmTNazwiskoosreprez.AsString;

  ppkHeader := EksportPPK_SOAP.PPK_HEADER.Create();
  ppkHeader.ID_PRZEKAZU := '583c1ffe4f3379764493f3b44effddd5cb';
  ppkHeader.WERSJA := '1.0';
  ppkHeader.GENERACJA := FormatDateTime('YYYY-MM-DD',Date()) + 'T' + FormatDateTime('hh:nn:ss',Time());
  ppkHeader.ID_TFI := 'PZU';
  ppkHeader.TRYB_TESTOWY := 0;  

                                    try
                                     rejestracjaPPK := ZADANIE_REJESTRACJA_PPK.Create();
                                     rejestracjaPPK.DANE_UCZESTNIKA := tablica_dane_pracownikow_rejestracja;
                                     rejestracjaPPK.PRACODAWCA :=  dane_pracodawcy;
                                   
                                     // odpRejestracjaPPK := ODP_REJESTRACJA_PPK.Create();
                                      odpRejestracjaPPK := GetPPKService(False,'',nil).ZADANIE_REJESTRACJA_PPK(rejestracjaPPK,ppkHeader);

//tutaj odpRejestracjaPPK jest zawsze nil

                                      if Assigned(odpRejestracjaPPK) then
                                      begin
                                          case odpRejestracjaPPK.REZULTAT.STATUS of
                                            STATUS_REZULTATU.OK : InfoMsg('Eksport pracownikow wykonany poprawnie');
                                            STATUS_REZULTATU.BLAD : ErrorMsg('W eksporcie pracownikow PPK wystąpiły błędy');
                                          end;
                                      end;

                                    finally
                                     SetLength(tablica_dane_pracownikow_rejestracja,0);
                                     rejestracjaPPK.DisposeOf;
                                    end;
                              
end;

Czy zmienna odpRejestracjaPPK będzie tworzona wcześniej czy nie to niczego nie zmienia.

Ale kilka godzin debugowania dorowadziło mnie do procedury** TOPToSoapDomConvert.ProcessSuccess**. Tam w kilku miejscach jest wywoływana procedura ConvertSoapToNativeData.
Gdy do niej wejdzie to wtedy zwraca wynik prawidłowo. Problem w tym, że zawsze jakiś warunek mam nie spełniony i nigdy tam nie wchodzi.
Za pierwszym razem jest taki warunek:

UnboundedArrayRet := (MD.ResultInfo <> nil) and (MD.ResultInfo.Kind = tkDynArray) and
                       (((IS_UNBD and XMLOptions) = IS_UNBD) or  (xoInlineArrays in RemClassRegistry.SerializeOptions(MD.ResultInfo)));

Nie spełniony bo u mnie MD.ResultInfo.Kind jest typu class

Zaraz poniżej jest zmienna RetIndex = -1. A -1 ponieważ zmienna ReturnName jest pusta. A ona się bierze z procedury InvRegistry.GetMethodInfo a ta nic nie zwraca, poniważ jest tam taka pętla for J := 0 to Length(FRegIntfs[I].Methods) -1 do do której nie wchodzi (brak metod?)

W reszcie trzecie miejsce gdzie możę tam wejść, ale tam porównuje najpierw RejestracjaPPK = REZULTAT a później PPK_HEADER = REZULTAT
Ale w tym miejscu jest ciekawe, ponieważ MD.ParamCount = 2 ale jak rozwinąć params to jest tam rejestracjaPPK, PPK_HEADER (czyli moje dwa parametry wejściowe) oraz 3 pusty parametr nil. Może tutaj brakuje tego co powinno się zwrócić?
I od razu podam, że ta procedura wysyłająca ZADANIE_REJESTRACJA_PPK ma 2 i tylko 2 parametry - próbowałem podstawić tam trzeci ale tak już się nie kompiluje.

Napiszcie jeśli potrzeba więcej informacji.
Pomóżcie, bo dwa dni kombinowania i googlowania nie przyniosły rozwiązania.

0

Ja bym radził zatrzymać się na tym co dostajesz w odpowiedzi. A tam jest PPK_EXIST_KLI. Jeśli dobrze rozumiem i wysyłasz jakieś dane do rejestracji a dostajesz coś takiego to na chłopski rozum za którymś z pierwszych razów już te dane zarejestrowałeś i nie da się tego zrobić ponownie.
Dostajesz w odpowiedzi jakieś dane Abdula których nie wysyłasz więc chyba wszystko działa.

0

Nie zrozumieliśmy się.
Tu chodzi o result z funkcji która wysyła dane. Ten xml to nie jest to co powinienem dostać. Powinienem w odpowiedzi dostać obiekt typu ODP_REJESTRACJA_PPK który zawiera status BLAD oraz listę błędów które wystąpiły, a dostaję nil.

0

A gdzie można znaleźć dokumentację do tego?

0

Jaką dokumentację?
Można tylko wygenerować całą listę klas poprzez import WSDL.
W załączniku przesyłam tę listę gdyby ktoś chciał zobaczyć.

0

Może się nie znam bo nie korzystam z SOAP ale dokumentacja jest po to żeby wiedzieć co i jak. Twoja dokumentacja jest np. tu:
http://www.pekao-fs.com.pl/wp-content/uploads/kontakt-erp/Dokumentacja-protokolu-API-PFS-e-PPK.docx
gdzie jest napisane:

• System pozwala na realizację procesów:
o Rejestracja uczestnika PPK
...

• Aby operacja została przeprowadzona pomyślnie wszystkie dane wejściowe muszą być poprawne

Dostajesz błąd PPK_EXIST_KLI (nie jawny) opisany jako

PPK_EXIST_KLI Już istnieje uczestnik ppk w systemie

W swoim kodzie masz sprawdzenie

if Assigned(odpRejestracjaPPK) then

czyli bierzesz pod uwagę, że rejestracja może się nie udać. Może przy błędzie rejestracji system wyrzuca jednak nil-a i tyle. Przy poprawnych danych też dostajesz nil?

Tutaj dalsza część dokumentacji:

W przypadku, gdy wiadomość jest przeprocesowana poprawnie komunikat zwrotny będzie zawierał status „OK”. W przypadku błędów selektywnie zostaną zwrócone te znaczniki xml, które zawierały błędne dane.

W moim mniemaniu dostajesz wszystko ok, zgodnie z dokumentacją.

0

Nie, bo powinien zwrócić status BLAD i listę błędów jakie wystąpiły.
Ale przy poprawnych danych też nic nie zwraca.

Poza tym, gdy wymusiłem mu wejście w procedurę ConvertSoapToNativeData (podczas debugowania zmieniłem wartość zmiennej) to wtedy moja struktura była prawidłowo wypełniona.

0

@My Razem: chciałem spróbować zrobić to samo co Ty, ale link ze specyfikacją WSDL nie odpowiada

0

Rzeczywiście. Z pracy mogę się połączyć a z domu nie.
Widocznie klient ma jakąś filtrację IP.

1 użytkowników online, w tym zalogowanych: 0, gości: 1