Cześć! W związku tym, że bardzo często spotykam na forach pytania jak zintegrować swoją stronę WWW z systemem płatności Przelewy24.pl, postanowiłem napisać kilka tygodni temu prostą klasę do tego celu i sposób jej wykorzystania. Na początek tworzymy sobie plik, np. Przelewy24_API.php, a do niego wklejamy: PHP: <?php define('PRZELEWY24_MERCHANT_ID', 'Twój nr sprzedawcy'); define('PRZELEWY24_CRC', 'Twój kod CRC'); // sandbox - środowisko testowe, secure - środowisko produkcyjne define('PRZELEWY24_TYPE', 'sandbox'); class Przelewy24_API { public function CreateToken($p24_amount = null, $p24_description = null, $p24_email = null, $p24_url_return = null, $p24_url_status = null) { $p24_session_id = uniqid(); $headers[] = 'p24_merchant_id=' . PRZELEWY24_MERCHANT_ID; $headers[] = 'p24_pos_id=' . PRZELEWY24_MERCHANT_ID; $headers[] = 'p24_crc=' . PRZELEWY24_CRC; $headers[] = 'p24_session_id=' . $p24_session_id; $headers[] = 'p24_amount=' . $p24_amount; $headers[] = 'p24_currency=PLN'; $headers[] = 'p24_description=' . $p24_description; $headers[] = 'p24_country=PL'; $headers[] = 'p24_url_return=' . urlencode($p24_url_return); $headers[] = 'p24_url_status=' . urlencode($p24_url_status); $headers[] = 'p24_api_version=3.2'; $headers[] = 'p24_sign=' . md5($p24_session_id . '|' . PRZELEWY24_MERCHANT_ID . '|' . $p24_amount . '|PLN|' . PRZELEWY24_CRC); $headers[] = 'p24_email=' . $p24_email; $oCURL = curl_init(); curl_setopt($oCURL, CURLOPT_POST, 1); curl_setopt($oCURL, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); curl_setopt($oCURL, CURLOPT_POSTFIELDS, implode('&', $headers)); curl_setopt($oCURL, CURLOPT_URL, 'https://' . PRZELEWY24_TYPE . '.przelewy24.pl/trnRegister'); curl_setopt($oCURL, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($oCURL, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($oCURL, CURLOPT_RETURNTRANSFER, 1); curl_setopt($oCURL, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($oCURL); curl_close($oCURL); parse_str($response, $output); return isset($output['token']) ? $output['token'] : 0; } public function Pay($p24_amount = null, $p24_description = null, $p24_email = null, $p24_url_return = null, $p24_url_status = null) { $token = $this->CreateToken($p24_amount, $p24_description, $p24_email, $p24_url_return, $p24_url_status); return 'https://' . PRZELEWY24_TYPE . '.przelewy24.pl/trnRequest/' . $token; } public function Verify($data = null) { $headers[] = 'p24_merchant_id=' . $data['p24_merchant_id']; $headers[] = 'p24_pos_id=' . $data['p24_pos_id']; $headers[] = 'p24_session_id=' . $data['p24_session_id']; $headers[] = 'p24_amount=' . $data['p24_amount']; $headers[] = 'p24_currency=PLN'; $headers[] = 'p24_order_id=' . $data['p24_order_id']; $headers[] = 'p24_sign=' . md5($data['p24_session_id'] . '|' . $data['p24_order_id'] . '|' . $data['p24_amount'] . '|PLN|' . PRZELEWY24_CRC); $oCURL = curl_init(); curl_setopt($oCURL, CURLOPT_POST, 1); curl_setopt($oCURL, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); curl_setopt($oCURL, CURLOPT_POSTFIELDS, implode('&', $headers)); curl_setopt($oCURL, CURLOPT_URL, 'https://' . PRZELEWY24_TYPE . '.przelewy24.pl/trnVerify'); curl_setopt($oCURL, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($oCURL, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($oCURL, CURLOPT_RETURNTRANSFER, 1); curl_setopt($oCURL, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($oCURL); curl_close($oCURL); parse_str($response, $output); return ($output['error'] == '0') ? true : false; } } A jak to wykorzystać? Bardzo prosto. Tworzymy sobie plik np. payments.php i wklejamy do niego: PHP: <?php ob_start(); include_once('Przelewy24_API.php'); $oPrzelewy24_API = new Przelewy24_API(); if (isset($_POST['p24_merchant_id']) AND isset($_POST['p24_sign'])) { if ($oPrzelewy24_API->Verify($_POST) === true) { // Tutaj dokonujemy aktywacji usługi, która jest opłacana } } else { // Powrotny adres URL $p24_url_return = 'http://twoja-strona.com/payments.php'; // Adres dla weryfikacji płatności $p24_url_status = 'http://twoja-strona.com/payments.php'; // Kwota do zapłaty musi być pomnożona razy 100. // Czyli, jeżeli użytkownik ma zapłacić 499 złotych, to kwota do zapłaty // to 499 * 100 (wyrażona w groszach) $redirect = $oPrzelewy24_API->Pay('Tutaj wstaw kwotę do zapłaty', 'Tutaj wstaw tytuł płatności', 'Tutaj adres e-mail osoby płacącej', $p24_url_return, $p24_url_status); Header('Location: ' . $redirect); exit; } I to tyle. W razie pytań - proszę śmiało Za kilka dni kolejne klasy. Do integracji z Google, Live i FB Pozdrawiam, Rafał PS Nie, nie jestem w żaden sposób powiązany z Przelewy24, po prostu "używam ich" w moich serwisach
@TheL, dostajemy odpowiedź na "p24_url_status" w ogóle o statusie. Możesz sobie zajrzeć do ich dokumentacji, żeby się zapoznać z każdą "zwrotką" Dodatkowo w powyższej klasie możemy sobie oczywiście zamienić: PHP: if ($oPrzelewy24_API->Verify($_POST) === true) { // Tutaj dokonujemy aktywacji usługi, która jest opłacana} na: PHP: if ($oPrzelewy24_API->Verify($_POST) === true) { // Tutaj dokonujemy aktywacji usługi, która jest opłacana} else { // Informacja o problemach w transakcji}
i to jest ważna informacja, klasę warto rozwinąć o obsługę zdarzeń właśnie ze względu na dziwadła jakie wychodzą przy płatności kiedyś widziałem przykład w którym wystarczyło przejść do etapu płatności, nacisnąć anuluj, a system zwracał komunikat o poprawnej płatności - zakupy za darmo
Klasę można rozbudować jeszcze o wiele rzeczy, oczywiście. Ja podałem tylko prosty przykład W powyższej akurat nie ma możliwości "oszukania", bo po "zwrotce" od Przelewy24, jest dokonywana pełna weryfikacja z wysłaniem zapytania o statusie. Trzeba sobie tylko co jakiś czas weryfikować to, co Przelewy24 zwracają (w sensie, czy nie zmienili API), bo ich dział techniczny ma czasami tendencję do zmiany zwracanych treści i ich formatów, a niekoniecznie informują o tym i później dzieją się "cuda".
Oczywiście masz rację, ale warto o tym wspomnieć, aby ktoś się nie zdziwił w nieprzewidzianej sytuacji
Tak w ogóle, to Przelewy24 powinny mieć unikalny adres do każdego api, w stylu: sandbox.przelewy24.pl/TUTAJ_NR_WERSJI/trnRegister, wtedy znikają problemy ze zmianami, które znienacka wprowadzają ich developerzy. Ale cóż... marzenia ;-)
Witam Mam pewien problem z wykorzystaniem tego kodu. Mianowicie chciałem żeby po udanej weryfikacji zapisywał mi jej status w sesji. Code: <?php ob_start(); session_start(); include_once('przelewy24.php'); $oPrzelewy24_API = new Przelewy24_API(); if (isset($_POST['p24_merchant_id']) AND isset($_POST['p24_sign'])) { if ($oPrzelewy24_API->Verify($_POST) === true) { // Tutaj dokonujemy aktywacji usługi, która jest opłacana $_SESSION['pay_status'] = 'ok'; } } else { // Powrotny adres URL Na stronie przelewy24 odnotowuje że transakcja została potwierdzona. Jednak zmienna jest pusta.