Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z integracją PayU
Forum PHP.pl > Forum > PHP
MotuH
Witajcie koledzy smile.gif

Mam problem z integracja PayU ze swoją stroną www.

Otóz wysyłanie danych jest wporządku. PayU pokazuje platnosc oraz wszelkie dane z formularzy. Po kliknieciu akceptacji platnosci w przykladzie testowym, wraca mi na podstrone "przyklad.pl/index.php?wynik=ok".

Jak jest blad to "wynik=blad".

I teraz pytanie. W przykladach ktore znalazlem w necie jezeli platnosc jest ok to payu powinno przeslaes $_POST z danymi do weryfikacji... wrzucam sobie var_dum($_POST) i wyskakuje mi komunikat ze array(0). Co robie nie tak? Moge prosic o krotkie info?

Z gory dziekuje za wszelka pomoc, a jezeli cos niejasno opisalem to zamiast z*ebki dajcie znac to rozpisze wszystko bardziej szegolowo smile.gif
Damonsson
PayU przesyła to na stronę którą podałeś tam gdzieś w ustawieniach.

Nie da się odczytać tego co przesyła przez przeglądarkę, bo to PayU wysyła, a nie Ty. Podejrzeć sobie może na stronie PayU w historii transakcji i wybrać płatności testowe.
Albo możesz na tej stronie, na którą PayU wysyła POSTA, zrobić zapis tego $_POSTa do pliku czy bazy i później sobie go przejrzeć.
MotuH
Pokminilem i przesylam sobie getem kilka parametrow na strone wynikowa gdzie jest ok i tam dokonuje sprawdzania na jakim etapie jest transakcja. tak chyba ma byc prawda?
Damonsson
Może inaczej. Z czym masz problem? Bo pytasz co robisz nie tak, czy tak ma być, ale nie piszesz co chcesz osiągnąć.
MotuH
Chce zeby pokazywalo mi stan platnosci.

Laczy sie z payu, wraca na moja strone ze statusem ok. i teraz chce sprawdzic na jakim etapie jest platnosc. czy jest zrealizowana, w trakcie, czy sie nie udalo itp itd. smile.gif
Damonsson
No to przy Payment/get dostajesz zwrotkę i musisz ją przeanalizować po stronie serwera i sobie gdzieś wypluć wynik.

Zresztą automatycznie po zrobieniu transakcji przez chyba godzinę transakcja próbuje się odbyć i za każdym razem dostajesz $_POSTa od PayU (dopóki nie jest, że zapłacono), na tej podstawie analizujesz czy płatność jest zrealizowana czy nie i zapisujesz to sobie gdzieś. Po 2 dniach płatność będzie miała taki sam status jak ta ostatnia próba która się wykonała z automatu, więc po co sprawdzać ponownie.
MotuH
Moj kod lapiacy wynik w pliku z payu wyglada tak:

"switch ($_GET['wynik']) {

case 'ok':

$bledy = array();

if (isset($_GET['pos']) && isset($_GET['sesja']) && isset($_GET['zamowienie'])) { cos tam dalej..."

jak daje odbior jako $_post to nic sie kompletnie nie dzieje. nie wiem czy jest to spowodowane tym ze jestem w trybie testowym czy cos poprostu robie zle :/

Parametry dla get ustawilem w payu w sekcji "Adres powrotu pozytywnego".
wujek2009
http://www.payu.pl/_old/view/admin/ckedito..._2011-05-16.pdf
+ przykładowy plik raportu (pliku, który aktualizuje Ci statusy zamówień - plik, do którego payu "łączy się" i wysyła dane $_POSTem)
http://www.payu.pl/pliki/raport.phps.html

w tej dokumentacji technicznej masz punkt 3.7.2 - i tam masz spis danych, które PayU wysyła do Ciebie
- status transakcji możesz sprawdzić po przez: $_POST['status']
MotuH
Dzieki wuja. W sumie czytalem dokumentacje ale cos i tak mi nie idzie - moze poprostu nastapilo zmeczenie materialu smile.gif Przysiade do tego jeszcze raz po chwili odpoczynku a jak mi nie pojdzie to jeszcze troche pomarudze smile.gif

Witajcie ponownie smile.gif

No wiec tak:
platnosc idealnie idzie do payu smile.gif jak jest zle to wraca mi na strone np. blad.php a jak jest ok to na ok.php i wyswietla komunikat ze alles jest dobrze. no i teraz mam trzecia podstrone "raport". obojetnie gdzie bym nie wrzycil var_dump($_POST) w celu sprawdzenia co przychodzi z payu - nic sie nie dzieje - wyswietla array(0). czy jest to powodem ze dzialam na sandboxie z platnoscia testowa? uzylem skryptu to sprawdzania stanu platnosci tego ktory jest na stronie payu - oczywiscie modyfikujac i dostosowujac pod swoj skrypt i wlasnie tez nei wiem czy on ma byc w podstronie z raportem czy tam gdzie jest ok? doczytalem sie w innym poscie ze wlasnie podstrona raport to serce integracji wiec wydaje mi sie ze skrypt powinien byc tam - nie zmienia to jednak faktu ze i tak var dump wypluwa ze payu nie przesyla zadnych danych.

Prosze o jakies wskazowki i z gory dzieki smile.gif
wujek2009
Zgadza się. Podstrona raportu to serce integracji - tam PayU wysyła dane metodą $_POST (dane, odnośnie które zamówienie zostało opłacone, gdzie płatność została autoryzowana, itd). To działa na takiej zasadzie:

1) TWÓJ SERWIS: KLIENT -> PAYU -> (................) -> OPERACJA (SUKCES LUB ERROR)
2) SERWIS PAYU: Payu łączy się z raportem - żadnej klient, żadnej administrator nie widzi tego ruchu, PayU samo wybiera czas kiedy się połączy i poinformuje o dokładnym statusie płatności (identyfikator płatności, jakie zamówienia, itd)

