Categories
Code

Memprogram Database SQLite3 di PHP

SQLite adalah engine database yang paling banyak dipakai, digunakan di setiap smartphone dan di banyak komputer, dibundel dibanyak aplikasi yang digunakan sehari-hari. Meski aplikasi server seperti PHP lebih mengandalkan database server seperti MySQL atau PostgreSQL, SQLite dapat menjadi pilihan tepat untuk aplikasi yang berjalan di server tunggal dan membutuhkan engine database yang ringan.

SQLite3 adalah SQLite versi 3, peningkatan dari versi sebelumnya 2.8. Saat tulisan ini dibuat, rilis terakhir SQLite3 yang dapat dipakai adalah versi 3.29.0

Instalasi Modul dan Klien

Sebelum menggunakan SQLite di PHP, lakukan pemasangan modul sqlite3 dengan perintah berikut:

 $ sudo apt install php-sqlite3

Jika membangun aplikasi PHP di windows, pastikan ekstensi sqlite3 diaktifkan, berikut baris kode di php.ini untuk mengaktifkan ekstensi sqlite3:

...
;extension=sockets
extension=sqlite3
;extension=tidy
...

Instal pula aplikasi klien untuk dapat bekerja menggunakan SQLite, seperti membuat database baru dan mengatur bentuk tabel. Di Linux, aplikasi klien dapat diinstal dengan perintah berikut:

sudo apt install sqlite3

Aplikasi klien untuk sistem operasi lain bisa diunduh melalui: https://www.sqlite.org/download.html.

Alternatif selain aplikasi klien berbasis baris perintah / CLI, aplikasi klien SQLite juga terdapat antarmuka berbasis grafis / GUI, salah satunya adalah SQLite Browser yang dapat diunduh melalui https://sqlitebrowser.org/

Buat Database

Sebelum melakukan pemprograman database SQLite menggunakan PHP, buat database baru dengan perintah sebagai berikut:

$ sqlite3 my.db
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite> 

Dari perintah di atas, akan dibuat database dengan nama my.db. Pada command prompt sqlite>, masukkan beberapa perintah berikut:

sqlite> .tables
sqlite> .exit

Akses SQLite3 di PHP

Kelas SQLite3 digunakan sebagai interface untuk berinteraksi dengan database SQLite. Berikut contoh menampilkan versi SQLite3 yang digunakan oleh PHP.

<?php
$ver = SQLite3::version();
echo $ver['versionString'] . "\n";

Simpan file di atas dengan nama version.php kemudian jalankan perintah:

$ php version.php 
SQLite3 version 3.29.0

Berikut contoh lain mengakses database SQLite3 yang telah dibuat sebelumnya:

<?php
$db = new SQLite3('my.db');
echo $db->querySingle('SELECT SQLITE_VERSION()') . "\n";

Simpan skrip di atas sebagai file access.php kemudian jalankan:

$ php version.php 
3.29.0

Method exec()

Method exec() Menjalankan query tanpa hasil terhadap suatu database. Fungsi ini dapat digunakan untuk membuat tabel atau memasukkan record ke dalam tabel.

<?php
$db = new SQLite3('my.db');

$sql = "CREATE TABLE `people` (
  `id`	INTEGER PRIMARY KEY AUTOINCREMENT,
  `name`	TEXT,
  `gender`	TEXT,
  `age`	INT,
  `city`	TEXT,
  `created_at`	TEXT
)";
$db->exec($sql);

$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) 
    VALUES ('Caydence Dillon','Female',NULL,'Amarillo','3/30/2019 4:37 PM');");
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) 
    VALUES ('Doug Baldwin','Male',52,'Indianapolis','1/24/2019 1:38 PM');");
