Nieudana próba integracji z PayU

By | May 7, 2016

Od jakiegoś czasu bezskutecznie walczę z integracją systemu płatności PayU. Niestety, ale utknąłem praktycznie na starcie, bo nie udało mi się wyjść nawet poza przykład podany w dokumentacji, nie mówiąc już o wysyłaniu realnych danych. Stoję w miejscu i przydałoby mi się popchnięcie w odpowiednim kierunku.

PayU wystawia REST API, które chciałem wykorzystać do integracji. O ile jestem w stanie się uwierzytelnić używając testowych danych, to stworzenie nowego zamówienia kończy się zwróceniem czegoś zupełnie innego niż oczekiwałem. Jestem na etapie praktycznie kopiuj/wklej z dokumentacji metoda mająca za zadanie stworzenie nowego zamówienia zachowuje się zupełnie inaczej niż jest to opisane, żeby było śmieszniej, to metody API są pokazane na apiary i zwracają prawidłowe wartości. Oto linki:

W oddzielnym projekcie stworzyłem sobie klienta do RESTowego API. Póki co wszystko jest na kupie, bo nie zacząłem nawet robić jakiegokolwiek porządku w kodzie, który zwyczajnie nie działa tak jak powinien. W tej chwili metoda, która powinna tworzyć nowe zamówienie wygląda w ten sposób(dane testowe z dokumentacji):

Metoda ta powinna mi zwrócić następujące dane w postaci JSONa:

W telegraficznym skrócie – powinienem utworzyć nowe zamówienie w systemie PayU i otrzymać adres, na który powinienem przekierować użytkownika w celu dokonania płatności. Co dostaję w zamian? Sporo kodu w formacie “text/html”, który wkleiłem na Pastebin

Po jego wklejeniu w pliczek html i otwarciu w przeglądarce, wydaje mi się, że jest to “prawie” strona płatności dla stworzonego przeze mnie zamówienia. Niestety, nie wiem dlaczego otrzymuję kod html dla czegoś co przypomina stronę płatności zamiast JSONa. Próbowałem rozwiązać ten problem przekazując od siebie JSONa zamiast StringContent, używać RestSharpa, dodawać nagłówki do requesta i wszystko kończy się dokładnie w ten sam sposób.

Niestety Google nie jest w stanie mi powiedzieć zbyt wiele, bo udało mi się znaleźć jeden wątek na forum, gdzie ktoś miał identyczny problem, ale niestety osoba ta nie znalazła odpowiedzi lub nie podzieliła się nią z innymi. Mam tylko nadzieję, że z Waszą pomocą uda mi się coś z tym zrobić i opisać rozwiązanie, bo w innym wypadku zostanie mi co najwyżej zintegrowanie się w inny sposób, mam jednak nadzieję, że problem jest banalny i po prostu coś przeoczyłem.

Rozwiązanie

Dzięki pomocy Macieja Buzuna w komentarzach problem został rozwiązany. Sprawę załatwia dodanie paramentru do konstruktora HttpClienta w pierwszym usingu. Powinien on wyglądać tak:

Przyczyną problemu był fakt, że pierwsza odpowiedź jaką otrzymywałem miała “StatusCode: 302” i była przekierowaniem. Teść “text/html”, którą otrzymywałem w odpowiedzi, była w rzeczywistości drugą odpowiedzią, wysyłaną dla przekierowania. Wyłączenie automatycznego przekierowania w sposób przedstawiony powyżej załatwiło sprawę.

W najbliższym czasie planuję kontynuowanie prac nad integracją, jeszcze raz dzięki za pomoc Maćku!