1. Forum używa plików Cookies. Dowiedz się więcej o celu ich używania i możliwości zmiany ustawień Cookies w przeglądarce. Czytaj więcej...

[PHP] Integracja z Przelewy24.pl

Dyskusja w 'Kursy i poradniki - twórczość własna' rozpoczęta przez użytkownika antyhelion, 29 Listopad 2015.

  1. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    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($oCURLCURLOPT_POST1);
                
    curl_setopt($oCURLCURLOPT_SSL_CIPHER_LIST'TLSv1');
                
    curl_setopt($oCURLCURLOPT_POSTFIELDSimplode('&'$headers));
                
    curl_setopt($oCURLCURLOPT_URL'https://' PRZELEWY24_TYPE '.przelewy24.pl/trnRegister');
                
    curl_setopt($oCURLCURLOPT_SSL_VERIFYHOST2);
                
    curl_setopt($oCURLCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
                
    curl_setopt($oCURLCURLOPT_RETURNTRANSFER1);
                
    curl_setopt($oCURLCURLOPT_SSL_VERIFYPEERfalse);
                
    $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($oCURLCURLOPT_POST1);
                
    curl_setopt($oCURLCURLOPT_SSL_CIPHER_LIST'TLSv1');
                
    curl_setopt($oCURLCURLOPT_POSTFIELDSimplode('&'$headers));
                
    curl_setopt($oCURLCURLOPT_URL'https://' PRZELEWY24_TYPE '.przelewy24.pl/trnVerify');
                
    curl_setopt($oCURLCURLOPT_SSL_VERIFYHOST2);
                
    curl_setopt($oCURLCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
                
    curl_setopt($oCURLCURLOPT_RETURNTRANSFER1);
                
    curl_setopt($oCURLCURLOPT_SSL_VERIFYPEERfalse);
                
    $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 :)
     
    Ostatnia modyfikacja: 29 Listopad 2015
    TheL, Mariusz, jakubgalinski oraz 1 dodatkowa osoba lubi tego posta.
  2. TheL

    TheL @Lider VIP Moderator forum

    Wiadomości:
    2 293
    Docenione treści:
    495
    Czy dobrze rozumiem, że dostajemy od przelewy24 odpowiedź o poprawnej operacji?
     
  3. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    @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
    }
     
    Mariusz lubi to.
  4. TheL

    TheL @Lider VIP Moderator forum

    Wiadomości:
    2 293
    Docenione treści:
    495
    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 :)
     
  5. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    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".
     
    TheL lubi to.
  6. TheL

    TheL @Lider VIP Moderator forum

    Wiadomości:
    2 293
    Docenione treści:
    495
    Oczywiście masz rację, ale warto o tym wspomnieć, aby ktoś się nie zdziwił w nieprzewidzianej sytuacji :)
     
    antyhelion lubi to.
  7. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    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 ;-)
     
  8. Mati

    Mati Nowy użytkownik

    Wiadomości:
    1
    Docenione treści:
    0
    Witam

    Mam pewien problem z wykorzystaniem tego kodu.
    Mianowicie chciałem żeby po udanej weryfikacji zapisywał mi jej status w sesji.

    Kod:
    <?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.
     

Poleć forum znajomym