$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`) 
    VALUES ('David Janes','Male',62,'Anaheim','2/11/2019 8:07 AM');");

$last_row_id = $db->lastInsertRowID();
echo "The last inserted row ID is $last_row_id \n";

Kode di atas membuat tabel people dan menambahkan 3 baris data ke tabel tersebut. Di bagian terakhir kode, terdapat method lastInsertRowID() untuk mengetahui ID terakhir dari baris yang telah dimasukkan ke dalam tabel. Jalankan kode di atas sebagai berikut:

$ php exec.php
The last inserted row ID is 3

Untuk melihat data yang telah dimasukkan ke dalam database, gunakan konsol sqlite3 berikut:

$ sqlite3 my.db
sqlite> .mode column
sqlite> .headers on
sqlite> select * from people;
id          name             gender      age         city        created_at       
----------  ---------------  ----------  ----------  ----------  -----------------
1           Caydence Dillon  Female                  Amarillo    3/30/2019 4:37 PM
2           Doug Baldwin     Male        52          Indianapol  1/24/2019 1:38 PM
3           David Janes      Male        62          Anaheim     2/11/2019 8:07 AM

Query Data

Dalam bahasa SQL, statement SELECT digunakan untuk mengambil data dalam tabel. Ada dua method yang dapat digunakan untuk query data menggunakan statement SELECT, yaitu method querySingle dan method query.

Method querySingle mengembalikan nilai dari kolom pertama yang dihasilkan query. Sebagai contoh:

<?php
$db = new SQLite3('my.db');

$name = $db->querySingle('SELECT name FROM people WHERE id=2');
echo "Name: $name";

Kode di atas akan menghasilkan nilai dari kolom name yang mempunyai id = 2, output yang dihasilkan:

Name: Doug Baldwin

Parameter kedua method querySingle dapat diset true untuk menghasilkan array dari seluruh baris pertama.

$person = $db->querySingle('SELECT name, gender, age FROM people WHERE id=3', true);
echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";

Kode di atas akan menghasilkan output:

Name: Doug Baldwin, Gender: Male, Age: 52

Sedangkan method query() mengembalikan nilai objek dari kelas SQLite3Result. Method ini dapat digunakan untuk mengambil seluruh data yang dihasilkan dari statement SELECT. Sebagai contoh:

$res = $db->query("SELECT id, name, gender, age FROM people");
while ($row = $res->fetchArray()) {
    echo "{$row['id']}. {$row['name']}: {$row['gender']} {$row['age']} \n";
}

Kode di atas akan mengasilkan:

1. Caydence Dillon: Female  
2. Doug Baldwin: Male 52 
3. David Janes: Male 62 

Escape String

Gunakan method escapeString() untuk escape string sebelum eksekusi atau query statement SQL.

<?php
$db = new SQLite3('my.db');

$name  = "O'Reilly";
$escaped_name = SQLite3::escapeString($name);

$db->exec("INSERT INTO people (`name`, `gender`, `age`, `city`, `created_at`).
    VALUES('$escaped_name','Male',41,'Wien','2/1/2019 2:11 PM');");

$person = $db->querySingle("SELECT name, gender, age FROM people WHERE name LIKE '%{$escaped_name}%'", true);
echo "Name: {$person['name']}, Gender: {$person['gender']}, Age: {$person['age']}";

Parameter Binding Pada Statement SQL

Saat aplikasi berhadapan dengan input dari user, statement SQL dibuat menjadi dinamis. Faktor keamanan menjadi hal utama saat berhadapan dengan input yang dimasukkan user. Cara yang disarankan untuk membuat statement SQL secara dinamis adalah dengan menggunakan pengikatan parameter.

Query dengan parameter dibuat dengan method prepare(), digunakan untuk menyiapkan statement SQL. Method ini akan mengembalikan objek dari kelas SQLite3Stmt. Objek statement tersebut mempunyai method bindParam() dan bindValue() yang digunakan untuk mengikat / binding value ke placeholder.

Method bindParam() digunakan untuk mengikat parameter ke variabel statement.

<?php
$db = new SQLite3('my.db');

$stmt = $db->prepare("INSERT INTO people 
    (`name`, `gender`, `age`, `city`, `created_at`)
    VALUES(:name, :gender, :age, :city, :created_at);");
$stmt->bindParam(':name', $name, SQLITE3_TEXT);
$stmt->bindParam(':gender', $gender, SQLITE3_TEXT);
$stmt->bindParam(':age', $age, SQLITE3_INTEGER);
$stmt->bindParam(':city', $city, SQLITE3_TEXT);
$stmt->bindParam(':created_at', $created_at, SQLITE3_TEXT);

$name = 'Abdul Radley';
$gender = 'Male';
$age = 57;
$city = 'Fremont';
$created_at = '9/18/2019 2:56 PM';
$stmt->execute();

$name = 'Daron Reyes';
$gender = 'Male';
$age = 37;
$city = 'Las Vegas';
$created_at = '6/6/2019 3:44 PM';
$stmt->execute();

Method bindValue() digunakan untuk mengikat nilai dari parameter ke variabel statement.

<?php
$db = new SQLite3('my.db');

$stmt = $db->prepare("INSERT INTO people 
    (`name`, `gender`, `age`, `city`, `created_at`)
    VALUES(:name, :gender, :age, :city, :created_at);");

$stmt->bindValue(':name', 'Rick Martin', SQLITE3_TEXT);
$stmt->bindValue(':gender', 'Male', SQLITE3_TEXT);
$stmt->bindValue(':age', 59, SQLITE3_INTEGER);
$stmt->bindValue(':city', 'New Orleans', SQLITE3_TEXT);
$stmt->bindValue(':created_at', '1/11/2019 5:26 PM', SQLITE3_TEXT);
$stmt->execute();

$stmt->bindValue(':name', 'Peter Wilson', SQLITE3_TEXT);
$stmt->bindValue(':gender', 'Male', SQLITE3_TEXT);
$stmt->bindValue(':age', 55, SQLITE3_INTEGER);
$stmt->bindValue(':city', 'Louisville', SQLITE3_TEXT);
$stmt->bindValue(':created_at', '1/19/2019 7:13 AM', SQLITE3_TEXT);
$stmt->execute();

Kode Github

Categories
App Code

Komputer Kecil Edukasi micro:bit

Didesain untuk tujuan edukasi, micro:bit adalah komputer kecil yang dapat diprogram, membuat kamu dapat berkreasi dengan teknologi digital. Perangkat ini dikembangkan dengan tujuan untuk belajar dan mengajarkan kode komputer menjadi lebih mudah dan menyenangkan. Mendorong anak-anak untuk terlibat dalam memprogram komputer, elektronik dan pembuatan perangkat secara umum.

Di negara asalnya, BBC memberikan sampai dengan 10 juta perangkat micro:bit secara cuma-cuma kepada anak-anak usia 11 dan 12 tahun di Inggris. Bagian dari program “BBC Make It Digital” sebagai upaya untuk mengantisipasi “kesenjangan keterampilan” dalam pertumbuhan ekonomi digital negara itu. Untuk adopsi ke suluruh dunia, BBC menyerahkan micro:bit ke tangan Microbit Education Foundation, dan kini micro:bit sudah tersedia secara komersial, termasuk sudah dijual di marketplace Indonesia.

Bentuk Fisik micro:bit

Dengan ukuran fisik berukuran setengah kartu kredit, tampilan depan micro:bit dilengkapi dengan display berupa 25 LED beserta 2 tombol kiri dan kanan yang dapat dikonfigurasi.

tampilan depan micro:bit (sumber: microbit:org)

Di dalamnya terdapat akselerometer untuk deteksi gerakan dan mengetahui kapan melakukan gerak. Tertanam kompas untuk mengetahui ke arah mana yang dituju. Terdapat pula bluetooth dan berbagai koneksi untuk menghubungkannya ke lebih banyak sensor.

tampilan belakang micro:bit (sumber: microbit.org)

Memprogram micro:bit

Ada dua editor yang digunakan untuk mengkode micro:bit, yaitu MakeCode Editor dan Python Editor. MakeCode Editor memprogram secara visual dalam bentuk blok-blok (drag-and-drop blocks) dan kode ditulis dalam bahasa pemprograman JavaScript. Sedangkan dengan Python Editor dapat menulis kode menggunakan bahasa pemprograman populer Python.

MakeCode Editor dapat digunakan dengan mengunjungi alamat https://makecode.microbit.org, lalu buat project baru dengan mengklik “+ new project”. Pilih “Basic”, kemudian “Show string” untuk menampilkan kata / kalimat yang akan muncul di layar LED. Seret dan jatuhkan di blok “Forever” agar kata / kalimat tersebut muncul terus menerus, dan masukkan kalimat “HALO, TEMAN!”. Tambahkan “Show Icon” untuk menampilkan gambar-gambar seperti icon hati, tempatkan di bagian bawah “Show String”.

Klik icon “Play” untuk menjalankan kode langsung di editor, dan klik “Download” untuk memasukkan program ke dalam micro:bit. File yang didownload mempunyai ekstensi .hex (misalkan microbit.hex), file yang berisikan program ini nantinya akan berjalan di atas micro:bit.

Hubungkan micro:bit ke komputer dengan menggunakan kabel USB. Di komputer, micro:bit akan dikenali sebagai USB Drive dengan label “MICROBIT”. Salin file .hex tersebut ke USB Drive MICROBIT, di Windows bisa dilakukan juga dengan cara “Send To→MICROBIT”

Untuk memprogram menggunakan Python Editor dapat dilakukan dengan mengunjungi alamat https://python.microbit.org. Tuliskan kode-kode Python di dalam editor, dan klik tombol “Download” untuk memasukkan ke dalam micro:bit.

mikro:bit akan berhenti sebentar dan LED kuning di belakang akan berkedip saat kode diprogram. Setelah selesai kode akan berjalan secara otomatis!

Hal keren apa yang akan kamu buat? micro:bit dapat merespons tombol, cahaya, gerakan, dan suhu. Perangkat ini bahkan dapat mengirim pesan secara nirkabel ke mikro:bit lain menggunakan fitur ‘Radio’ loh!

Untuk pengajar, kamu bisa menggunakan micro:bit untuk mengajar di sekolah dengan sumber daya yang bisa diperoleh di https://microbit.org/teach/

Categories
Code

Laravel Artisan Console, Membuat Aplikasi CLI

Ketika kamu membutuhkan antarmuka command-line (command-line interface / CLI), kamu dapat memanfaatkan fitur Artisan Console. Laravel menyediakan sejumlah perintah Artisan dengan menggunakan memanggil perintah list

php artisan list

Untuk menambahkan perintah Artisan, dapat dibuat dengan perintah make:command. Kita akan membuat sebuah perintah Artisan untuk menampilkan kota seperti pada contoh sebelumnya:

php artisan make:command ViewCities

File perintah Artisan tersebut disimpan di app\Console\ViewCities.php.

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;

class ViewCities extends Command
{

    protected $signature = 'city:view';

    protected $description = 'View cities';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        //
    }
}

Isikan variabel $signature dengan nama perintah Artisan dan masukkan deskripsinya di variabel $description.

Baris-baris kode yang ada di method handle() akan dieksekusi saat perintah Artisan yang dibuat dijalankan. Berikut contoh kode untuk menampilkan daftar kota:

public function handle()
{
    $this->info("Daftar Kota");

    $cities = \App\City::all();
    foreach ($cities as $city) {
        $this->line("- {$city->name}: {$city->map}");
    }
}

Agar perintah Artisan dapat digunakan, masukkan class tersebut ke dalam variabel $commands yang ada di file app/Console/Kernel.php

protected $commands = [
        ...
        Commands\ViewCities::class
    ];

Panggil perintah artisan tersebut dengan perintah:

  php artisan city:view

Berikut kode lengkap:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ViewCities extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'city:view';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'View cities';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->info("Daftar Kota");

        $cities = \App\City::all();
        foreach ($cities as $city) {
            $this->line("- {$city->name}: {$city->map}");
        }
    }
}
Categories
Code

Eloquent ORM di Laravel, Membuat Model Aplikasi

Laravel menyediakan cara mudah dalam mengakses database yaitu Eloquent ORM (Object Relational Model), sebuah implementasi ActiveRecord ketika bekerja dengan database. Setiap tabel database memiliki hubungan dengan model yang digunakan untuk berinteraksi dengan tabel tersebut.

Pada tulisan sebelumnya, kita sudah memiliki tabel dalam database yang dibuat melalui migration bernama cities dan memasukkan data dummy ke dalam tabel tersebut. Tulisan ini akan melanjutkan pemodelan data yang dihubungkan dengan tabel dan data di dalamnya.

Model aplikasi mengijinkan untuk query data di dalam tabel, serta menambahkan, mengubah atau menghapus data tersebut. Tulisan kali ini akan membahas cara membuat model, bagaimana ketentuan dalam model dan mengambil data (query) yang akan ditampilkan ke laman web.

Membuat Model

Membuat model dapat dilakukan dengan menggunakan perintah Artisan make:model. Model yang akan dibuat bernama City dan dihubungkan ke tabel cities yang terdapat di database.

$ php artisan make:model City

Dalam pembuatan model, migration dapat dibuat secara otomatis dibuat dengan menyertakan opsi --migration atau disingkat -m. Berikut perintah pembuatan model beserta migration:

$ php artisan make:model City --migration
$ php artisan make:model City -m
Model created successfully.
Created Migration: 2019_03_17_005308_create_cities_table

Model yang dibuat dengan perintah Artisan di atas akan disimpan di file app/City.php, berikut isi file model City:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
    
}

Ketentuan Pemodelan

Eloquent menganggap bahwa kelas model City secara otomatis terhubung dengan tabel cities, bentuk jamak dari nama kelas tersebut. Begitu pula ketika model User dibuat, maka diasumsikan terdapat tabel users di database yang dihubungkan dengan model tersebut. Keterkaitan model dengan tabel database tersebut dapat didefinisikan secara manual dengan melalui properti $table:

class City extends Model
{
    protected $table = 'tbl_city';    
}

Selain nama tabel, Eloquent juga menganggap bahwa setiap tabel memiliki kolom bernama id sebagai primary key. Gunakan properti $primaryKey jika ingin menggunakan nama kolom lain sebagai primary key tabel:

class City extends Model
{
    ...
    protected $primaryKey = 'city_ID';    
}

Elequent juga memiliki 2 kolom timestamp yang selalu ada di model yaitu created_at dan updated_at. Jika tidak menginginkan keberadaan kolom timestamp ini, set properti $timestamps menjadi false.

class City extends Model
{
    ...
    protected $timestamps = false;
}

Sama seperti pada tulisan sebelumnya membuat migration database, struktur tabel cities ketika dibuat menggunakan schema builder adalah sebagai berikut:

Schema::create('cities', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->string('map');
    $table->timestamps();
});

Masukkan data dummy dengan menggunakan seeder database, dan query data tersebut pada model dengan query builder. Sebagai contoh memanggil semua data dengan metode all():

App\City::all();

Untuk memastikan model berjalan dengan baik dengan memanggil metode di atas untuk ditampilkan ke dalam view seperti di bawah ini:

...
<h1>Daftar Kota Jabodetabek</h1>
@php $cities = App\City::all(); @endphp
<ul class="list-group">
    @foreach ($cities as $city)
    <li class="list-group-item">
        <a href="{{ $city->map }}" target="_blank">
            {{ $city->name }}
        </a>
    </li>
    @endforeach
</ul>
...

Hubungan antar Tabel

Tabel-tabel di database sering kali berhubungan satu sama lain. Sebagai contoh tabel People yang berisikan data penduduk berhubungan dengan tabel Cities.

Eloquent memudahkan mengelola hubungan antar tabel tersebut dan mendukung berbagai jenis hubungan. Untuk mempermudah pemahaman tentang relasi, sekarang kita buat model seorang penduduk yaitu model Person (bentuk tunggal dari People) yang berelasi dengan model City.

$ php artisan make:model Person -m
Model created successfully.
Created Migration: 2019_03_17_072450_create_people_table

Dari perintah di atas, dibuat secara otomatis migration tabel people, buat struktur tabel sebagai berikut:

Schema::create('people', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('city_id');
    $table->string('name');
    $table->string('age');
    $table->timestamps();
    $table->foreign('city_id')->references('id')->on('cities');
});

Dari struktur di atas dapat kita lihat bahwa terdapat field city_id sebagai foreign key yang berelasi dengan tabel cities. Jika dimodelkan, hubungan ini termasuk ke dalam tipe one-to-many, di mana City dapat mempunyai banyak data Person. Berikut kode pemodelan yang dilakukan di model City:

class City extends Model
{
    public function people()
    {
        return $this->hasMany('App\Person');
    }
}

Begitu pula di model Person yang mempunyai hubungan terbalik dengan model City di definisikan sebagai berikut:

class Person extends Model
{
    public function city()
    {
        return $this->belongsTo('App\City');
    }
}

Setelah hubungan dipetakan, kita dapat mengakses koleksi data Person dengan mengakses properti people

$people = App\City::find(1)->people;

foreach ($people as $person) {
    //
}

Kode Github

Categories
Code Crypto

Cek Pembayaran Bitcoin dengan WebSocket

Pembayaran menggunakan Bitcoin tidak terbatas wilayah, kita dapat memanfaatkan Bitcoin sebagai pembayaran internasional. Kamu bisa mengkonversi harga barang atau jasa dari Rupiah atau Dolar ke dalam Bitcoin, dan pelanggan mengirim sejumlah Bitcoin ke alamat dompet yang kamu miliki.

Pada tulisan kali ini kita akan memanfaatkan websocket untuk mengecek penerimaan bitcoin yang dikirimkan ke alamat tertentu. Kita menggunakan websocket API dari blockchain.com, silahkan kunjungi alamat berikut untuk referensi penggunaan websocket API: https://www.blockchain.com/api/api_websocket.

Untuk memulai, berikut kode HTML pertama yang akan digunakan untuk pengecekan transaksi Bitcoin yang masuk:

....
<body>
  <h2>Request BTC</h2>
  <p style="font-weight: bold">Address: <span id="btc_addr"></span></p>
  <div id="output"></div>
  
  <script language="javascript" type="text/javascript">
    var ws_uri = "wss://ws.blockchain.info/inv";
    var addr = "19M6H...................jc74WV";
    var output;
    var response = new Array();

    function init() {
      output = document.getElementById("output");
      document.getElementById("btc_addr").innerHTML = addr;
      do_ws();
    }

    ...
  </script>
</body>
....

Pertama kita definisikan beberapa variabel sebagai berikut:

  • ws_uri: alamat koneksi ke websocket API milik blockchain.com dengan alamat wss://ws.blockchain.info/inv
  • addr: alamat Bitcoin yang dituju untuk menerima pembayaran, masukkan alamat Bitcoin yang diinginkan di sini.
  • output: semua output yang diterima dari websocket akan dimasukkan ke dalam tag <div id="output">
  • response: digunakan untuk menyimpan response dari transaksi yang masuk

Selanjutnya kita membuat fungsi do_ws(). Fungsi ini berisikan intruksi penggunaan websocket, berikut kode untuk fungsi do_ws():

....
function do_ws() {
  websocket = new WebSocket(ws_uri);
  websocket.onopen = function(evt) { ws_open(evt) };
  websocket.onclose = function(evt) { ws_close(evt) };
  websocket.onmessage = function(evt) { ws_message(evt) };
  websocket.onerror = function(evt) { ws_error(evt) };
}
....

Masing-masing fungsi websocket onopen(), onclose(), onmessage() dan onerror() akan menjalankan fungsi-fungsi yang didefinisikan sebagai berikut:

....
function ws_open(evt) {
  to_screen("CONNECTED");
  do_send(JSON.stringify({"op":"addr_sub", "addr": addr}));
}

function ws_close(evt) {
  to_screen("DISCONNECTED");
}

function ws_message(evt) {
  response = JSON.parse(evt.data);
  to_screen('<span style="color: blue;">TX: ' + response.x.hash + '</span>');
  do_send(JSON.stringify({"op":"addr_unsub", "addr": addr}));
  websocket.close();
}

function ws_error(evt) {
  to_screen('<span style="color: red;">ERROR: ' + evt.data + '</span>');
}
....

Dapat dilihat dari fungsi ws_open(), setelah websocket berhasil terkoneksi, pesan yang dikirim ke websocket adalah {"op":"addr_sub", "addr": addr}. Pesan ini bertujuan subscribe ke websocket untuk memeriksa transaksi yang belum terkonfirmasi dalam jaringan. Ketika ada pengiriman bitcoin masuk, transaksi belum terkonfirmasi tersebut akan diterima dalam output transaksi sebagai berikut:

{
  "op": "utx",
  "x": {
    "lock_time": 0,
    "ver": 2,
    "size": 454,
    "inputs": [
       ...
    ],
    ...
    "hash": "c84d............1d6c",
    "vout_sz": 3,
    ...
    "out": [
      {
        ....
        "addr": "19M6H...................jc74WV",
        "value": 27580,
        ...
      },
      {
        ...
        "type": 0,
        "addr": "1EF...Wua",
        ....
      },
      {
        ...
      }
    ]
  }
}

Output transaksi tersebut diterima oleh fungsi ws_message() kemudian memproses data yang diterima dari transaksi. Proses yang dilakukan di sini masih sederhana, ketika transaksi berhasil diperoleh, hash transaksi / txid akan ditampilkan ke halaman web, kemudian unsubscribe transaksi dari alamat Bitcoin, dan menutup koneksi ke websocket.

Ada dua fungsi lain yang dibutuhkan dalam aplikasi ini, yaitu fungsi do_send() untuk mengirim pesan ke websocket, dan fungsi to_screen() untuk menampilkan output di halaman web. Berikut intruksi dua fungsi tersebut:

....
function do_send(message) {
  to_screen("SENT: " + message);
  websocket.send(message);
}

function to_screen(message) {
  var pre = document.createElement("p");
  pre.style.wordWrap = "break-word";
  pre.innerHTML = message;
  output.appendChild(pre);
}
....

Terakhir, jalankan fungsi init() dengan menambahkan intruksi berikut:

window.addEventListener("load", init, false);

Ketika dijalankan, berikut tampilan aplikasi pengecekan transaksi yang masuk menggunakan websocket:

Dari penjelasan di atas, kita dapatkan kode HTML lengkap sebagai berikut:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Request BTC</title>
</head>
<body>
  <h2>Request BTC</h2>
  <p style="font-weight: bold">Address: <span id="btc_addr"></span></p>
  <div id="output"></div>
  
  <script language="javascript" type="text/javascript">
    var ws_uri = "wss://ws.blockchain.info/inv";
    var addr = "19M6H...................jc74WV";
    var output;
    var response = new Array();

    function init() {
      output = document.getElementById("output");
      document.getElementById("btc_addr").innerHTML = addr;
      do_ws();
    }

    function do_ws() {
      websocket = new WebSocket(ws_uri);
      websocket.onopen = function(evt) { ws_open(evt) };
      websocket.onclose = function(evt) { ws_close(evt) };
      websocket.onmessage = function(evt) { ws_message(evt) };
      websocket.onerror = function(evt) { ws_error(evt) };
    }

    function ws_open(evt) {
      to_screen("CONNECTED");
      do_send(JSON.stringify({"op":"addr_sub", "addr": addr}));
    }

    function ws_close(evt) {
      to_screen("DISCONNECTED");
    }

    function ws_message(evt) {
      response = JSON.parse(evt.data);
      to_screen('<span style="color: blue;">TX: ' + response.x.hash + '</span>');
      do_send(JSON.stringify({"op":"addr_unsub", "addr": addr}));
      websocket.close();
    }

    function ws_error(evt) {
      to_screen('<span style="color: red;">ERROR: ' + evt.data + '</span>');
    }

    function do_send(message) {
      to_screen("SENT: " + message);
      websocket.send(message);
    }

    function to_screen(message) {
      var pre = document.createElement("p");
      pre.style.wordWrap = "break-word";
      pre.innerHTML = message;
      output.appendChild(pre);
    }

    window.addEventListener("load", init, false);
  </script>
</body>
</html>

Kode di tulisan ini masih sederhana, kamu bisa kembangkan sesuai kebutuhan. Kamu bisa menambahkan berapa jumlah Bitcoin yang akan diterima, menambahkan barcode, transaksi akan expire dalam waktu sekian menit, dan kebutuhan lainnya yang bisa ditambahkan sesuai kemampuan programming kamu.

Happy coding!

Kode Github

Categories
Code

Perhitungan Konversi Pembayaran Rupiah Menggunakan PayPal dengan PHP Programming

Instan, cepat dan aman, itulah alasan PayPal banyak digunakan sebagai salah satu metode pembayaran oleh website ecommerce, toko online, aplikasi atau jasa freelance. Sayangnya, semua transaksi yang dilakukan di Indonesia harus menggunakan Rupiah dan PayPal tidak mendukung mata uang Rupiah.

Lantas, bisakah PayPal digunakan sebagai metode pembayaran di Indonesia? Tentu saja bisa, mata uang untuk transaksi tetap menggunakan Rupiah, hanya saja ada perhitungan konversi dari Rupiah ke Dolar saat menggunakan metode pembayaran dengan PayPal.

Berikut adalah hal-hal yang harus dipertimbangkan dalam menggunakan PayPal dalam transaksi pembayaran, termasuk perhitungan konversi dari Rupiah ke Dolar, agar tidak rugi saat melakukan transaksi jual/beli:

  • Nilai tukar realtime (realtime exchange rates), untuk mendapatkan nilai tukar mata uang dengan akurat. Kita akan menggunakan API dari openexchangerates.org
  • Konversi mata uang dikenakan biaya 3.5% dari nominal yang dikonversi. Sebenarnya aplikasi yang melakukan konversi mata uang, pembayaran PayPal tetap menggunakan Dolar, hanya saja ketika kita menarik uang dari PayPal ke Bank di Indonesia dikenakan biaya konversi 3.5%. Informasi bisa dilihat di User Agreement PayPal
  • Paypal mengenakan biaya sampai dengan 4.4% dari nominal transaksi ditambah biaya tetap (fixed fee) $0.3. Informasi bisa dilihat dari laman seller fee PayPal

Mendapatkan Nilai Tukar Secara Realtime

Ada banyak penyedia API (Application Programming Interface) untuk mendapatkan nilai tukar atau exchange rates, kali ini kita akan menggunakan API dari openexchangerates.org. Silahkan kunjungi https://openexchangerates.org, kemudian lakukan pendaftaran dan dapatkan APP ID untuk memanggil API nilai tukar dari openexchangerates.org.

Setelah mendapatkan APP ID, berikut adalah kode untuk mendapatkan nilai tukar:

$api_app_id = "insert_app_id_of_openexchangeratesorg_here";
$api_url = "https://openexchangerates.org/api/latest.json?app_id=" . $api_app_id;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch); 
curl_close($ch);

Hasil dari pemanggilan API openexchangerates.org dalam bentuk JSON disimpan ke variabel $output, berikut adalah isi dari variabel tersebut:

{
  ...
  "base": "USD",
  "rates": {
    "AED": 3.673181,
    "AFN": 71.540544,
    ...
    "IDR": 14044.474311
    ...
  }
}

Menghitung Nilai Konversi

Variabel $output yang didapatkan dari hasil pemanggilan API dalam bentuk string yang berisikan data JSON. Selanjutnya aplikasi mengubah data tersebut ke dalam object PHP dengan men-decode data tersebut:

$exchange = json_decode($output);

Dari proses decode JSON tersebut, untuk mendapatkan nilai tukar Rupiah diambil dari variabel $exchange->rates->IDR.

Seperti telah disebutkan di atas bahwa ada biaya 3.5% dari nominal yang dikonversi. Untuk menghitung nilai tukar ditambah dengan biaya konversi adalah sebagai berikut:

$rate = (1 / $exchange->rates->IDR) + ((1 / $exchange->rates->IDR) * 0.035);

Menghitung Harga, Biaya dan Nilai Total Transaksi

Tetapkan harga ke dalam variabel $price, kemudian lakukan perhitungan harga dalam USD, biaya PayPal sampai dengan 4.4% + $0.3 dan total dari transaksi.

$price = 50000;
$price_usd = round($price * $rate, 2);
$paypal_fee = round(($price_usd * 0.044) + 0.3, 2);
$total = $price_usd + $paypal_fee;

Untuk mengetahui nilai dari perhitungan di atas, kita tampilkan hasil perhitungan di atas dengan kode berikut:

echo "Price: Rp. {$price}\n";
echo "1 USD: Rp. {$exchange->rates->IDR}\n";
echo "\n";
echo "Price USD: $ {$price_usd}\n"; 
echo "Paypal Fee: $ {$paypal_fee}\n";
echo "Total: $ {$total}\n";

Kode Lengkap

Dari semua proses yang telah dilalui, berikut adalah kode lengkap menghitung nilai konversi harga dari Rupiah ke Dollar jika menggunakan PayPal sebagai metode pembayaran:

<?php
$api_app_id = "insert_app_id_of_openexchangeratesorg_here";
$api_url = "https://openexchangerates.org/api/latest.json?app_id=" . $api_app_id;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch); 
curl_close($ch);

$exchange = json_decode($output);
$rate = (1 / $exchange->rates->IDR) + ((1 / $exchange->rates->IDR) * 0.035);

$price = 15000;
$price_usd = round($price * $rate, 2);
$paypal_fee = round(($price_usd * 0.044) + 0.3, 2);
$total = $price_usd + $paypal_fee;

echo "Price: Rp. {$price}\n";
echo "1 USD: Rp. {$exchange->rates->IDR}\n";
echo "\n";
echo "Price USD: $ {$price_usd}\n"; 
echo "Paypal Fee: $ {$paypal_fee}\n";
echo "Total: $ {$total}\n";

Simpan kode tersebut dalam file calculation.php, kemudian eksekusi seperti di bawah ini:


Tulisan ini adalah update dari tulisan yang telah diterbitkan sebelumnya dari https://steemit.com/programming/@saunghanan/perhitungan-konversi-untuk-pembayaran-rupiah-menggunakan-paypal-dengan-php-programming

Categories
Code

Membuat Data Dummy di Laravel dengan Seeder

UPDATE 12 Maret 2019: Tulisan ini diupdate menggunakan Laravel 5.8

Ketika mengembangkan aplikasi, kita butuh data dummy di masukkan ke database untuk melakukan pengujian bahwa proses aplikasi yang sedang dibangun telah berjalan dengan baik. Laravel menyertakan metode sederhana dalam melakukan hal tersebut dengan fitur Database Seeding.

Kita ambil contoh dari skema database yang telah dibuat pada tulisan sebelumnya, kita akan memasukkan data kota pada tabel cities.

Menulis Seeder

Untuk menghasilkan sebuah seeder, gunakan perintah Artisan make:seeder berikut:

php artisan make:seeder CityTableSeeder

Kelas seeder CityTableSeeder yang dihasilkan akan disimpan di direktori database/seeds. Di dalam kelas seeder terdapat metode run() yang di dalamnya dapat dimasukkan proses menambahkan data ke tabel. Buka file database/seeds/CityTableSeeder dan masukkan proses menambahkan data berikut:

public function run() {
    $cities = [
        ['name' => 'Jakarta', 'map' => 'https://goo.gl/maps/ugdFU'],
        ['name' => 'Bogor', 'map' => 'https://goo.gl/maps/ExzYT'],
        ['name' => 'Depok', 'map' => 'https://goo.gl/maps/30JxC'],
        ['name' => 'Tangerang', 'map' => 'https://goo.gl/maps/Yn0yZ'],
        ['name' => 'Bekasi', 'map' => 'https://goo.gl/maps/T17QQ']
    ];

    DB::table('cities')->insert($cities);
}

Proses penambahan data di atas menggunakan query builder yang disediakan Laravel.

Menjalankan Seeder

Laravel menyertakan kelas DatabaseSeeder yang dijalankan dengan perintah Artisan db:seed. Masukkan Kelas seeder yang ingin dijalankan dengan memanggil metode call(). Berikut isi metode run() yang berisikan kelas-kelas seeder yang dipanggil:

public function run()
{
    $this->call(CityTableSeeder::class);
}

Berikut perintah untuk menjalankan seeder:

php artisan db:seed

Selain menjalan seed yang dipanggil dari kelas DatabaseSeeder, kelas seeder tersendiri dapat dipanggil langsung dari perintah Artisan db:seed dengan menyertakan opsi –class:

php artisan db:seed --class=CityTableSeeder

Kode Github

Categories
Code

Database Migration pada Laravel, Version Control untuk Database

UPDATE 7 Maret 2019: Tulisan ini diupdate menggunakan Laravel 5.8

Kamu bekerja dalam tim pengembangan dan menginginkan skema database tetap terbaru meskipun teman satu tim lain melakukan perubahan? Ya, kamu bisa menggunakan fitur Database Migration pada Laravel untuk meyakinkan bahwa tim pengembang mempunyai skema database terbaru. Fitur ini mirip dengan version control untuk database.

Pada tulisan kali ini, kita akan membuat sebuah migration database dengan nama skema cities (bentuk data mirip dengan tutorial sebelumnya: Memulai Laravel PHP, Membuat Aplikasi Daftar Kota). Migration biasanya dipasangkan dengan fitur schema builder Laravel, sehingga di dalam menulis migration menggunakan schema builder yang digunakan untuk membangun skema database aplikasi.

Menghasilkan Kelas Migration

Untuk menghasilkan kode migrasi, kamu dapat menggunakan perintah Artisan make:migration. Berikut adalah contoh perintah membuat tabel cities:

php artisan make:migration create_cities_table

Setelah perintah tersebut dijalankan, output yang dihasilkan sebagai berikut:

Created Migration: 2019_03_07_040935_create_cities_table

Laravel menyimpan kode migration pada direktori database/migrations dan secara otomatis diberikan timestamp pada nama file yang memungkinkan Laravel untuk menentukan urutan migration. Lokasi migration dari contoh di atas adalah database/migrations/2019_03_07_040935_create_cities_table.

Berikut kode yang dihasilkan dari membuat migration yang telah dilakukan:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCitiesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cities', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cities');
    }
}

Struktur Migration

Kelas migration berisikan dua metode yaitu up() dan down(). Metode up() digunakan untuk menambahkan tabel baru, kolom dan indeks ke dalam database. Sedangkan metode down() mengembalikan operasi (rollback) yang telah dijalankan oleh method up().

Kita masukkan kode schema builder untuk membuat tabel cities di metode up():

public function up()
{
    Schema::create('cities', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('map');
        $table->timestamps();
    });
}

Sedangkan metode down() berisikan kode schema builder untuk menghapus tabel cities:

public function down()
{
    Schema::dropIfExists('cities');
}

Menjalankan Migration

Untuk menjalankan semua migration yang belum dijalankan menggunakan perintah berikut:

php artisan migrate

Sebelum menjalankan migrasi, pastikan koneksi database telah diatur melalui file .env:

...
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=password
...

Ketika perintah Artisan di atas dijalankan, skrip yang berada di dalam metode run() yang akan dijalankan. Perlu diperhatikan bahwa jika mendapatkan error “class not found”, coba jalankan perintah:

composer dump-autoload

Mengembalikan Migration

Untuk mengembalikan operasi migration terakhir dapat menggunakan perintah Artisan migrate:rollback.

php artisan migrate:rollback

Perlu dicatat bahwa semua file migration (batch) terakhir yang telah dijalankan akan dikembalikan, metode down() yang dijalankan. Untuk mengembalikan (rolling back) semua migration pada aplikasi, menggunakan perintah Artisan migrate:reset.

php artisan migrate:reset

Kode Github

Categories
Code

Memulai Laravel PHP, Membuat Aplikasi Daftar Kota

UPDATE 6 Maret 2019: Tulisan ini diupdate menggunakan Laravel 5.8. Klik di sini untuk mengetahui sistem yang dibutuhkan oleh Laravel 5.8.

Aplikasi akan memunculkan halaman web yang berisikan daftar kota sekitar Jakarta yang dikenal dengan Jabodetabek. Setiap item kota terdapat link yang mengarah ke lokasi peta kota tersebut. Langkah pembuatan aplikasi mulai dari instalasi Laravel, membuat routing dan view, sampai dengan hasil akhir dijalankan di web browser.

Instalasi Laravel

Laravel (http://laravel.com) menggunakan Composer (https://getcomposer.org) untuk instalasi dan pengelolaan dependency, pastikan Composer telah terinstal di komputer. Jika belum, instalasi dapat dilakukan melalui terminal (pada sistem operasi berbasis *nix):

curl -sS https://getcomposer.org/installer | php

Jika kamu menggunakan Windows, installer Composer dapat diunduh melalui https://getcomposer.org/Composer-Setup.exe. Informasi unduh Composer dapat dilihat langsung dari https://getcomposer.org/download/.