1. Wstęp
  2. Biblioteki dla webmasterów
  3. Płatności talerzykowe
  4. Jak podpiąć płatności talerzykowe (PHP)?

Jak podpiąć płatności talerzykowe (PHP)?

Skontaktuj się z nami, jeśli potrzebujesz moduł płatności w języku PHP do podpięcia płatności talerzykowych.

Obsługa płatności talerzykowych po stronie serwera

Do obsługi standardowych płatności moduł wymaga rozszerzenia JSON. Do obsługi płatności potrzebne będą osobne pliki lub akcje kontrolera do pobrania taryfy, inicjacji startu serii płatności, inicjacji płatności oraz jeden plik lub akcja do nasłuchu startu serii i nasłuchu płatności. Wszystkie pliki lub akcje muszą na początku włączać kolejny plik lub funkcję, która powinna importować bibliotekę Billon, tworzyć obiekt płatności i wywoływać metody konfiguracyjne:

require_once "billon/index.php"; //lokalizacja skryptu "index.php" modułu płatności Billon
$myShop = new \Billon\Payment();
$alpha = 10; // cena za najtańszy artykuł, np. 1 gr (liczba dziesiątych części grosza)
$beta = 20; // cena za drugi artykuł, np. 2 gr
$gamma = 100; // cena za trzeci artykuł, np. 10 gr
$delta = 200; // cena za czwarty artykuł, np. 20 gr
$epsilon = 1000; // cena za najdroższy artykuł, np. 1 zł
$myShop->user(function ($requestData, $cb)
{
	$cb($requestData->user);
}
)->products(function ($requestData, $cb)
{
	$cb($requestData->itemsId);
}
)->product(function ($requestData, $itemId, $cb) use ($alpha, $beta, $gamma, $delta, $epsilon)
{ // lista artykułów - produktów, ustawianie artykułu według typu talerzyka jest niezalecane w przypadku taryf składających się z mniejszej liczby talerzyków
	if ($itemId == 1)
	{
		$cb($alpha);
	}
	else if ($itemId == 2)
	{
		$cb($beta);
	}
	else if ($itemId == 3)
	{
		$cb($gamma);
	}
	else if ($itemId == 4)
	{
		$cb($delta);
	}
	else if ($itemId == 5)
	{
		$cb($epsilon);
	}
})->plates(function($requestData, $cb) use ($alpha, $beta, $gamma, $delta, $epsilon)
{ // ustawienie cen talerzyków w kolejności rosnącej, brak argumentu lub 0 usuwa talerzyk z taryfy
   $cb($alpha, $beta, $gamma, $delta, $epsilon);
})->platePayment(function($requestData, $cb)
{ // ustawienie identyfikatora serii i rodzaju talerzyka
   $cb($requestData->seriesId, $requestData->type);
}
)->currency(function ($requestData, $cb)
{
	$cb('PLN');
}
)->paymentTitle(function ($requestData, $items, $delivery, $cb) {
	$cb('Tytuł płatności');
}
)->cNode(function ($requestData, $items, $delivery, $cb) {
$cb('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1e2VyIjr7InlkIjo0MDksInNhbHQiOiJlMmZmOTUzMC1kNjgzLTExZTctYTk4ZS1iMWQ3OUIyNmHjN2EifSwiaWF0IjoxNTEyMTI0NzU5fQ.WaUHpsfkahoqiNIuoBd0OiouS1NF4-L0r8YUZcTr2yA'); // API key użytkownika serwisu "billon.me"
	//$cb(array("name" => "demo-payments", "address" => "http://138.123.200.92:24391")); // nazwa zalogowanego użytkownika, adres i port - komunikacja bezpośrednia z węzłem Corporate Node
})->maxTotalAmount(function($requestData, $cb)
{ // maksymalna suma płatności w serii wyrażona w dziesiątych częściach grosza, metoda niewymagana
   $cb(10000);
})->duration(function($requestData, $cb)
{ // czas trwania serii płatności w sekundach
   $cb(3600);
})->maxPaymentsInSeries(function($requestData, $cb)
{ // maksymalna liczba płatności w serii, metoda niewymagana
   $cb(10);
}
)->merchantBrandName(function ($requestData, $cb)
{ // ustawienie nazwy wyświetlanej w aplikacji przy akceptacji taryfy, domyślnie domena strony, na której wykonywana jest płatność
  $cb('Nazwa brandu'); 
})->onReceivedPlatePaymentSeriesStatus(function ($response)
{
  // zdarzenie odpowiedzi aplikacji 24/7 w tracie operacji akceptacji serii, metoda niewymagana
})->onAcceptedPlatePaymentSeries(function ($paymentData)
{
 // tutaj obsługa zdarzenia akceptacji serii płatności
})->onFinishedPayment(function ($items, $delivery_option, $document, $requestData) 
{ // zdarzenie pomyślnego ukończenia płatności
	file_put_contents('log.txt', serialize([$items, $delivery_option, $document, $requestData]));
}
)->onRequestSend(function ($requestName, $parameters, $requestResponse, $error)
{ // zdarzenie wysłania operacji SOAP, metoda niewymagana
});

