Kurs4858

 

Obsługa płatności Bitcoin w PHP - przykład

 

phpsample

 

Przygotowanie klienta Bitcoind do obsługi w PHP

 

Na początku musimy posiadać aktualną wersję Bitcoind, zsynchronizowaną i działającą. Polecam aktualną wersję z git-a, gdyż ma wiele usprawnień związanych z obciążeniem IO (dostępu do dysków). W konfiguracji Bitcoind musimy podać dane dostępowe, poprzez RPC (zdalne wywołanie) oraz zwiększyć liczbę keypoool (ilość początkowych adesów),  aby nie mieć problemów z dodawaniem nowych adresów.

Przykładowa konfiguracja bitcoin.conf: (jeśli plik nie istnieje trzeba go utworzyć w katalogu z plikiem wallet.dat)

rpcuser=nasz_user
rpcpassword=wygenerowany_ciag_znakow
#max connections na 20 jest wystarczające
maxconnections=20
#sprawdzamy tylko 500 bloków, by szybciej zresetować bitcoind (jeśli zajdzie taka potrzeba)
checkblocks=500
#keypool jak już wspomniałem, ustawiamy na około 10,000. Każde zwiększenie wymaga odblokowaia portfela
keypool=10000

 

Pierwsze uruchomienie

 

Jeśli uruchamiamy po raz pierwszy, należy zaszyfrować nasz portfel poleceniem:
# bitcoind encryptwallet NASZE_HASŁO_DO_PORTFELA

 

Po zmianie konfiguracji

 

Jeśli mieliśmy już wcześniej przygotowanego bitcoind, to należy go zresetować,
a następnie wykonać z konsoli polecenie odblokowywujące portfel:
# bitcoind walletpassphrase NASZE_HASŁO_DO_PORTFELA 60
, gdzie 60 to ilość sekund.
Po odblokowaniu portfela na minutę, można wykonać poniższe polecenie:
# bitcoind keypoolrefill

Jest to niezwykle ważne, gdyż zawsze dla każdego klienta chcemy wygenerować jego unikalny adres wpłaty.
W standardowej konfiguracji wartość keypool jest ustawiona na 100 (dość mało).
Nie można niestety uzupełniać na bieżąco bez odblokowania portfela, co wymaga podania hasła.

Gdy już wszystko mamy przygotowane, można zabierać się do wdrażania w kod naszego serwisu.

Proste i ekspresowe przyjmowanie płatności w bitcoinach (BTC zamiast SMS-a)

 

Opis mechanizmu

 

Mechanizm opisuje w jaki sposób możemy dodać do naszego serwisu płatności obok płatności SMS (lub innych szybkich). Poniższy przykład opieram na doświadczeniach jakie miałem, gdy dodawałem taką opcję do Pimpland.pl.
W założeniach przyjmujemy tylko opcję odbierania płatności poprzez BTC.
Mechanizm obejmuje wymianę Bitcoin na żetony, używane w grze w stosunku 1:128...jednak możemy wymienić to na cokolwiek chcemy.
Nie dajemy możliwości zwrotu, gdyż chcemy realizować płatności jak najszybciej bez żadnych potwierdzeń sieci. Mogą występować w takich sytuacjach podwójne wydania (duble-spend), co może być miejscem do nadużyć. Jednak przy aktualnej mocy sieci nie sądzę, aby mogło nam się to przydarzyć, ale chciałem o tym wspomnieć.

 

Sposób działania

 

Użytkownik po wejściu na strone z poniższym kodem generuje adres wpłaty jednorazowo poprzez wykonanie polecenia getaccountaddress. W momencie gdy użytkownik chce wymienić BTC na punkty w grze system przelicza ile całych punktów może maksymalnie wymienić. Jeśli liczba całkowita jest większa od zero wtedy następuje przesunięcie (polecenie move). Polecenie move jest znacznie bezpieczniejsze gdyż nie wymaga odblokowania portfela, co za tym idzie nie trzymamy nigdzie w kodzie hasła do portfela.. Na końcu kodu wyświetlamy stan konta po stronie serwera, oraz adres na który użytkownik ma dokonać wpłaty.

 

