Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Platnosci.pl i dotacje
Forum PHP.pl > Forum > Przedszkole
Piegus
Witajcie. Mma problem z systemem platnosci.pl. Poproszono mnie bym zaimplementował system dotacji z serwisu platnosci.pl. Poszperałem w googlach znalazłem skrypt. Przerobiłem go ale dalej nie odsyła seriwsowi płatnosci statusu OK.
  1. <?php
  2.  
  3. $server = 'www.platnosci.pl';
  4. $gateway = '/paygw/UTF/Payment/get/txt';
  5.  
  6.  
  7. if(!isset($_POST['pos_id']) || !isset($_POST['session_id']) || !isset($_POST['ts']) || !isset($_POST['sig'])) {
  8. die('ERROR: EMPTY PARAMETERS'); //-- brak wszystkich parametrow
  9. }
  10. if ($_POST['pos_id'] != **********************);)){
  11. die('ERROR: WRONG POS ID'); //--- bledny numer POS
  12. }
  13.  
  14. $sig = md5( $_POST['pos_id'] . $_POST['session_id'] . $_POST['ts'] . **********************);
  15.  
  16. if ($_POST['sig'] != $sig){
  17. die('ERROR: WRONG SIGNATURE'); //--- bledny podpis
  18. }
  19.  
  20. $ts = time();
  21. $sig = md5( **********************);. $_POST['session_id'] . $ts . **********************);));
  22. $params = "pos_id=" . **********************);. "&session_id=" . $_POST['session_id'] . "&ts=" . $ts . "&sig=" . $sig;
  23.  
  24. $header = 'POST '.$gateway.' HTTP/1.0'."\r\n" .
  25. 'Host: '.$server."\r\n".
  26. 'Content-Type: application/x-www-form-urlencoded'."\r\n".
  27. 'Content-Length: '.strlen($params)."\r\n".
  28. 'Connection: close'."\r\n\r\n";
  29.  
  30. if ($fd = @fsockopen('ssl://' . $server, 443, $errno, $errstr, 30))
  31. {
  32. fputs($fd, $header.$params);
  33. $verified = false;
  34. $read = '';
  35. while (!feof($fd))
  36. { $line = fgets($fd, 1024);
  37. if (substr($line,0,6)=="trans_"){
  38. $pair = explode(":",$line);
  39. $response[$pair[0]] = trim($pair[1]);
  40. }
  41. $read .= $line;
  42. }
  43. fclose ($fd);
  44. $result = $platnoscipl->get_status($response);
  45. if ($result['code']&&(intval($result['code'])!=0)){
  46. switch (intval($result['code'])) {
  47. case 1: // Nowa
  48. echo "Nowa";
  49. break;
  50. case 2: // Anulowana
  51. echo "Anulowana";
  52. break;
  53. case 3: // Odrzucona
  54. echo "Odrzucona";
  55. break;
  56. case 5: // Oczekuje na odbiór
  57. echo "Oczekuje na odbiór";
  58. break;
  59. case 7: // Odrzucona
  60. echo "Odrzucona";
  61. break;
  62. case 99: // Odebrana, zakonczona
  63. echo "Odebrana, zakonczona";
  64. break;
  65. case 888: // Błędny status
  66. echo "Błędny status";
  67. break;
  68. default:
  69. die('OK');
  70. }
  71.  
  72. }
  73. echo 'OK';
  74. if (!empty($errors))
  75. die('ERROR: PROBLEMS WITH PROCESSING PAYMENT: '.$errors);
  76. }else
  77. die('ERROR: COULD NOT GET PAYMENT STATUS'); //--- nie udalo sie polaczenie z platnosci.pl
  78. ?>

Nie wiem w czym jest problem. Cyz ktos moze pomóc?
Skrypt ten znalazłem na jednej stronie i przerobiłem... Choc najwidoczniej nie działa
wewior
Dobrze że się zorientowałeś z tymi kluczami, bo miałem Ci pisać że tego nie powinieneś publikować.
Rozumiem że teraz chcesz zrobić skrypt pobierający status transakcji tak? Tzn płatności Ci przechodzą ale to jest skrypt dla raportów? Bo trochę to zamieszane masz.
Najlepiej pobierz sobie pdf ze strony platnosci.pl lub popatrz na ich przykłady dla osCommerce.
Piegus
formularz jest juz ustawiony. jako session_id w tym formularzu mam js który pobiera datę: document.payform.session_id.value=data.toLocaleString();