Ad1) *(................) - w tym miejscu PayU weryfikuje PODSTAWOWE dane (np. imię, nazwisko, sig, itd)
Ad2) I teraz drugi punkt to odpowiedź na Twoje pytanie związane z pustą tablicą array. Oczywiście, że gdy wejdziesz na podstronę: raport.php i wyświetlisz var_dump($_POST) to dostaniesz pustą tablice - bo Ty łączysz się jako KLIENT, zwykły "zjadacz chleba" - raport.php (podstrona raportu) to podstrona dla PayU to ONA się łączy z tą podstronę nie Ty.
To PayU wysyła dane $_POSTem, nie Ty.

Więc jakbyśmy mieli się uprzeć to tylko jeśli PayU wejdzie na stronę raport.php i będzie tam kod var_dump($_POST) to tylko PayU zobaczy zawartość tablicy, nie Ty.
Jeśli chcesz wiedzieć jakie dane przychodzą (co jest pokazane w dokumentacji, chyba nawet podałem Ci paragraf który) to zrób coś na zasadzie:
Cytat
zrobić zapis tego $_POSTa do pliku czy bazy i później sobie go przejrzeć.


czyli otwórz sobie raport.php i zrób w nim zapis w stylu:

  1. if ( count($_POST) )
  2. {
  3. $string = NULL;
  4.  
  5. foreach ( $_POST as $k => $v )
  6. {
  7. $string .= 'Klucz: '. $k .' wartosc: '. $v .'<br />';
  8. }
  9.  
  10.  
  11. mysql_query('insert into raporttabela .....); // insertujemy do bazy dane z posta
  12. }
MotuH
O kurcze smile.gif Super podpowiedz! Dzieki wujek smile.gif teraz wszystko jest jasne. a ja juz myslalem ze ja cos zle robie... zrobie jak napisales i zobacze co z tego wyjdzie smile.gif

ps. Sprawdziłem smile.gif Działa biggrin.gif Przekazuje dane smile.gif Jeszcze raz podziekował smile.gif

Hello ponownie smile.gif

Jeszcze jedno i (chyba) juz ostatnie pytanie smile.gif

Apropo:

/* TODO: zmiana statusu transakcji w systemie Sklepu */

/* przykladowo:
if ( $result['code'] == '99' ) {
if ( rozliczamy_zamowienie_srodki_wplynely ) {
// udalo sie zapisac dane wiec odsylamy OK
echo "OK";
exit;
}
} else if ( $result['code'] == '2' ) {
// transakcja anulowana mozemy również anulować zamowienie
} else {
// inne akcje
}
*/

// jezeli wszytskie operacje wykonane poprawnie wiec odsylamy ok
// w innym przypadku należy wygenerować błąd
// if ( wszystko_ok ) {
echo "OK";
exit;
// } else {
//
// }

wystarczy ze zrobie cos takiego?
if ( $result['code'] == '99' ) { echo 'OK'; exit; }

+ ewentualnie zmiana w bazie danych statusu zamowienia z 0 na 1?

?

Nie jest to sklep wiec teoretycznie zadne inne komunikaty mnie nie interesuja.

Zasada bedzie taka ze jezeli sie komus cos spodoba - placi przez pay u. wtedy jego dane zapisuja sie w bazie. i jezeli platnosc bedzie odebrana to status w bazie 1 w przeciwnym wypadku 0.

Dobrze mysle o rozwiazaniu?


Puk puk smile.gif Pomoże ktoś?smile.gif
wujek2009
Nie do końca - PayU ma kilka statusów (płatność zaakceptowana, płatność w toku, płatność anulowana, płatność odrzucona i tam jeszcze kilka). Więc ograniczenie tego do "0" i "1" to dość uproszczone informacje - najgorzej będzie jeśli płatność się z jakiegoś powodu nie uda, a Ty nigdzie nie zapiszesz sobie ID statusu i nie będziesz miał w panelu informacji o błędzie. Ja to zrobiłem w stylu (plik/kontroler raportu, czyli podstrona dla PayU):

  1. (...)
  2.  
  3. // definicja możliwych statusów
  4. $pending = array(1,4,5); // 1-nowa, 4-rozpoczęta, 5-oczekuje na odbiór
  5. $success = array(99); // płatność zaakceptowana
  6. $fail = array(2,3,7,888); // 2-anulowana, 3-odrzucona, 7-płatność odrzucona, 888-bledny status, prosimy o kontakt
  7.  
  8. // status płatności - odbieramy z $_POSTA co PayU wysyła nam
  9. $status = (..);
  10.  
  11. if (in_array($status, $pending))
  12. {
  13.  
  14. // platnosc w toku.. - tj: statusty: 1, 4, 5
  15.  
  16. // aktializuje status płatności w tabeli zamówień:
  17. else if (in_array($status, $success))
  18. {
  19. // platnosc sie udała, czyli status == 99
  20.  
  21. // aktualizuje status płatności, że opłacone, itp.
  22. }
  23. else if (in_array($status, $fail))
  24. {
  25. // platnosc sie nie powiodla, lub zostala anulowana, itp.
  26. // ponownie aktuializacja statusu w bazie danych
  27. }
  28.  
  29. (...)
  30.  
  31. // output dla PayU
  32. exit('OK');
Pyton_000
Na potrzeby małej aplikacji można to znacząco uprościć. Wszelkie informacje są zapisane w panelu PayU a dodatkowo jak PayU nie dostanie odpowiedzi to zdaje się że przysyłają zbiorczy raport pod koniec dnia.
MotuH
Dziekuje za pomoc smile.gif Mam nadzieje ze teraz juz wiem wszystko co potrzebowalem aby aplikacja dzialala smile.gif

Hej ponownie smile.gif

Ponownie zabralem sie za platnosci... i niby wszystko jest ok. Wg tego jak koledzy wyzej pisali - otrzymuje postem info co i jak. natomiast w transakcjach w payu nie widnieje zadna transakcja testowa. Czy tak tam jest? Czy jezeli przeprowadzam testy to mimo wszystko powinna ona tam widniec?
phpion
Powinna być widoczna. Z tego co pamiętam przy liście transakcji trzeba jasno w filtrze określić, że ma pokazywać również transakcje testowe. Domyślnie są ukryte.
MotuH
Ehh lame smile.gif Zadalem pytanie i pozniej wlasnie tez to zauwazylem... Przepraszam za smietnik smile.gif A teraz pytanie kolejne...

Wszystko przebiega zgodnie z planem. Transakcja pojawia sie jako zaakceptowana. Wiec domniemam ze payu zwraca do skryptu iz platnosc ma status 99. wiec teraz ifem robie ze jezeli platnosc == 99 to zmien flage w bazie z 0 na 1 (czyli ze transakcja zrealizowana), tak?smile.gif

Hmm... dochodze do momentu kiedy juz aplikacja laczy sie z payu do potwierdzenia statusu platnosci... lacze sie przez fsockopen i otrzymuje cos takiego:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<status>ERROR</status>
<error>
<nr>101</nr>
<message>Kod błędu: 101</message>
</error>
</response>HTTP/1.1 200 OK
Server: nginx
Date: Mon, 09 Dec 2013 15:21:11 GMT
Content-Type: text/xml;charset=UTF-8
Content-Length: 164
Connection: close


opieram sie na tym: http://www.payu.pl/pliki/raport.phps.html

gdzie jest blad?sad.gif
sazian
w dokumentacji masz tabelę z kodami błędów (punkt 2.1)
101 - brak parametru session_id
MotuH
sazian sprawdzalem. wszystko kurcze jest... nie wiem o co biega. ale jeszcze raz przeanalizuje caly kod i jak juz naprawde skoncza mi sie wszelkie pomysly to wrzuce tu kod i poprosze o sprawdzenie :/
Damonsson
Zadzwoń do PayU, mają naprawdę świetny support i pomagają ze wszystkim, szkoda Twojego i naszego czasu na zgadywanie.
phpion
Cytat(MotuH @ 9.12.2013, 16:24:20 ) *
Hmm... dochodze do momentu kiedy juz aplikacja laczy sie z payu do potwierdzenia statusu platnosci... lacze sie przez fsockopen i otrzymuje cos takiego:

PayU samoczynnie przesyła informację na temat płatności na podany przez Ciebie adres (podajesz go w konfiguracji płatności). Tam otrzymujesz tablicę $_POST z wszystkimi istotnymi informacjami. Sam nie musisz komunikować się z PayU, a jedynie "nasłuchiwać" odpowiedzi z ich strony.
MotuH
Hej smile.gif Poradzilem sobie. Przeanalizowalem kod i znalazlem blad smile.gif Wszystko dziala.

A powiedzcie mi... bo chce zrobic teraz taki myk... ze bede przesylal dane z formularza przez fsockopen lub curla... kod wyglada tak:

  1. if ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://' . URL, 443, $errno, $errstr, 30)))
  2. $fsocket = true;
  3. else if (function_exists('curl_exec'))
  4. $curl = true;
  5.  
  6. $response = '';
  7.  
  8. if ($fsocket == true) {
  9.  
  10. $parameters = 'payform=1&first_name=' . $name . '&last_name=' . $surname . '&street=' . $street . '&street_hn=' . $home . '&street_an=' . $apartment . '&post_code=' . $postal_code . '&city=' . $city . '&email=' . $email . '&phone=' . $phone . '&order_id=' . $order_id . '&pos_id=' . POS_ID . '&pos_auth_key=' . POS_AUTH_KEY . '&session_id=' . $session_id . '&amount=' . $amount . '&desc=' . $desc . '&desc2=' . $desc2 . '&client_ip=' . $client_ip . '&ts=' . $ts . '&sig=' . $sig . '&pay_type=' . $type . '&js=0';
  11.  
  12. $header = 'POST /' . PAYMENT_NEW . ' HTTP/1.0' . "\r\n" . 'Host:' . URL . "\r\n" . 'Content-Type: application/x-www-form-urlencoded'."\r\n" . 'Content-Length: ' . strlen($parameters) . "\r\n" . 'Connection: close' . "\r\n\r\n";
  13.  
  14. @fputs($fp, $header . $parameters);
  15.  
  16. while (!@feof($fp)) {
  17.  
  18. $res = @fgets($fp, 1024);
  19. $response .= $res;
  20.  
  21. }
  22.  
  23. @fclose($fp);


Nic mi sie jednak nie wyswietla... a powinno laczyc ze strona payu prawda? Czy to dziala w tle?

Sorry smile.gif Okazuje sie ze strona payu wczytuje sie na ekranie... nie ma mozliwosci zeby od razu przenioslo do strony payu a nie sciagalo ja tak jakby do wnetrza mojej podstrony?
Pyton_000
Nie, musisz przejść na stronę PayU.

PS. PayU ma bardzo ładną bibliotekę pod OAuth2
MotuH
Okej. dzieki smile.gif

A jezeli chodzi o podsumowanie platnosci to czy dobrze jest to zrobic tak:

Wypelniam formularz po czym przenosi mnie do nastepnyj podstrony, gdzie pokazuje formularz z zablokowanymi polami i dodaje np usera do bazy danych. klikam "zaplac" i przenosi mnie do platnosci? Tylko z drugiej strony... user zostanie dodany nawet w momencie kiedy nie oplaci uslugi. Macie pomysl jak to rozwiazac?
Pyton_000
Teoretycznie nie powinno to cię martwić.
Możesz dodatkowo co jakiś czas sprawdzać (jakaś flaga że użytkownik pochodzi z PU) i czyścić ich, choć nie widzę sensu i zasadności smile.gif
MotuH
Z ta flaga nieglupi pomysl smile.gif w panelu admina beda widoczni tylko ci userzy ktorzy maja flage przyznana od payu a reszta nie... ustawie na cronie ze co jakis czas ci userzy beda usuwani.

Zrobilem teraz tabele na emaile (gdyz kazdy user ma unikalny) osobno i lacze ja z tabela "uzytkownicy" gdzie jest imie, nazwisko itp. dobrze tak bedzie?smile.gif
Pyton_000
Jeżeli dodatkowe dane będą w relacji 1:1 to nie ma sensu. Po prostu ustawiasz klucz Unique na email i po sprawie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.