Przykładowy plik zwracający taryfę:

<?php 
require "myShop.inc.php"; // plik z inicjacją obiektu płatności i wywołaniami metod konfiguracyjnych
$myShop->tariff();

Przykładowy plik inicjujący start serii płatności talerzykowych:

<?php 
require "myShop.inc.php"; // plik z inicjacją obiektu płatności i wywołaniami metod konfiguracyjnych
$myShop->platePaymentSeriesStart();

Przykładowy plik inicjujący płatność:

<?php 
require "myShop.inc.php"; // plik z inicjacją obiektu płatności i wywołaniami metod konfiguracyjnych
$myShop->paymentInitiation();

Przykładowy plik nasłuchu startu serii płatności talerzykowych i nasłuchu płatności:

<?php 
require "myShop.inc.php"; // plik z inicjacją obiektu płatności i wywołaniami metod konfiguracyjnych
$taskId = @json_decode(file_get_contents("php://input"))->taskId;
$myShop->paymentStatus($taskId ? $taskId : $_GET['taskId'], function($response)
{
    echo json_encode($response);
});

Podpięcie płatności talerzykowych na stronach internetowych

W celu podpięcia płatności do strony internetowej należy skorzystać ze skryptów JavaScript Billon:

<div id="button-container-1"></div>
<script src="//cdn.billon.pro/js/billon.js"></script>
<script src="//cdn.billon.pro/js/billon-agent.js"></script>
<script src="//cdn.billon.pro/js/billon-object.js"></script>
<script src="//cdn.billon.pro/js/billon-user.js"></script>
<script src="//cdn.billon.pro/js/billon-plates.js"></script>
<script>
   var loc = window.location.pathname;
   billon.plates({
      connection: new billon.agent(loc.substring(0, loc.lastIndexOf('/'))), // adres URL wskazujący na lokalizację skryptów obsługujących płatności lub adres kontrolera z akcjami obsługującymi płatność (w tym przypadku na katalog ten sam, co strona)
      lang: 'pl', // język "pl" lub "en", domyślnie "en"
      plateButtonAddress: "https://cdn.billon.pro/screen/plate-button/index.html", // w przypadku problemów z niepokazywaniem przycisków, w przypadku braku problemów pominąć
      plateDialogAddress: "https://cdn.billon.pro/screen/plate-dialog/index.html", // w przypadku problemów z niepokazywaniem okna dialogowego, w przypadku braku problemów pominąć
      skipAnotherUser: false, // opcjonalne - pominięcie kroku wyboru innego użytkownika niż wykryty, domyślnie krok nie jest pomijany
      disableButtonsTitle: false, // opcjonalne - domyślne niedodawanie tytułu (etykiety) z ceną do przycisków, domyślnie tytuły są ustawiane
      tariff: {
         address: 'list.php', // nazwa pliku lub akcji, gdzie wywoływana jest metoda "tariff"
         displayedCurrency: ' zł', // wyświetlana waluta, 
                                   // domyślnie kwoty są sformatowana według kodu ISO 4217 waluty ustawionej za pomocą serwerowego modułu płatności Billon w PHP i ustawień regionalnych użytkownika, 
                                   // jeśli nie ustawiono parametru "displayedCurrencyBefore" i gdy są wyższe lub równe 1 lub nie ustawiono parametru, 
                                   // przy ustawionym parametrze "displayCurrencyBefore" jako symbol waluty używany jest kod ISO 4217 waluty ustawionej za pomocą serwerowego modułu płatności
         displayCurrencyBefore: false, // czy wyświetlać walutę przed liczbą, 
                                       // domyślnie symbol z parametru "displayedCurrency" doklejany jest na końcu liczby
         centSign: ' gr', // symbol waluty dla setnej części podstawowej jednostki pieniężnej wyświetlany dla cen o wartości poniżej tej jednostki, 
                          // domyślnie stosowany jest symbol, jak dla wyższych cen
         displayCentSignBefore: false // czy wyświetlać symbol waluty ustawiony w parametrze "centSign" przed liczbą, domyślnie ten symbol doklejany jest na końcu liczby
      },
      series: {
         request: {
            address: 'initiation.php', // nazwa pliku lub akcji, gdzie wywoływana jest metoda "platePaymentSeriesStart"
            data: function (user) 
            {
              return {
                user: user
              };
            }
         },
         listenResponse: function (response, user)
         {
            if (response.status == "SERIES_ACCEPTED" || response.status == "TRANSFERRING" || response.status == "TRANSFERING")
            { // zapis identyfikatora serii i nazwy użytkownika Billon, w tym przypadku w Local Storage
               localStorage.setItem("seriesId", response.taskId);
	       localStorage.setItem("user", JSON.stringify(user));
            }
         }
      },
      paymentRequest: {
         address: 'payment.php', // nazwa pliku lub akcji, gdzie wywoływana jest metoda "paymentInitiation"
         data: function()
         { // odczyt zapisanego wcześniej identyfikatora serii i nazwy użytkownika Billon, w tym przypadku z Local Storage
            try
            {
               return {
                  seriesId: localStorage.getItem("seriesId"),
                  user: JSON.parse(localStorage.getItem("user"))
               };
            }
            catch (e)
            {
               return {};
            }
         }
      },
      listen: {
         address: "status.php", // nazwa pliku lub akcji, gdzie wywoływana jest metoda "paymentStatus"
         data: function (requestResponse) 
         {
           return {
             taskId: requestResponse.taskId
           };
         }
      },
      buttons: [ // tablica przycisków
      {
         place: document.getElementById('button-container-1'), // element HTML, w którym ma być umieszczony przycisk
         type: 'alpha', // można podać 0 zamiast 'alpha' - typ przycisku
         disableTitle: false, // opcjonalne - nieustawianie tytułu przycisku z ceną,
                              // domyślnie brana pod uwagę jest globalna opcja "DisableButtonsTitle"
         requestData: function(type)
         {
            return {
               type: type,
               itemsId: [1] // tablica identyfikatorów produktów
            }
         },
         listenResponse: function(response)
         { // metoda opcjonalna
            switch (response.status)
            {
               case "FINISHED_OK":
                  // zdarzenie pomyślnej zapłaty przyciskiem
                  break;
               case "FINISHED_ERR_USER_REJECTED": // brak możliwości płatności w ramach zapamiętanej serii
                  localStorage.setItem("seriesId", null);
		  localStorage.setItem("user", JSON.stringify(null));
            }
         }
      },
      {
         place: document.getElementById('button-container-2'),
         type: 'beta',
         requestData: function(type)
         {
            return {
               type: type,
               itemsId: [2]
            }
         },
         listenResponse: function(response)
         {
            switch (response.status)
            {
               case "FINISHED_OK":
                  // zdarzenie pomyślnej zapłaty przyciskiem
                  break;
               case "FINISHED_ERR_USER_REJECTED": // brak możliwości płatności w ramach zapamiętanej serii
                  localStorage.setItem("seriesId", null);
		  localStorage.setItem("user", JSON.stringify(null));
            }
         }
      },
      {
         place: document.getElementById('button-container-3'),
         type: 'gamma',
         requestData: function(type)
         {
            return {
               type: type,
               itemsId: [3]
            }
         },
         listenResponse: function(response)
         {
            switch (response.status)
            {
               case "FINISHED_OK":
                  // zdarzenie pomyślnej zapłaty przyciskiem
                  break;
               case "FINISHED_ERR_USER_REJECTED": // brak możliwości płatności w ramach zapamiętanej serii
                  localStorage.setItem("seriesId", null);
		  localStorage.setItem("user", JSON.stringify(null));
            }
         }
      },
      {
         place: document.getElementById('button-container-4'),
         type: 'delta',
         requestData: function(type)
         {
            return {
               type: type,
               itemsId: [4]
            }
         },
         listenResponse: function(response)
         {
            switch (response.status)
            {
               case "FINISHED_OK":
                  // zdarzenie pomyślnej zapłaty przyciskiem
                  break;
               case "FINISHED_ERR_USER_REJECTED": // brak możliwości płatności w ramach zapamiętanej serii
                  localStorage.setItem("seriesId", null);
		  localStorage.setItem("user", JSON.stringify(null));
            }
         }
      },
      {
         place: document.getElementById('button-container-5'),
         type: 'epsilon',
         requestData: function(type)
         {
            return {
               type: type,
               itemsId: [5]
            }
         },
         listenResponse: function(response)
         {
            switch (response.status)
            {
               case "FINISHED_OK":
                  // zdarzenie pomyślnej zapłaty przyciskiem
                  break;
               case "FINISHED_ERR_USER_REJECTED": // brak możliwości płatności w ramach zapamiętanej serii
                  localStorage.setItem("seriesId", null);
		  localStorage.setItem("user", JSON.stringify(null));
            }
         }
      }]
   });
</script>
Czy ten artykuł jest dla Ciebie pomocny? Tak Nie

Jak możemy pomóc?