Problem polega na tym że gdy platnoscipl przesylaja mi dane metoda post powinienem je odebrac i odpowiedziec na to OK.
Lecz skrypty które modyfikowałem nie robiły tego.
Wywyniskowałem to z tego ze platnosci polaczaja sie za kazdym razem do skryptu ( W access logu to mam)

Znalazłem tez taki skrypt obsłuygujący wysłanie statusy pzrezz platnosci.
Ale po jego kongiguracji tez nie działa mi to...
http://serwis.platnosci.pl/pliki/raport.phps.html
  1. <?php
  2. $server = 'www.platnosci.pl';
  3. $server_script = '/paygw/ISO/Payment/get';
  4. define(PLATNOSCI_POS_ID, 123);
  5. define(PLATNOSCI_KEY1, "1234567890123456");
  6. define(PLATNOSCI_KEY2, "9123456789012345");
  7.  
  8. function get_status($parts){
  9. if ($parts[1] != PLATNOSCI_POS_ID) return array('code' => false,'message' => 'błędny numer POS'); //--- bledny numer POS
  10. $sig = md5($parts[1].$parts[2].$parts[3].$parts[5].$parts[4].$parts[6].$parts[7].PLATNOSCI_KEY2);
  11. if ($parts[8] != $sig) return array('code' => false,'message' => 'błędny podpis'); //--- bledny podpis
  12. switch ($parts[5]) {
  13. case 1: return array('code' => $parts[5], 'message' => 'nowa'); break;
  14. case 2: return array('code' => $parts[5], 'message' => 'anulowana'); break;
  15. case 3: return array('code' => $parts[5], 'message' => 'odrzucona'); break;
  16. case 4: return array('code' => $parts[5], 'message' => 'rozpoczęta'); break;
  17. case 5: return array('code' => $parts[5], 'message' => 'oczekuje na odbiór'); break;
  18. case 6: return array('code' => $parts[5], 'message' => 'autoryzacja odmowna'); break;
  19. case 7: return array('code' => $parts[5], 'message' => 'płatność odrzucona'); break;
  20. case 99: return array('code' => $parts[5], 'message' => 'płatność odebrana - zakończona'); break;
  21. case 888: return array('code' => $parts[5], 'message' => 'błędny status'); break;
  22. default: return array('code' => false, 'message' => 'brak statusu'); break;
  23. }
  24. }
  25.  
  26.  
  27. if(!isset($_POST['pos_id']) || !isset($_POST['session_id']) || !isset($_POST['ts']) || !isset($_POST['sig'])) die('ERROR: EMPTY PARAMETERS'); //-- brak wszystkich parametrow
  28.  
  29. if ($_POST['pos_id'] != PLATNOSCI_POS_ID) die('ERROR: WRONG POS ID'); //--- błędny numer POS
  30.  
  31. $sig = md5( $_POST['pos_id'] . $_POST['session_id'] . $_POST['ts'] . PLATNOSCI_KEY2);
  32. if ($_POST['sig'] != $sig) die('ERROR: WRONG SIGNATURE'); //--- błędny podpis
  33.  
  34. $ts = time();
  35. $sig = md5( PLATNOSCI_POS_ID . $_POST['session_id'] . $ts . PLATNOSCI_KEY1);
  36. $parameters = "pos_id=" . PLATNOSCI_POS_ID . "&session_id=" . $_POST['session_id'] . "&ts=" . $ts . "&sig=" . $sig;
  37.  
  38. $fsocket = false;
  39. $curl = false;
  40. $result = false;
  41.  
  42. if ( (PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://' . $server, 443, $errno, $errstr, 30)) ) {
  43. $fsocket = true;
  44. } elseif (function_exists('curl_exec')) {
  45. $curl = true;
  46. }
  47.  
  48. if ($fsocket == true) {
  49. $header = 'POST ' . $server_script . ' HTTP/1.0' . "\r\n" .
  50. 'Host: ' . $server . "\r\n" .
  51. 'Content-Type: application/x-www-form-urlencoded' . "\r\n" .
  52. 'Content-Length: ' . strlen($parameters) . "\r\n" .
  53. 'Connection: close' . "\r\n\r\n";
  54. @fputs($fp, $header . $parameters);
  55. $platnosci_response = '';
  56. while (!@feof($fp)) {
  57. $res = @fgets($fp, 1024);
  58. $platnosci_response .= $res;
  59. }
  60. @fclose($fp);
  61.  
  62. } elseif ($curl == true) {
  63. $ch = curl_init();
  64. curl_setopt($ch, CURLOPT_URL, "https://" . $server . $server_script);
  65. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  66. curl_setopt($ch, CURLOPT_HEADER, 0);
  67. curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  68. curl_setopt($ch, CURLOPT_POST, 1);
  69. curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
  70. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  71. $platnosci_response = curl_exec($ch);
  72. curl_close($ch);
  73. } else {
  74. die("ERROR: No connect method ...\n");
  75. }
  76.  
  77.  
  78. if (eregi("<trans>.*<pos_id>([0-9]*)</pos_id>.*<session_id>(.*)</session_id>.*<order_id>(.*)</order_id>.*<amount>([0-9]*)</amount>.*<status>([0-9]*)</status>.*<desc>(.*)</desc>.*<ts>([0-9]*)</ts>.*<sig>([a-z0-9]*)</sig>.*</trans>", $platnosci_response, $parts)) $result = get_status($parts);
  79. if ( $result['code'] ) { //--- rozpoznany status transakcji
  80.  
  81. $pos_id = $parts[1];
  82. $session_id = $parts[2];
  83. $order_id = $parts[3];
  84. $amount = $parts[4]; //-- w groszach
  85. $status = $parts[5];
  86. $desc = $parts[6];
  87. $ts = $parts[7];
  88. $sig = $parts[8];
  89. /* TODO: zmiana statusu transakcji w systemie Sklepu */
  90.  
  91. /* przykladowo:
  92.   if ( $result['code'] == '99' ) {
  93.   if ( rozliczamy_zamowienie_srodki_wplynely ) {
  94.   // udalo sie zapisac dane wiec odsylamy OK
  95.   echo "OK";
  96.   exit;
  97.   }
  98.   } else if ( $result['code'] == '2' ) {
  99.   // transakcja anulowana mozemy również anulować zamowienie
  100.   } else {
  101.   // inne akcje
  102.   }
  103.   */
  104.  
  105. // jezeli wszytskie operacje wykonane poprawnie wiec odsylamy ok
  106. // w innym przypadku należy wygenerować błąd
  107. // if ( wszystko_ok ) {
  108. echo "OK";
  109. // } else {
  110. //
  111. // }
  112.  
  113.  
  114. } else {
  115. /* TODO: obsługa powiadamiania o błędnych statusach transakcji*/
  116. echo "ERROR: Blad danych ....\n";
  117. echo "code=" . $result['code'] . " message=" . $result['message'] . "\n";
  118. echo $platnosci_response;
  119. // powiadomienie bedzie wysłane ponownie przez platnosci.pl
  120. // ewentualnie dodajemy sobie jakis wpis do logow ...
  121. }
  122.  
  123. ?>
wewior
Napisz proszę dokładniej co nie działą, czy wyrzuca jakieś błędy, czy brakuje którejś zmiennej w post, czy jakiś warunek się nie spełnia... Rozumiem że w panelu platnosci.pl pojawia Ci się informacja że to nie działa?
Sprobuj odesłać do skryptu który wyświetla tylko OK i sprawdź czy będzie działało, jeśli tak to wkładaj po kolei kawałki kodu.
Piegus
Jako że mam metode Portected Payment to dopiero po jednym dniu przysyła mi maila że coś jest nie tak. Z jego treści wynika że platnosci próbuja sie połączyć Jaknie otrzymaja odpowiedzi OK to będą próbować do 100 razy.
Powiadomienia są wysyłane natychmiast po zmianie statusu płatności, w przypadku gdy powiadomienie nie
zostanie odebrane przez aplikację Sklepu zostanie ono wysłane ponownie po zadanym czasie zgodnie z
poniższą tabelką:
próba opóźnienie
0 - 10 1 minuta
11 - 15 3 minuty
16 - 20 5 minut
21 - 25 10 minut
26 - 50 15 minut
51 - 75 30 minut
75 - 99 60 minut
> = 100 stop wysyłania


Jako że nie udaje mi sie wysłać odpowedzi 'OK'. System próbuje dalej się połączyć co widze u siebie w access logu.
POST /site/****.php HTTP/1.0 Status: 200 22 B - PayGW-OnLine-Robot/2.0 (http://www.platnosci.pl/)
POST /site/****.php HTTP/1.0 Status: 200 22 B - PayGW-OnLine-Robot/2.0 (http://www.platnosci.pl/)
W odstępach pokazanych wyżej. Co minuta, następnie co 5 minut itd...

Następnie dostaje maila że nie udało się:

System Platnosci.pl odnotował 100 nieodebranych powiadomień o zmianie statusu transakcji ****** dokonanej w Punkcie Płatności *******.
Kolejne powiadamianie o zmianie statusu tej transakcji nie będzie wysłane.
Przyczyną otrzymnego komunikatu jest wprowadzenie przez Państwa w Panelu Administracyjnym Platnosci.pl błędnego adresu raportów. Taka sytuacja uniemożliwia systemowi Platnosci.pl przesyłanie do Państwa raportów o zmianie statusu transakcji.

W dokumentacji pisze:
Wysłanie komunikatu o zmianie statusu transakcji nie niesie żadnej informacji, szczegóły transakcji
i jej aktualny status aplikacja Sklepu MUSI odczytać i odpowiednio przeanalizować samodzielnie za
pomocą mechanizmów opisanych w punkcie 3.7.2.

Po otrzymaniu takiego wywołania aplikacja Sklepu MUSI w odpowiedzi wysłać ciąg znaków „OK”,
w przypadku otrzymania innej odpowiedzi zostanie ona zapisana w bazie i powiadomienie będzie uznane
jako nieodebrane.


TL;DR: ZA każdym razem muszę wysłac serwisowi płatnosci odpowiedź OK.
I tyo jerst mój cel smile.gif będę wdzięczny za pomoc
wewior
Rozumiem Cię, już nie raz integrowałem platnosci.pl, jednak jak pisałem wcześniej jeśli potrzebujesz tylko odebrać połączenie od platnosci.pl to na tą chwilę wystarczy Ci kod:
  1. if(!isset($_POST['pos_id']) || !isset($_POST['session_id']) || !isset($_POST['ts']) || !isset($_POST['sig'])) {
  2. die('ERROR: EMPTY PARAMETERS'); //-- brak wszystkich parametrow
  3. }
  4. if ($_POST['pos_id'] != **********************);)){
  5. die('ERROR: WRONG POS ID'); //--- bledny numer POS
  6. }
  7.  
  8. $sig = md5( $_POST['pos_id'] . $_POST['session_id'] . $_POST['ts'] . **********************);
  9.  
  10. if ($_POST['sig'] == $sig){
  11. die('OK'); //--- bledny podpis
  12. }else{
  13. die('ERROR: WRONG SIGNATURE'); //--- bledny podpis
  14. }}

Jeśli to będzie działało wtedy w razie potrzeby możesz próbować łączyć się z platnosci.pl w celu odebrania statusu transakcji i zapisania go u siebie w systemie.
Piegus
Okazało się że skrypt zaproponowany przez platnosci.pl w pelni spelnia moje oczekiwania. i DZIAŁA!
Aczkolwiek mam pewien dylemat.
Wiem że płatnosci musza uzyskac ode mnie wiadomosci OK za każdym razem jak status transakcji jest zmieniany.
I teraz... Jak ten OK ma byc wysłany ako normalne echo na mojej stronie czy jako zmienna, czy tez jako header?questionmark.gif

Mam problem z platnosciami.
Kiedy patrze na raporty w serwisie platnosci.pl. Dostaje takie coś:
2011-08-12 12:58:21 ERROR ERROR: WRONG SIGNATURE

2011-08-12 12:57:34 ERROR ERROR: WRONG SIGNATURE

2011-08-12 12:56:34 ERROR ERROR: WRONG SIGNATURE

2011-08-12 12:56:34 ERROR ERROR: WRONG SIGNATURE


Za ten kawałek kodu odpowiada kod:
  1. $sig = md5( $_POST['pos_id'] . $_POST['session_id'] . $_POST['ts'] . PLATNOSCI_KEY2);
  2. if ($_POST['sig'] != $sig) die('ERROR: WRONG SIGNATURE'); //--- błędny podpis
  3.  

CO jest nie tak?
Przeciez wszytsko dostaje z POSTa?questionmark.gif

Ok. Poradziłem sobie. Okazało się, że jako sesje mialem date z polskimi literami. I kiedy zmienilem rodzaj session_id z daty na losowy ciag liczb to wszytsko działało.
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.