1. Wstęp
  2. Biblioteki dla webmasterów
  3. Skrypty po stronie serwera WWW w PHP

Skrypty po stronie serwera WWW w PHP

Skontaktuj się z nami, jeśli potrzebujesz moduł płatności w języku PHP. Moduł wymaga PHP w wersji 5.3. Do obsługi standardowych płatności i komunikacji z serwisem „billon.me” moduł wymaga rozszerzenia JSON, a do obsługi bezpośredniej komunikacji z węzłem Corporate Node rozszerzenia SOAP. Komunikacja z serwisem „billon.me” wymaga włączonego traktowania obiektów URL jak plików lub rozszerzenia cURL. Do obsługi płatności potrzebne będą osobne pliki lub akcje kontrolera do inicjacji i nasłuchu płatności. Oba pliki lub akcje muszą na początku włączać kolejny plik lub funkcję, która powinien zaczynać się od zaimportowania biblioteki Billon oraz utworzenia obiektu płatności:

require_once "billon/index.php"; //lokalizacja skryptu "index.php" modułu płatności Billon
$myShop = new \Billon\Payment();

Następnie należy w tym pliku lub funkcji wywołać kolejno metody konfiguracyjne obiektu komponentu sklepowego, które otrzymując jako parametr „requestData” (jest to obiekt wysyłany jako zapytanie POST z przeglądarki użytkownika odwiedzającego stronę) zwrócą w callbacku do modułu Billon dane w formacie dostosowanym do węzła Corporate Node.

Metody konfiguracyjne

Metody konfiguracyjne zwracają referencję na swój obiekt. Przykład usługi zakupu produktu (płatności na produkt):

