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