Saat ini semakin banyak saja website yang menjual jasa atau produk, entah itu sekedar untuk donasi (cakephp.org), unsur having fun macam download komik dan film (narutofan.com), jualan game (play-asia.com), virtual credit card (trucards.com), bahkan jasa underground sekalipun tidak mau kalah ketinggalan (rentacracker.com). Sayangnya belum banyak para pelaku bisnis internet di indonesia yang memanfaatkannya, padahal paypal indonesia sudah dibuka (meskipun masih bisa untuk pembayaran saja) dan egold pun sudah semakin merakyat.
Sebelum anda memulai tutorial ini, pastikan anda memiliki account di Paypal Developer Central. Lalu buatlah dua account paypal sandbox berbeda, satu untuk merchant yang akan menerima pembayaran dan satu untuk pembeli untuk melakukan pembayaran. Jangan lupa untuk melakukan deposit sejumlah uang ke account pembeli, biasanya saya menambahkan sebesar $10,000 (gratis).

Tutorial kali ini tetap mengambil contoh website seolinkbid. Dimana pada website ini, pengunjung dapat membeli space linkback.
Bagaimana alur transaksi terjadi
- Pembeli masuk website seolinkbid.com, menuju ke halaman 'Buy a Link' dan mengisi form, lalu tekan tombol submit.
- Seketika setelah tombol submit ditekan, pembeli akan dibawa ke website payment gateway, dalam hal ini adalah paypal.com.
- Pembeli mengisi data paypalnya dan melakukan pembayaran.
- Apabila pembayaran gagal, proses berhenti di sini atau mengulang kembali ke nomor 3.
- Apabila pembayaran sukses, maka pembeli akan menerima email konfirmasi pembelian, begitu juga dengan merchant juga menerima email konfirmasi pembelian.
- Disamping menerima email konfirmasi, merchant juga menerima konfirmasi dari paypal dalam bentuk server-to-server confirmation, dalam hal ini disebut Paypal IPN (Instant Payment Notification). Nah IPN inilah yang bertanggungjawab dalam mengotomatisasi deliveri ke pihak pembeli. Nantinya kita akan membuat script untuk menangani IPN ini.
Mengirim data pembelian ke paypal.com
Pada saat pembeli berada di halaman 'Buy a Link', maka program kita mengumpulkan informasi item yang hendak dibeli, dalam hal ini adalah
- alamat email pembeli
- url
- title
- description line 1
- line 2
- bid atau jumlah uang yang harus dibayarkan
Dari data-data ini tidak semuanya akan dikirimkan kepada paypal, namun sebagian saja yang HANYA dibutuhkan oleh paypal, selebihnya anda dapat menyimpannya di dalam database. Untuk memperjelas, simak potongan kode berikut (add.php)
$query =
"insert into slb_link
(email, title, url, desc_1, desc_2,
submit_date, seo_title, bid, latest_bid_date, active)
values
('{$_POST['email']}', '{$_POST['title']}', '{$_POST['url']}',
'{$_POST['desc_1']}', '{$_POST['desc_2']}',
now(), '{$seo_title}', '{$_POST['bid']}', now() , 0)";
$result =
$db->
Execute($query);
$link_id =
$db->
Insert_ID();
$title =
$_POST['title'];
include('gateway/paypal.php');
Saya memisahkan antara bagian program utama dengan fungsi yang berhubungan dengan payment system, dengan membuatnya menjadi independent dan modular akan mempermudah kita nantinya untuk menambah berbagai macam payment gateway.
Pada panduan yang disediakan oleh Paypal, kita harus mengirimkan data ke server paypal dalam bentuk METHOD POST. Untuk itu saya menggunakan form dan dengan menginstruksikan browser untuk mengirim data setelah form selesai di-load. Berikut adalah kode dari paypal.php.
<?
$paypal_email = $config['paypal_email'];
$item_name = "[{$config['website_name']}][BID] TITLE: ". $title . ", ID:" . $link_id;
$currency_code = 'USD';
$total = $_POST['bid'];
$custom = $link_id . "|" . $_POST['bid'];
$notify_url = $config['website_url'] . '/gateway/paypal-ipn.php';
$return_url = $config['website_url'] . "/{$seo_title}.html";
$cancel_url = $config['website_url'];
?>
<body onLoad="document.payment.submit()">
<form name="payment" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="<?= $paypal_email; ?>">
<input type="hidden" name="rm" value="2">
<input type="hidden" name="item_name" value="<?= $item_name; ?>">
<input type="hidden" name="item_number" value="1">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="cs" value="0">
<input type="hidden" name="currency_code" value="<?= $currency_code ?>">
<input type="hidden" name="amount" value="<?= $total; ?>">
<input type="hidden" name="invoice" value="<?= $invoice_id; ?>">
<input type="hidden" name="custom" value="<?= $custom; ?>">
<input type="hidden" name="notify_url" value="<?= $notify_url; ?>">
<input type="hidden" name="return" value="<?= $return_url; ?>">
<input type="hidden" name="cancel_return" value="<?= $cancel_url; ?>">
</form>
Kode diatas terbagi menjadi dua bagian. Yang pertama adalah bagian inisialisasi nilai yang akan dikirim ke paypal. Berikutnya adalah bagian data-data yang akan dikirimkan. Saya menggunakan cara ini sekedar untuk mempermudah pembacaan dan perubahan data semata. Perlu anda perhatikan bahwa perintah onLoad="document.payment.submit()" akan segera mengirimkan data setelah halaman selesai di-load, dan data akan dikirimkan ke https://www.sandbox.paypal.com/cgi-bin/webscr. Alamat tersebut adalah alamat paypal sandbox, yang HANYA anda gunakan selama proses development. Pada saat proses deployment, anda harus menghapus kata sandbox dan mengarahkannya ke server paypal sesungguhnya yaitu: https://www.paypal.com/cgi-bin/webscr.
Penjelasan data berikutnya kurang lebihnya seperti berikut:
<input type="hidden" name="business" value="<?= $paypal_email; ?>">
Alamat paypal anda sebagai merchant yang menerima pembayaran.
<input type="hidden" name="item_name" value="<?= $item_name; ?>">
Nama item yang dijual.
<input type="hidden" name="currency_code" value="<?= $currency_code ?>">
Kode mata uang.
<input type="hidden" name="amount" value="<?= $total; ?>">
Total nilai transaksi.
<input type="hidden" name="custom" value="<?= $custom; ?>">
Data di sini adalah data sembarang yang anda perlukan untuk aplikasi anda. Dalam hal ini, seolinkbid mengirimkan data link_id dan nilai bid. Karena tipe data yang diterima di sini adalah bentuk string, maka saya menggunakan delimiter '|' sebagai pembatas data, yang kemudian diperlukan parsing untuk membacanya kembali.
<input type="hidden" name="notify_url" value="<?= $notify_url; ?>">
Alamat dari Paypal IPN, yaitu alamat url dari program kita yang melakukan proses otomatisasi.
<input type="hidden" name="return" value="<?= $return_url; ?>">
Alamat url ketika transaksi telah berhasil, biasanya menuju halaman terima kasih atau ke client area, tergantung dari kasus yang anda kerjakan.
<input type="hidden" name="cancel_return" value="<?= $cancel_url; ?>">
Alamat url ketika transaksi gagal, biasanya menuju halaman konfirmasi transaksi gagal, atau cukup arahkan ke homepage saja.
Script Paypal IPN
Kode IPN yang anda buat HARUS mengikuti aturan yang telah ditetapkan oleh paypal, hal ini untuk menjaga keamanan transaksi. Setelah pembeli melakukan pembayaran dan menghasilkan status sukses, maka paypal akan mengirim konfirmasi ke server kita. Dalam panduan yang disediakan oleh paypal, dijelaskan bahwa data yang dikirimkan oleh paypal adalah data dalam bentuk POST. Data ini tidak serta merta langsung kita baca, tetapi kita perlu mengembalikan data ini lagi kepada paypal sebagai bentuk konfirmasi. Selanjutnya paypal mengirim data kembali beserta status dari pembayaran, antara lain VERIFIED berarti sukses, dan INVALID berarti gagal. Terdapat beberapa kode lainnya, namun saat ini cukup kita pahami dulu yang paling penting yaitu VERIFIED. Berikut adalah kode dari paypal-ipn.php.
<?
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('sandbox.paypal.com', 80, $errno, $errstr, 30);
if ($fp) {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
if ($_POST['receiver_email'] == $paypal_email) {
//-------------------------
//.. Put custom action here
//-------------------------
include "../init.php";
// get the custom value
$raw_data = explode('|',$_POST['custom']);
$bid = array_pop($raw_data);
$link_id = array_pop($raw_data);
$query = "update olb_link set active = 1 and bid = {$bid}
where link_id = {$link_id}";
$result = $db->Execute($query);
//-----------------------
//.. End of custom action
//-----------------------
}
}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}
?>
Pada kode di atas kita menempatkan kode untuk mengotomatisasi transaksi, setelah kita cek sebelumnya bahwa statusnya adalah VERIFIED. Pada kasus seolinkbid di atas, saya hanya mengupdate nilai dari field active menjadi 1 dan nilai bid menjadi nilai bid saat ini. Untuk kasus lainnya, anda dapat menambahkan kode-kode yg diperlukan di bagian ini. Perhatikan juga pada potongan kode $fp = fsockopen ('sandbox.paypal.com', 80, $errno, $errstr, 30);, anda perlu menghapus kata sandbox ketika melakukan deployment.
Pada tutorial ini anda telah mempelajari hal yang sangat mendasar dalam melakukan integrasi. Namun materi di sini sudah sangat cukup untuk menjadi bekal untuk mengembangkannya lebih lanjut, misalnya untuk pembayaran subscription, atau untuk menambah faktor keamanan lainnya. Pada tutorial berikutnya kita akan mempelajari integrasi dengan payment system lainnya, yaitu E-GOLD.COM.