require_once "billon/index.php"; // lokalizacja skryptu "index.php" modułu płatności Billon
$myShop = new \Billon\Payment();
$myShop->user(function($requestData, $cb)
{
    $cb($requestData->user);
)->products(function ($requestData, $cb)
{
	$cb($requestData->itemsId);
}
)->product(function ($requestData, $itemId, $cb)
{
	if (itemId == 16)
        { // liczba tysięcznych części podstawowej jednostki monetarnej
                $cb(2000); // 2 zł
        }
        else if (itemId == 17) 
        {
                $cb([ // w PHP 5.3 "array(...)" zamiast "[...]"
                                "amount_gross": 1.2 // 1,2 zł
                ]);
        }
        else if ($itemId == 18) 
	{
		$cb([
				"item_id"=> "18",
				"item_name"=>  "eBook",
				"quantity"=>  1,
				"unit_type"=>  "szt",
				"unit_price_net"=> 0.24,
				"amount_net"=>  0.24,
				"amount_discount_net"=>  0,
				"vat"=>  [
					"percent"=>  23,
					"amount"=>  0.06
				],
				"amount_gross"=>  0.3
		]);
	}
	else if ($itemId == 30)
	{
		$cb([
				"item_id"=>  "30",
				"item_name"=>  "Kod dostępu",
				"quantity"=>  1,
				"unit_type"=>  "szt",
				"unit_price_net"=>  0,81,
				"amount_net"=>  0,81,
				"amount_discount_net"=>  0,
				"vat"=>  [
				        "percent"=>  23,
				        "amount"=>  0.19
				],
				"amount_gross"=>  1
		]);
	}
)->productBillon(function ($requestData, $item, $cb) //metoda niewymagana
{ // metoda niewymagana
	$cb($item);
}
)->productDelivery(function ($requestData, $items, $cb)
{ // metoda niewymagana
	$cb([
		"delivery_id"=> "",
		"delivery_description"=> "",
		"delivery_kind"=> "",
		"delivery_price_net"=> "0",
		"vat"=> [
			"percent"=> "0",
			"amount"=> "0"
		],
		"delivery_price_gross"=> "0",
		"estimated_delivery_date"=> "0"
	]);
}
)->currency(function ($requestData, $cb)
{
	$cb('PLN');
}
)->paymentTitle(function ($requestData, $items, $delivery, $cb) {
	$cb('Tytuł płatności');
}
)->cNode(function ($requestData, $items, $delivery, $cb) 
{
$cb("eyJhkGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c3VyIjp7ImlkIjoyNSwic2FsdCI6IjEyZWVkMzQwLTM2NGUtMThNjgyN1hNDM5zA1MiOjEh0OTCJpYXQiDk0NjF9Q1M.zeWXG7Nyr3PFVhb4HRgLi5rh8fLZx41VHySHWUStIzc"); // API key użytkownika serwisu "billon.me"
    /*$cb([
       Name: "billonpayments4",
       Address: "http://213.189.38.34:20891"
    ]);*/ // komunikacja bezpośrednio z węzłem Corporate Node
})->merchant(function ($requestData, $items, $delivery, $cb) { // metoda niewymagana
	$cb(array("company" => array("name" => "Default", "NIP" => "", "REGON" => "", "KRS" => ""), "person" => array("first_name" => "Default", "last_name" => "", "PESEL" => ""), "address" => array("street" => "Default", "city" => "Default", "zip" => "00-000", "country" => ""), "fax" => "", "www" => "", "email" => ""));
}
)->documentParse(function ($requestData, $document, $cb) {
	$cb(false); // metoda niewymagana
}
)->onFinishedPayment(function ($items, $delivery_option, $document, $requestData) 
{ // metoda niewymagana
	file_put_contents('log.txt', serialize([$items, $delivery_option, $document, $requestData]));
})->onRequestSend(function ($requestName, $parameters, $requestResponse, $error)
{ // zdarzenie wysłania operacji SOAP, metoda niewymagana
});

Specyficznym rodzajem płatności zakupu produktu są płatności talerzykowe.

Przykład usługi przekazania datku (płatności na kwotę):

require_once "billon/index.php"; //lokalizacja skryptu "index.php" modułu płatności Billon
$myShop = new \Billon\Payment();
$myShop->currency(function ($requestData, $cb) use ($pluginParams)
{
    $cb('PLN');
}
)->paymentTitle(function ($requestData, $items, $delivery, $cb) use ($title)
{
    $cb('Donate');
}
)->cNode(function ($requestData, $items, $delivery, $cb) use ($token)
{
$cb("eyJhkGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c3VyIjp7ImlkIjoyNSwic2FsdCI6IjEyZWVkMzQwLTM2NGUtMThNjgyN1hNDM5zA1MiOjEh0OTCJpYXQiDk0NjF9Q1M.zeWXG7Nyr3PFVhb4HRgLi5rh8fLZx41VHySHWUStIzc"); // API key użytkownika serwisu "billon.me"
    /*$cb([
       Name: "billonpayments4",
       Address: "http://213.189.38.34:20891"
    ]);*/ // komunikacja bezpośrednio z węzłem Corporate Node
}
)->merchant(function ($requestData, $items, $delivery, $cb)
{ // metoda niewymagana
    $cb(array("company" => array("name" => "Default", "NIP" => "", "REGON" => "", "KRS" => ""), "person" => array("first_name" => "Default", "last_name" => "", "PESEL" => ""), "address" => array("street" => "Default", "city" => "Default", "zip" => "00-000", "country" => ""), "fax" => "", "www" => "", "email" => ""));
}
)->documentParse(function ($requestData, $document, $cb)
{ // metoda niewymagana
    $cb(false);
}
)->onFinishedPayment(function ($items, $delivery_option, $document, $requestData)
{
});

1. user

W funkcji będącej argumentem tej metody powinno być wywołanie funkcji „cb” z obiektem typu „peerLocation”. Tablica ta powinna być automatycznie sprawdzaną przez JavaScript „billon-user.js” lokalizacją aplikacji użytkownika, jeśli jest ona uruchomiona na komputerze, lub w przeciwnym razie tablicą z jednym elementem o kluczu „userName” i wartości będącej nazwą użytkownika, którego dotyczyć ma transakcja z węzłem Corporate Node. Metoda nie dotyczy dotacji realizowanych za pomocą metody „donateInitiation”, gdzie obiekt typu „peerLocation” użytkownika jest pobierany z parametru „user” struktury JSON będącej parametrem żądania do kontrolera ze strony internetowej. W podobny sposób przekazywana jest kwota dotacji wyrażona w liczbie tysięcznej części podstawowej jednostki monetarnej poprzez parametr „amount” struktury JSON będącej parametrem żądania.

Przykład wywołania:

$myShop->user(function ($requestData, $cb)
{
  /* Przykładowa zawartość zmiennej $requestData->user:
  {
    "userName": "test", // Wymagane
    ... // Pozostałe opcjonalne, dla szybszego wyszukania użytkownika w sieci.
  }
  */
  $cb($requestData->user);
});

2. products

Metoda powinna przekazywać tablicę „id” produktów, których dotyczyć będzie transakcja. Nie dotyczy płatności datkowych.

Przykład wywołania:

$myShop->products(function ($requestData, $cb) 
{
  /* Przykładowa zawartość zmiennej $requestData->itemsId:
  [
    1,
    2,
    3
  ]
  */
  $cb($requestData->itemsId);
});

3. product

Funkcja użyta jako argument tej metody otrzymując dodatkowo parametr „id” pojedynczego produktu powinna przekazywać tablicę z danymi produktu lub cenę wyrażoną w liczbie tysięcznych częściach podstawowej jednostki monetarnej., np. pobranymi z bazy danych. Dane tego produktu będą dostępne dla użytkownika z poziomu przeglądarki w celu wyświetlania mu odpowiednich informacji o kupowanym produkcie. W przypadku nieużycia metody konfiguracyjnej „products” za pomocą tej metody należy ustawić pojedynczy produkt lub cenę.

Przykład wywołania:

$myShop->product(function ($requestData, $itemId, $cb)
{
	if ($itemId == 18) 
	{
		$cb([ // w PHP 5.3 "array(...)" zamiast "[...]"
				"item_id"=> "18",
				"item_name"=>  "eBook",
				"quantity"=>  1,
				"unit_type"=>  "szt",
				"unit_price_net"=> 0.24,
				"amount_net"=>  0.24,
				"amount_discount_net"=>  0,
				"vat"=>  [
					"percent"=>  23,
					"amount"=>  0.06
				],
				"amount_gross"=>  0.3
		]);
	}
	else if ($itemId == 30)
	{
		$cb([
				"item_id"=>  "30",
				"item_name"=>  "Kod dostępu",
				"quantity"=>  1,
				"unit_type"=>  "szt",
				"unit_price_net"=>  0,81,
				"amount_net"=>  0,81,
				"amount_discount_net"=>  0,
				"vat"=>  [
				"percent"=>  23,
				"amount"=>  0.19
				],
				"amount_gross"=>  1
		]);
	}
);

4. productBillon

Metoda „productBillon” różni się od poprzedniej tym, że przekazywana przez nią tablicą musi mieć konkretny format, dopasowany do API Billonu, aby poprawnie wyświetlać kupującemu np. dane fakturowe. Nie dotyczy płatności datkowych.

Przykład wywołania:

$myShop->productBillon(function ($requestData, $item, $cb) 
{ // metoda niewymagana
  $cb($item);
});

5. productDelivery

W tej metodzie określony musi zostać wybrany przez użytkownika sposób dostawy. Metoda jest opcjonalna. Nie dotyczy płatności datkowych.

Przykład wywołania:

$myShop->productDelivery(function ($requestData, $items, $cb) 
{ // Poniżej struktura obiektu opcji dostawy.
	$cb([
		"delivery_id"=> "",
		"delivery_description"=> "",
		"delivery_kind"=> "",
		"delivery_price_net"=> "0",
		"vat"=> [
			"percent"=> "0",
			"amount"=> "0"
		],
		"delivery_price_gross"=> "0",
		"estimated_delivery_date"=> "0"
	]);
}
);

6. currency

W tej metodzie można określić walutę płatności poprzez podanie jej kodu ISO 4217. Metoda jest opcjonalna. Domyślną walutą jest „PLN”.

Przykład wywołania:

$myShop->currency(function ($requestData, $cb)
{
   $cb('EUR');
});

7. paymentTitle

Metoda ta służy do określania tytułu płatności.

Przykład wywołania:

$myShop->paymentTitle(function ($requestData, $items, $delivery, $cb) 
{
  $cb("Kod");
});

8. cNode

W tej metodzie należy okrelić, jaka węzeł Corporate Node ma obsługiwać dane płatności. Można podać API key użytkownika serwisu „billon.me”, który można skopiować ze strony ustawień, lub tablicę z nazwą użytkownika, na którego zalogowany jest węzeł Corporate Node, i adresem, po którym jest dostępna komunikacja z nią. W odróżnieniu od modułu Node.js „billon” w module płatności PHP ustawiona wartość jest pobierana oddzielnie zarówno przy inicjacji płatności jak i przy jej nasłuchu.

Przykład wywołania:

$myShop->cNode(function ($requestData, $items, $delivery, $cb) {
$cb("eyJhkGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c3VyIjp7ImlkIjoyNSwic2FsdCI6IjEyZWVkMzQwLTM2NGUtMThNjgyN1hNDM5zA1MiOjEh0OTCJpYXQiDk0NjF9Q1M.zeWXG7Nyr3PFVhb4HRgLi5rh8fLZx41VHySHWUStIzc"); // API key użytkownika serwisu "billon.me"
    /*$cb([
       Name: "billonpayments4",
       Address: "http://213.189.38.34:20891"
    ]);*/ // komunikacja bezpośrednio z węzłem Corporate Node
});

9. merchant

Ta metoda przekazuje dane, które ukażą się w aplikacji użytkownika jako dane sprzedawcy. Muszą mieć one format dostosowany do API Billonu. Metoda jest opcjonalna.

Przykład wywołania:

$myShop->cNode(function ($requestData, $items, $delivery, $cb) {
    $cb(array("company" => array("name" => "Default", "NIP" => "", "REGON" => "", "KRS" => ""), "person" => array("first_name" => "Default", "last_name" => "", "PESEL" => ""), "address" => array("street" => "Default", "city" => "Default", "zip" => "00-000", "country" => ""), "fax" => "", "www" => "", "email" => ""));
});

10. documentParse

Metoda documentParse jest miejscem do niestandardowego przetwarzania dokumentu płatności. Metoda jest opcjonalna.

$myShop->documentParse(function ($requestData, $document, $cb)
{   
  // Jeśli wywołuje metodę "$cb" z argumentem "false", dokument nie będzie parsowany.   
  $cb(false);   
});

11. merchantBrandName

Metoda ta ustawia nazwę brandu, który domyślnie jest domeną strony, na której wykonywana jest płatność:

$myShop->merchantBrandName(function ($requestData, $cb)
{
  $cb('Nazwa brandu'); 
});

12. plates

Za pomocą tej metody można ustawić ceny talerzyków w kolejności rosnącej. Ceny te mają zastosowanie w czasie wywołania w kontrolerze Sails.js metod „platePaymentSeriesStart” i „tariff”. Przykład użycia z wcześniej ustawionymi wartościami:

$myShop->plates(function($requestData, $cb)
{
   $cb($alpha * 1000, $beta * 1000, $gamma * 1000, $delta * 1000, $epsilon * 1000); // pomnożenie cen do liczby tysięcznych części podstawowej jednostki monetarnej
}); // można wywołać metodę "$cb" z mniejszą liczbą argumentów, talerzyk można usunąć również z taryfy podając liczbę 0

13. maxTotalAmount

Ta metoda służy do ustawiania maksymalnej sumy płatności talerzykowych w serii. Metoda ma zastosowanie w czasie wywołania metody „platePaymentSeriesStart”. Sumę wyraża się w liczbie tysięcznych części podstawowej jednostki monetarnej:

$myShop->maxTotalAmount(function($requestData, $cb)
{
   $cb(10000); // np. 10 zł
});

14. duration

Za pomocą tej metody trzeba ustawić czas trwania serii płatności talerzykowych w sekundach. Metoda ma zastosowanie w czasie wywołania metody „platePaymentSeriesStart”. Przykład:

$myShop->duration(function($requestData, $cb)
{
   $cb(3600);
});

15. maxPaymentsInSeries

Tą metodę można wywołać z argumentem w postaci funkcji, która wywołuję funkcję z jej drugiego argumentu z maksymalną liczbą płatności w serii płatności talerzykowych. Metoda ma zastosowanie w czasie wywołania metody „platePaymentSeriesStart”. Przykład:

$myShop->maxPaymentsInSeries(function($requestData, $cb)
{
   $cb(10);
});

16. platePayment

Metoda ta służy do zdefiniowania płatności jako talerzykowej. Argumentem tej metody jest funkcja, która wywołuje funkcję z jej pierwszego argumentu z dwoma argumentami: identyfikatorem serii i rodzajem talerzyka („PLATE_ALPHA”, „PLATE_BETA”, „PLATE_GAMMA”, „PLATE_DELTA” lub „PLATE_EPSILON”). Przykład z użyciem wartości ustawionych skrypcie w przeglądarce:

$myShop->platePayment(function($requestData, $cb)
{
   $cb(requestData->seriesId, requestData->type);
});

Uwaga! Rodzaj talerzyka może być zmieniony przez skrypt po stronie przeglądarki „billon-plates.js”, jeśli rodzajów talerzyków jest mniej niż pięć.

17. onReceivedPlatePaymentSeriesStatus

Metoda służy do obsługi statusów zwracanych przez węzłem Corporate Node w trakcie operacji akceptacji serii płatności talerzykowych. Metoda ma zastosowanie w czasie wywołania metody „platePaymentSeriesStart”.

$myShop->onReceivedPlatePaymentSeriesStatus(function ($response)
{ 
   $response; // wiadomość zwrócona przez węzeł Corporate Node
   $response->status; // zwracany status
});

18. onAcceptedPlatePaymentSeries

Za pomocą tej metody można obsłużyć po stronie serwera zdarzenie akceptacji serii płatności talerzykowych. Metoda ma zastosowanie w czasie wywołania w kontrolerze Sails.js metody „platePaymentSeriesStart”.

$myShop->onAcceptedPlatePaymentSeries(function ($paymentData)
{
   // tutaj obsługa zdarzenia akceptacji serii płatności
});

19. onFinishedPayment

Najistotniejsza dla integracji metoda. Określa co ma się stać, gdy węzeł Corporate Node odnotuje zakończoną sukcesem zainicjowaną wcześniej płatność. W standardowym przypadku może to być np. wysłanie wiadomości e-mail lub przekazanie informacji dalej zapytaniem POST do komponentu odpowiedzialnego za realizację zamówień. Uwaga: Ustawiona funkcja jest wywoływana po zwróceniu do przeglądarki danych zainicjowanej płatności. Może zostać wywołana, gdy płatność jest inicjowana jako akcja CMS. Wtedy zakończenie płatności należy sprawdzać w funkcji ustawionej za pomocą metody konfiguracyjnej „onRequestSend”.

Przykład wywołania:

$myShop->onFinishedPayment(function ($items, $delivery, $purchaseDocument, $requestData) 
{
   if (property_exists($purchaseDocument->additionalInfo, 'actual_amount'))
   {
      $document->additionalInfo->actual_amount; // faktycznie zapłacona kwota wyrażona w liczbie tysięcznych części podstawowej jednostki monetarnej
   }
   if (property_exists($purchaseDocument, 'taskId'))
   {
      $purchaseDocument->taskId; // identyfikator zadania (transakcji)
   }
});

20. onRequestSend

Metoda ta obsługuje zdarzenie wysłania wiadomości SOAP do węzła Corporate Node i otrzymania lub nieotrzymania odpowiedzi. Metoda może być przydatna do stworzenia logów komunikacji SOAP lub wykonania jakieś operacji przy niepowodzeniu płatności.

Przykład wywołania:

$myShop->onRequestSend(function ($requestName, $parameters, $requestResponse, $error)
{
   $requestName; // nazwa operacji SOAP
   $parameters; // parametry operacji SOAP
   $requestResponse; // odpowiedź z węzła Corporate Node
   $error; // błędy przy wysyłaniu operacji SOAP (błędy z węzła Corporate Node przekazywane są przez argument "$requestResponse")
});

Komunikacja z użytkownikiem WWW

W pliku lub akcji inicjującej płatność należy wywołać metodę „paymentInitiation” lub „donateInitiation” obiektu komponentu sklepowego:

/**
 * Konfiguracja modułu płatności PHP
 * (deklaracja i ustawienie obiektu sklepowego).
 */
require_once "processing.inc.php";

$myShop->paymentInitiation();
//$myShop->donateInitiation(); // w przypadku dotacji

W pliku lub akcji nasłuchu płatności należy wywołać metodę „paymentStatus”:

/**
 * Konfiguracja modułu płatności PHP
 * (deklaracja i ustawienie obiektu sklepowego).
 */
require_once "processing.inc.php";

$taskId = @json_decode(file_get_contents("php://input"))->taskId;
$myShop->paymentStatus($taskId ? $taskId : $_GET['taskId'], function($response) use (&$cart)
{ // $cart - dodatkowa opcjonalna zmienna do ustalenia, np. API key
    $responseString = json_encode($response);
    echo $responseString;
});

Użytkownik będzie się mógł komunikować się poprzez zapytania HTTP typu POST z plikami lub akcjami inicjującymi lub nasłuchującymi płatność za pośrednictwem skryptów dla przeglądarek „billon-<moduł>.js”.

Czy ten artykuł jest dla Ciebie pomocny? Tak Nie

Jak możemy pomóc?