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="//showroom.billongroup.com/lib/js/billon.js"></script> <script src="//showroom.billongroup.com/lib/js/billon-agent.js"></script> <script src="//showroom.billongroup.com/lib/js/billon-object.js"></script> <script src="//showroom.billongroup.com/lib/js/billon-user.js"></script> <script src="//showroom.billongroup.com/lib/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://showroom.billongroup.com/lib/screen/plate-button/index.html", // w przypadku problemów z niepokazywaniem przycisków, w przypadku braku problemów pominąć plateDialogAddress: "https://showroom.billongroup.com/lib/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>