Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przelewy24 - jak weryfikować odpowiedź zwrotną
Forum PHP.pl > Forum > PHP
monetek
Witam,

Od kilku dni próbuję swoich sił z przelewami24. Kod którego używam jest poniżej. Płatność przechodzi, email dostaje o rozpoczęciu i potwierdzeniu płątności ale w kodzie nie wiem jak mogę to zweryfikować. W sensie zapisałem sobie do sesji $oPrzelewy24_API->Verify($_POST) i mam odpowiedź true. Ale jest ona zwracana niezależnie czy płatność jest potiwerdzona czy klient po prostu odrzuci ją w trakcie. Pytanie które nie daje mi spać. Jak zweryfikować wynik tak, żeby w momencie kiedy ktoś ZAPŁACIŁ ja o tym wiem i np zapisuje sobe do zmiennej sesji wynik "zapłacił" i na odwrót.

plik przelewy24.php
  1. <?php
  2.  
  3. define('PRZELEWY24_MERCHANT_ID', '69694');
  4. define('PRZELEWY24_CRC', '2ebb21475adfaf03');
  5. // sandbox - środowisko testowe, secure - środowisko produkcyjne
  6. define('PRZELEWY24_TYPE', 'sandbox');
  7.  
  8. class Przelewy24_API
  9. {
  10. public function CreateToken($p24_amount = null, $p24_description = null, $p24_email = null, $p24_url_return = null, $p24_url_status = null)
  11. {
  12. $p24_session_id = uniqid();
  13.  
  14. $headers[] = 'p24_merchant_id=' . PRZELEWY24_MERCHANT_ID;
  15. $headers[] = 'p24_pos_id=' . PRZELEWY24_MERCHANT_ID;
  16. $headers[] = 'p24_crc=' . PRZELEWY24_CRC;
  17. $headers[] = 'p24_session_id=' . $p24_session_id;
  18. $headers[] = 'p24_amount=' . $p24_amount;
  19. $headers[] = 'p24_currency=PLN';
  20. $headers[] = 'p24_description=' . $p24_description;
  21. $headers[] = 'p24_country=PL';
  22. $headers[] = 'p24_url_return=' . urlencode($p24_url_return);
  23. $headers[] = 'p24_url_status=' . urlencode($p24_url_status);
  24. $headers[] = 'p24_api_version=3.2';
  25. $headers[] = 'p24_sign=' . md5($p24_session_id . '|' . PRZELEWY24_MERCHANT_ID . '|' . $p24_amount . '|PLN|' . PRZELEWY24_CRC);
  26. $headers[] = 'p24_email=' . $p24_email;
  27.  
  28. $oCURL = curl_init();
  29. curl_setopt($oCURL, CURLOPT_POST, 1);
  30. curl_setopt($oCURL, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
  31. curl_setopt($oCURL, CURLOPT_POSTFIELDS, implode('&', $headers));
  32. curl_setopt($oCURL, CURLOPT_URL, 'https://' . PRZELEWY24_TYPE . '.przelewy24.pl/trnRegister');
  33. curl_setopt($oCURL, CURLOPT_SSL_VERIFYHOST, 2);
  34. curl_setopt($oCURL, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  35. curl_setopt($oCURL, CURLOPT_RETURNTRANSFER, 1);
  36. curl_setopt($oCURL, CURLOPT_SSL_VERIFYPEER, false);
  37. $response = curl_exec($oCURL);
  38. curl_close($oCURL);
  39.  
  40. parse_str($response, $output);
  41. return isset($output['token']) ? $output['token'] : 0;
  42. }
  43.  
  44. public function Pay($p24_amount = null, $p24_description = null, $p24_email = null, $p24_url_return = null, $p24_url_status = null)
  45. {
  46. $token = $this->CreateToken($p24_amount, $p24_description, $p24_email, $p24_url_return, $p24_url_status);
  47. return 'https://' . PRZELEWY24_TYPE . '.przelewy24.pl/trnRequest/' . $token;
  48. }
  49.  
  50. public function Verify($data = null)
  51. {
  52. $headers[] = 'p24_merchant_id=' . $data['p24_merchant_id'];
  53. $headers[] = 'p24_pos_id=' . $data['p24_pos_id'];
  54. $headers[] = 'p24_session_id=' . $data['p24_session_id'];
  55. $headers[] = 'p24_amount=' . $data['p24_amount'];
  56. $headers[] = 'p24_currency=PLN';
  57. $headers[] = 'p24_order_id=' . $data['p24_order_id'];
  58. $headers[] = 'p24_sign=' . md5($data['p24_session_id'] . '|' . $data['p24_order_id'] . '|' . $data['p24_amount'] . '|PLN|' . PRZELEWY24_CRC);
  59.  
  60. $oCURL = curl_init();
  61. curl_setopt($oCURL, CURLOPT_POST, 1);
  62. curl_setopt($oCURL, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
  63. curl_setopt($oCURL, CURLOPT_POSTFIELDS, implode('&', $headers));
  64. curl_setopt($oCURL, CURLOPT_URL, 'https://' . PRZELEWY24_TYPE . '.przelewy24.pl/trnVerify');
  65. curl_setopt($oCURL, CURLOPT_SSL_VERIFYHOST, 2);
  66. curl_setopt($oCURL, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  67. curl_setopt($oCURL, CURLOPT_RETURNTRANSFER, 1);
  68. curl_setopt($oCURL, CURLOPT_SSL_VERIFYPEER, false);
  69. $response = curl_exec($oCURL);
  70. curl_close($oCURL);
  71.  
  72. parse_str($response, $output);
  73. if ($output['error'] == 0) {
  74. $cos = 'true';
  75. }else{
  76. $cos = 'false';
  77. }
  78. return $cos;
  79. }
  80. }
  81. ?>


plik payments.php
  1. <?php
  2.  
  3. // ob_start();
  4.  
  5. include_once('przelewy24.php');
  6.  
  7. $oPrzelewy24_API = new Przelewy24_API();
  8.  
  9. // Powrotny adres URL
  10. $p24_url_return = 'http://37.28.156.151/projekty/przelewy24-test/payments.php';
  11.  
  12. // Adres dla weryfikacji płatności
  13. $p24_url_status = 'http://37.28.156.151/projekty/przelewy24-test/payments.php';
  14. $oPrzelewy24_API->Verify($_POST);
  15.  
  16. if(isset($_POST['submit'])){
  17. // Kwota do zapłaty musi być pomnożona razy 100.
  18. // Czyli, jeżeli użytkownik ma zapłacić 499 złotych, to kwota do zapłaty
  19. // to 499 * 100 (wyrażona w groszach)
  20. $redirect = $oPrzelewy24_API->Pay('45', 'platnosc', 'daniel.kozinaa@gmail.com', $p24_url_return, $p24_url_status);
  21. $_SESSION['test'] = $oPrzelewy24_API->Verify($_POST);
  22. Header('Location: ' . $redirect); exit;
  23. }
  24. ?>
  25. <form action="" method="post">
  26. <input type="submit" name="submit" value="send">
  27. </form>
  28. <?php
  29. var_dump($_SESSION['test']);
  30. ?>
trueblue
http://forum.php.pl/index.php?showtopic=258972
monetek
Niestety link nie prowadzi mnie do rozwiązania problemu. Cytuje "Wczoraj mnie oświeciło i jak zrozumiałem jak to działa" - a nie napisał jak sobie z tym poradził. Ten fragment nie działa.

  1. if (isset($_POST['p24_merchant_id']) AND isset($_POST['p24_sign'])) {
  2. if ($oPrzelewy24_API->Verify($_POST) === true) {
  3. // Tutaj dokonujemy aktywacji usługi, która jest opłacana
  4. }
  5. }


Nie wiem jak to ugryźć. Co powinienem zrobić. Po powrocie klienta na stronę chciałbym dowiedzieć się czy zapłacił czy nie.
trueblue
Po powrocie klienta na stronę nie ma informacji czy zapłacił czy nie. Możesz co najwyżej poinformować go o wstępnym powodzeniu lub nie, transakcji, ale nie o samym fakcie zaksięgowania kwoty.
leonpro778 podał w poście pod linkiem przebieg procesu zakupu. Serwis płatności wysyła powiadomienie na wskazany adres o statusie transakcji. Pod tym adresem powinieneś umieścić kod, który pokazałeś.
monetek
Po kliknięciu "Zapłać" albo "Odrzuć" system wraca na moją stronę po czym rzeczywiście mam status "true" co świadczy o jakimś wstępnym powodzeniu - masz rację. Wkleiłem w/w kod w całości i niestety mi nic nie zwrócił. Dopiero gdy usunąłem pierwszego if'a wywołałem sobie jakieś echo. Mam wrażenie jakby pierwszy if był zupełnie pusty (zmienne $_POST['p24_merchant_id'] i isset($_POST['p24_sign'])) Znam listę kroków ale nie potrafię sobie wyobrazić tego. Jak powinienem dokładnie zweryfikować czy pieniądze rzeczywiście są przyjęte czy nie (otrzymuję potwierdzenie na email żę potwierdzono płatność) ?
trueblue
Przeczytaj dokumentację P24. Nie chodzi o kod, ale przebieg procesu płatności.
LowiczakPL
Klient może zapłacić za usługę nawet za miesiąc i tylko wtedy Przelewy24 połączy się z Twoim API informując Twój system o zaksięgowaniu płatności.

Musisz po prostu stworzyć u siebie API, i dodać linki do Przelewy24

Pamiętaj tylko że Twoje API musi potwierdzić autentyczność powiadomienia, bo przecież ktoś może poznać adres API i wcisnąć Ci kit o zaksięgowaniu wpłaty a tego byś nie chciał.
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.