Integracja z payU

0

Witam.

Implementuję płatności payU i mam problem.
Po wysłaniu nowej płatności payU zwraca status zamówienia na adres podany w polu notifyUrl":"http://adres.pl/notify",
Powiadomienia wysyłane są w formacie JSON za pomocą metody POST. Status 302

Szczegóły tu : http://developers.payu.com/pl/restapi.html#notifications

Jak mam odebrać tego posta w controllerze?

@PostMapping("/notify")
	public String getPayStatus(HttpServletResponse httpServletResponse) {
		...
	}

Niestety nie łapie mi tego posta. Jak w POSTMANie wyślę pustego posta (status 200) na ten endpoint to łapie

0

może dodaj

@Consumes(MediaType.APPLICATION_JSON)

czy coś takiego

0

Niestety nie pomogło, ale dzięki za zainteresowanie
Używam ngrok'a. Na screenie widać dwa posty jeden 302 drugi 200. Ten 200 wysłałem z postmana i złapał mi controller a 302 nie chce.

0

302 to jest kod odpowiedzi na żądanie HTTP (to z zamówieniem, wysłane POSTem), więc to nie przyjdzie na kontroler. W treści tej odpowiedzi masz między innymi redirectUri- to jest adres PayU pod który trzeba przekierować użytkownika.

0

Ale chodzi mi już o kolejny etap.
Ten gdzie dostaję zwrotkę z treścią poniżej mam zrobiony:

{ 
   "status":{ 
      "statusCode":"SUCCESS",
   },
   "redirectUri":"{url_do_przekierowania_na_stronę_podsumowania_płatności}",
   "orderId":"WZHF5FFDRJ140731GUEST000P01",
   "extOrderId":"{twój_identyfikator_zamówienia}",
}

Wysyłam już post (z ustawionym adresem powiadomienia notifyUrl = "http://adres.pl/notify") na https://secure.payu.com/api/v2_1/orders -> dostaję odpowiedź gdzie jest redirectUrl -> przekierowuje użytkownika na ten adres -> on płaci przez payU i przekierowuje go na adres który podałem w continueUrl a ja mam odebrać na adresie notifyUrl informację o statusie płatności. On jest wysyłany co jakiś czas dopóki nie zwrócę statusu 200 ("Po wysłaniu notyfikacji system PayU oczekuje wyłącznie HTTP status 200 od klienta. W przypadku każdego innego statusu nastąpi ponowne wysłanie notyfikacji.")

To jest punkt 3.1 w dokumentacji http://developers.payu.com/pl/restapi.html#notifications

0

No tak, PayU robi do Ciebie POSTa na /notify i odpowiadasz HTTP/200 i koniec, tu nigdzie nie ma żadnego 302. Ta adnotacja @Consumes jest z JAX-RS, w Spring to będzie consumes="application/json" w adnotacji @PostMapping .

0

No ok okazało się że te 'code (ERROR): 302, Response: ""' to jest moja odpowierdź na ich notify. Ale nie mogę odebrać tego POSTa na /notify żeby im odpowiedzieć 200.
Mam tak:

@PostMapping("/notify")
@Consumes(MediaType.APPLICATION_JSON)
    public String getPayStatus(HttpServletResponse httpServletResponse) {
        ...
    }

i nie łapie.
Próbowałem też

@PostMapping(path = "/notify", consumes = "application/json", produces = "application/json")

i

@RequestMapping(value = {"/notify"},method = RequestMethod.POST)
    @ResponseBody
    public String jsonTest(String json){
@RequestMapping(value = "/notify", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
	@ResponseBody
	public String jsonTest(@RequestBody String json) { 
@RequestMapping(value = "/notify", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE,  produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String jsonTest(HttpEntity<String> httpEntity) {
@RequestMapping(value = "/notify", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE,  produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String jsonTest(String json){
0

ale w kodzie ustawiasz ścieżkę endpointa na "/payment/finall" ? bo tutaj wklejasz kawałki kodu ze ścieżką "/notify", myślałem że to tak dla przykładu ale już nie jestem pewny

0

tak tak to dla przykładu (prędzej pisałem /notify to chciałem się tego trzymać). W kodzie mam /payment/finall i tak ustawiam we wszystkich przykładach które wysłałem

0

W tym momencie mam ustawione (będę pisał tak jak mam konkretnie w kodzie czyli finall)

@Controller
@RequestMapping("/payment")
public class PaymentController {
...
@PostMapping(value = "/finall" ,consumes = "application/json", produces = "application/json")

Gdy wysyłam POSTMANem POST application/json;charset=UTF-8 dokładnie z taką treścią jaką do mnie wysyła payU to łapie mi PostMapping, a gdy wysyła go PayU to nie. Na screenach body i headery ich i mojego POSTa może to coś podpowie.

Spróbowałem dodać w POSTMANie w headerze te same pola i wartości jakie znajdują się w headerze od payU i przeszło też poprawnie.

1

No to nie wiem, może chodzi o autoryzację do zasobu i dlatego Spring przekierowuje klienta. Ja robiłem to samo w JEE/JAX-RS i nie było takich problemów.

0

Wielkie dzięki ! Dokładnie chodziło o autoryzację do zasobu. Działa. Jakie niedopatrzenie...

0

Cześć, mógłbyś wyjaśnić co dokładnie poprawiłeś? Bo mam ten sam problem

0
piotr napisał(a):

Cześć, mógłbyś wyjaśnić co dokładnie poprawiłeś? Bo mam ten sam problem

Cześć
U mnie problem polegał na tym, że adres zwrotny podałem taki, który był dostępny tylko dla zalogowanych użytkowników. PayU zwracało odpowiedź, ale ona nie docierała do mnie. Musiałem odblokować dany adres dla wszystkich użytkowników

Czyli dodałem do http.authorizeRequests().antMatchers( "/adresZwrotny").permitAll()

0

Witaj,
Czy Mógłbyś wstawić kod obiektu HttpServletResponse.
Moje requesty dochodzą do kontrolera ale niestety json z body się nie binduje... Nie wiem czy to nie wina źle zbudowanego obiektu.
Pozdrawiam

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