Co jest potrzebne

 

  • Mamy już gotowy system rejestracji użytkowników. Użytkownik posiada w systemie swoje unikalne ID (numerek/e-mail itd.; nazywajmy to ID).
  • Jest przygotowany bitcoind wg powyższego przykładu.
  • Obsługa JSON w PHP. większość dystrybucji posiada już wbudowane. Można to sprawdzić w phpinfo()
  • Klient JSON-RPC do pobrania stąd: http://jsonrpcphp.org/?page=download&lang=en

 

Dodawanie płatności

 

Zakładamy że pod zmienną $userID kryje się unikalny ID użytkownika.
Do kodu będzie potrzeba dodać następujący kod. Objaśnienia znajdują się w komentarzach:

 

<?php
//Konfiguracja
$exchange_rate= (int) 128; //Stosunek bitcoinów do waluty w grze
$wallet_prefix='przyklad_'; //Prefix dla nazw adresow portfeli
$wallet_main='wplaty_z_przyklad'; //Nazwa portfela, na który bedą przesuwane płatności
$min_confirm= (int) 0; // wymagana liczba potwierdzeń. Ustawiamy na zero dla natychmiastowych płatności
$rcp_user='username_z_bitcoin.conf';
$rpc_pass='haslo_z_bitcoin.conf';
//includujemy klienta json-rpc
require('jsonRPCClient.php');
//Próbujemy połączyć się z BitcoinD i wygenerowac lub pobrac adres wplaty
$bitcoin = new jsonRPCClient("http://{$rpc_user}:{$rpc_pass}@127.0.0.1:8332/",false);
try {
        $btc_address = $bitcoin->getaccountaddress($wallet_prefix.$userID);
} catch (Exception $e) {
        $bitcoin = false;
}
if($bitcoin !== false)
{
	//Kawałek kodu, który zostanie uruchomiony podczas zmiany BTC na punkty w systemie.
        if(in_array('changeBTC',$_POST)
        {
		//pobieramy stan konta użytkownika
                $btc_balance = $bitcoin->getbalance($wallet_prefix.$userID,$min_confirm);
		//przeliczamy ile punktów można dostać za aktualny stan konta i zokrąglamy w dół by reszta została na koncie
                $can_coins = floor($btc_balance*$exchange_rate);
                if($can_coins > 0)
                {
                        $to_move = floatval($can_coins*(1/$exchange_rate));
			// przesuwamy z portfelu użytkownika na portfel serwisu.
                        $check = $bitcoin->move($wallet_prefix.$userID,$wallet_main,$to_move,$min_confirm);
                        if($check)
                        {
                                //W tym miejscu wykonujemy dodanie punktów w systemi.
                        }
                }
        }
        //pobieramy stan konta:
        $btc_balance = $bitcoin->getbalance($wallet_prefix.$userID,$min_confirm);
	///przeliczamy ile punktów można dostać za aktualny stan konta i zokrąglamy w duł
        $can_coins = floor($btc_balance*$exchange_rate);
	//Wyświetlamy informacje dla użytkownika:
        echo "Adres portfela na ktory nalezy wysłać BTC: ".$btc_address;
        echo "Aktualny stan konta pozwoli na dodanie:".$can_coins;
        echo "<form method=POST><input type="submit" name="changeBTC" value="Wymień BTC na punkty"></form>";
}
php?>

 

Zakończenie

 

Przykład opisuje w jaki prosty sposób można dodać płatności BTC do naszego systemu, należy pamiętać iż jest to tylko przykład który należy dostosować do swoich potrzeb.
Polecam także dodanie przycisku do generowania adresu Bitcoin gdyż szybko może się skończyć liczba 10,000 pól w Bitcoind. Na bierząco polecam sprawdzać logi czy nie ma problemów z połączeniem pomiędzy PHP a Bitcoind.
Dobrym sposobem jest też co jakiś czas przesyłać uzbierane Bitcoiny z serwera w inne bezpieczniejsze miejsce.

Niebawem część druga w której opisze system przelewania Bitcoinów w obie strony i generowanie transakcji poprzez MySQL.

Autor

Piotr (ViruS) Sikora.


 

Portal bitcoin.pl nie ponosi odpowiedzialności z tytułu ewentualnych szkód jakie powstały w wyniku wykorzystania danych zawartych na łamach serwisu.