Pengalaman Implementasi Paypal

Setelah Paypal mengijinkan orang Indonesia untuk menerima pembayaran, saya mencoba untuk mengintegrasikan payment gateway dari Paypal dengan website Perkakasku.com. Perkakasku.com adalah toko online yang saya buat sendiri, sehingga untuk menginterasikan paypal juga harus manual juga.

Untuk dapat menerima pembayaran dengan kartu kredit dari paypal, anda harus membuat account terlebih dahulu, atau bila sudah memiliki account, account anda harus di upgrade ke Premiere / Bussiness Account. Bila menggunakan web shop dari OsCommerce, atau ZenCart atau lainnya, anda tinggal menambahkan plugin paypal.

Untuk yang toko online-nya custom made, ada 3 pilihan yang bisa digunakan : melalui form HTML, Name-Valued Pair (NVP) API, dan SOAP API. Dari semua itu yang paling mudah jelas form HTML, tapi saya sedikit ragu dengan keamanannya karena isi form bisa disadap. Yang paling sulit SDK API, saya baca manualnya saja sudah bingung, gimana lagi pakainya. NVP API mirip dengan SOAP API tapi lebih mudah.

Untuk toko online saya akhirnya dipilihlah NVP API, Alasannya yang pasti lebih aman daripada yang form HTML, lebih cepat juga, selain itu feel nya lebih dapet karena bisa bikin paypal lebih menyatu dengan website. Dengan NVP API, tidak usah masukin semua daftar item ke paypal, cukup totalnya saja, konsumen hanya dialihkan untuk login di paypal untuk mendaftar atau memilih kartu kredit yang digunakan untuk bayar, selanjutnya paypal ngirim token untuk kasih tahu bahwa kartu kredit konsumen sudah ok, dan langsung balik lagi ke website saya. Di website saya tinggal ditampilin lagi daftar belanja dari konsumen dan kalo konsumen sudah ok tinggal klik tombol dan terbayarlah sudah belanjaannya.

Pandunan untuk menggunakan NVP API dapat dilihat di Paypal Integration Center. Kalo saya sih download file samplenya, terus saya script samplenya disesuaikan dengan website saya, jauh lebih cepat. Bila menggunakan PHP, jangan lupa untuk mengaktifkan dulu module CURL, bila tidak script tidak akan jalan. Selain itu ada hal yang lain yang harus diperhatikan, tapi sebelumnya saya mau curhat dulu.

Ada satu hal yang cukup mengesalkan sewaktu saya mencoba menjalankan script NVP API di server webhosting Masterwebnet. Script tersebut tersebut tidak berjalan normal di server tersebut. Sewaktu script akan berhubungan dengan server Paypal, yang keluar adalah pesan shakehand di server Paypal, seperti About to connect to … dan seterusnya dan kemudian berhenti dan tidak berpindah ke halaman paypal. Padahal seharusnya pesan tersebut tidak ada, kalaupun ada seharusnya tidak ditampilkan dan website akan beralih ke halaman di server Paypal . Bila script tersebut dicoba dijalankan di server lokal saya dan juga server perusahaan webhosting lainnya, script tersebut dapat berjalan dengan normal.

Setelah komplain ke support dari Masterweb beberapa kali, hasilnya nihil, mereka hanya mengatakan kesalahan pada script. Kesalahan apa mereka juga tidak tahu. Sempat ada support yang mengatakan bahwa masalah ini akan dibicarakan pada forum mereka, tetapi setelah ditunggu hingga hampir 2 minggu (kepotong cuti lebaran). Mereka tetap berkesimpulan kesalahan pada script. Bagaimana itu kesalahan pada script, padahal di server lain, di server perusahaan webhosting lain yang lebih kecil dari masterwebnet jalan. Berulang kali saya komplain jawaban mereka hanya kesalahan pada script tanpa memberikan solusi lebih lanjut, kadangkala saya dipingpong untuk menghubungi support yang lalin, atau bahkan tidak menanggapinya, bahkan email terakhir saya ke suppport pun tidak dijawab. Memang ada salah satu support yang menawarkan solusi dengan menggunakan metode form HTML., tapi bukan solusi itu yang saya cari. Saya hanya minta pada mereka, bagian manakah dari script NVP API yang harus diubah agar dapat berjalan di server mereka. Melihat reputasi Masterwebnet, sebagai perusahaan webhosting paling besar di Indonesia, dengan jawaban support seperti itu sungguh sangat mengecewakan saya.

Akhirnya setelah berberapa hari ngutak-ngatik script, ketemu juga permasalahannya. Permasalahnyna hanya pada satu option dari CURL, yaitu CURLOPT_VERBOSE . Paypal menset opsi menjadi 1 (Satu). Tampaknya option ini bermasalah di server Masterwebnet, mungkin karena ada kesalahan pada waktu instalasi php atau module CURL. Karena dilihat dari maknanya mungkin opsi itu untuk memperlihatkan pesan shakehand dengan server tujuan atau dalam hal ini paypal, masalahnya pada server Masterwebnet setelah pesan tersebut keluar script tidak dilanjutkan lagi sehingga otomatis halaman tidak beralih ke server tujuan. Akhirnya saya coba untuk set ke 0 (Nol) dan script berjalan dengan baik. Jadi khusus untuk server Masterwebnet atau server lain yang mungkin mengalami masalah yang sama, agar script NVP API dari Paypal dapat berjalan, CURLOPT_VERBOSE harus di set ke 0 (Nol).

Semoga ini bisa jadi masukan juga buat rekan-rekan sekalian dan terutama Masterwebnet.
Sign up for PayPal and start accepting credit card payments instantly.

30 thoughts on “Pengalaman Implementasi Paypal

  1. informasi yang bagus….

    Pak Handi Limidjaja,
    Sebenarnya gimana sih flowcart/urut2an transaksinya ?
    Saya kok masih bingung akhir dari transaksi tsb..
    misal gimana cara mengetahui data2 buyer yg telah transaksi dg kita.

    Flowcart yg saya pake seperti ini…
    buyer memesan, kemudian saya arahkan ke tas belanja & checkout. Dari checkout diarahkan ke paypal.com (sesuai account kita & jumlah yg harus dibayar).
    pas disini saya bingung…apakah nantinya paypal mengirim data buyer ke kita atau gimana ya…?

  2. Pak Aswan, kalo dengan menggunakan script NVP API, flowchartnya kurang lebih begini :
    buyer memesan -> keranjang belanja -> checkout -> pembeli login ke paypal.com -> paypal memastikan kartu kredit valid dan limitnya cukup untuk transaksi kita ->

    kembali ke website kita, di sini saya menampilkan konfirmasi belanjaan -> Pembeli mengkonfirmasi transaksi -> di sini ada script di server kita yang berkomunikasi langsung dengan server paypal secara background -> paypal mendebet kartu kredit -> Bila transaksi berhasil, maka paypal akan memberi parameter tertentu, yang oleh script kita bisa disimpan ke dalam database. -> Transaksi selesai.

    Bingung ngga nih?

  3. Terima kasih atas jawabannya…

    Maaf pak Handi….
    Saya pake contoh skrip dari tutorial paypal, karena saya masih bingung dengan NVP API.
    Skrip saya seperti ini :

    “>
    “>

    >”>

    Namun saya masih bingung, dimana setelah buyer memesan & mengisi data identitas di kolom checkout (di webkita) kemudin kita alihkan ke paypal lalu buyer login di paypal, apakah nantinya kita dapat email yang beirisi informasi mengenai data identitas buyer (seperti : nama barang yang dipesan, jumlah transfer, nama & alamat buyer) dari paypal?

    Trim’s
    Aswan

    (Selamat tahun baru 2008…. semoga tambah sukses dengan Perkakasku.com….)

  4. Pak Aswan, berarti script yang bapak gunakan itu script form html standard. Sebenarnya flownya tidak jauh berbeda. Dengan script tersebut yang kita informasikan pada paypal itu account kita, item apa saja yang diorder buyer, dan nilai pembeliannya. Lalu juga kita memberkan informasi pada paypal mengenai :
    return url : alamat website tujuan customer bila transaksi sukses
    cancel url : alamat website tujuan customer bila transaksi gagal atau dibatalkan
    notify url: alamat website yang diakses oleh paypal secara background bila transaksi berhasil

    Nah pada alamat notify url ini, paypal akan memposting variable-variable untuk memberi tahu kita transaksinya gagal atau tidak, nilai pembayaran, account pembeli kita dan beberapa informasi lainnya. Pada alamat notify url ini kita bisa buat supaya informasi tersebut disimpan ke dalam database, dan / atau informasi tersebut dikirimkan melalui email kepada kita. Itu tergantung pada script kita di alamat notify url ini.

    Selain itu semua data transaksi juga disimpan oleh paypal dan bisa diakses melalui account kita di paypal.

    Selamat Tahun Baru juga Pak Aswan, semoga tambah sukses juga dengan batikmarkets.com -nya. :)

  5. Maaf nyambung pak Handy….
    Untuk return url & cancel url ndak ada masalah, namun untuk notify url inilah yg masih bingung..
    Makanya saya masih kosongkan isinya (….name=”notify_url” value=”http://www.batikmarkets.com/…….???) dan bingung proses selanjutnya….

    Ada nggak ya contoh skrip untuk yang begini ini dengan php ?

  6. Pak Aswan,
    Sebenarnya notify_url digunakan untuk memastikan script anda tidak dihack, dan pembayaran tetap anda terima di account anda. Proses menjalankan notify_url ini dilakukan secara background, sehingga halaman ini tidak akan ditampilkan.

    Saya ambil dari sample codenya paypal :

    // 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.0rn”;
    $header .= “Content-Type: application/x-www-form-urlencodedrn”;
    $header .= “Content-Length: ” . strlen($req) . “rnrn”;
    $fp = fsockopen (‘www.paypal.com’, 80, $errno, $errstr, 30);

    // perintah di atas paypal memastikan data berasal dari
    // server anda.

    // assign posted variables to local variables
    $item_name = $_POST['item_name'];
    $item_number = $_POST['item_number'];
    $payment_status = $_POST['payment_status'];
    $payment_amount = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];

    if (!$fp) {
    // HTTP ERROR
    } else {
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
    $res = fgets ($fp, 1024);
    if (strcmp ($res, “VERIFIED”) == 0) {
    // check the payment_status is Completed
    // check that txn_id has not been previously processed
    // check that receiver_email is your Primary PayPal email
    // check that payment_amount/payment_currency are correct
    // process payment
    // –>>>> Di sini anda bisa memasukkan data-data di atas
    // –>>>> ke database anda, atau juga ke email melalui
    // –>>>> perintah mail()
    }
    else if (strcmp ($res, “INVALID”) == 0) {
    // log for manual investigation
    }
    }
    fclose ($fp);

  7. Pak Handi….
    Untuk variabel nama dan alamat pembeli kok nggak ada ya ?
    Karena kita kan perlu tahu nama dan alamat pembeli guna proses pengiriman barangnya……

    Lagi pak Handi…,
    Untuk membuat file notify_url, seandainya saya copy paste skrip dari pak Handi dan ditambahin skrip untuk pengiriman email konfirmasi (seperti tampak dibawah ini), sehinnga alamat notify ==> name=”notify_url” value=”http://www.batikmarkets.com/notify.php


    $value) {
    $value = urlencode(stripslashes($value));
    $req .= “&$key=$value”;
    }
    // post back to PayPal system to validate
    $header .= “POST /cgi-bin/webscr HTTP/1.0rn”;
    $header .= “Content-Type: application/x-www-form-urlencodedrn”;
    $header .= “Content-Length: ” . strlen($req) . “rnrn”;
    $fp = fsockopen (‘www.paypal.com’, 80, $errno, $errstr, 30);
    // perintah di atas paypal memastikan data berasal dari server anda.
    // assign posted variables to local variables
    $item_name = $_POST['item_name'];
    $item_number = $_POST['item_number'];
    $payment_status = $_POST['payment_status'];
    $payment_amount = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];
    if (!$fp) {
    // HTTP ERROR
    } else {
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
    $res = fgets ($fp, 1024);
    if (strcmp ($res, “VERIFIED”) == 0) {
    // check the payment_status is Completed
    // check that txn_id has not been previously processed
    // check that receiver_email is your Primary PayPal email
    // check that payment_amount/payment_currency are correct
    // process payment
    // ->>>> Di sini anda bisa memasukkan data-data di atas
    // ->>>> ke database anda, atau juga ke email melalui
    // ->>>> perintah mail()

    // NEW INSERT UNTUK PENGIRIMAN EMAIL KONFIRMASI
    function sendmail_html($from_name,$from_mail,$to,$subject,$message) {
    $headers.= “From: $from_name rn”;
    $headers.= “Mime-Version: 1.0nContent-type: text/html;charset=iso-8859-1″;
    $headers.= “Reply-To: $from_name rn”;
    $headers.= “X-Mailer: Batikmarkets.com”;
    @mail($to,$subject,$message,$headers);
    }
    $date = date(“mgi”);
    $invoice = BM.”".$date;
    include(“buyer.php”); //

    Gimana apakah sudah benar/belum ya…?

  8. Pak Aswan,
    Kalo di web saya sih nama pembeli, alamat pembeli dimasukkan terlebih dahulu sebelum mereka diarahkan ke paypal.

    untuk bagian ini kalo saya sih kurang lebih isinya begini :
    // ->>>> Di sini anda bisa memasukkan data-data di atas
    // ->>>> ke database anda, atau juga ke email melalui
    // ->>>> perintah mail()
    $qsql = @mysql_query(“INSERT INTO drpaypal SET item_name = $item_name , item_number = $item_number …. dan seterusnya “);
    $headers = …. kurang lebih sama isinya dengan anda
    mail(“cs@perkakasku.com”,”Pembayaran Paypal”,”Ada pembayaran sejumlah : $payment_amount dari $payer_email”,$headers);

    terus kalo ngga salah alamat notify_url juga didaftarkan juga pada bagian profil di paypal.

    semoga membantu pak Aswan..

  9. Oh ya…
    di web pak Handi menggunakan login ya..?
    Jadi otomatis buyer menjadi member.
    Sedangkan di tempatku ndak pake login, tapi buyer diarahkan ke checkout sebelum ke paypal. Nah disinilah saya kesulitan mengambil data buyer yang telah diisi di checkout (nama & alamat).

    Pak Handi, kalo kasusnya seperti punyaku, solusinya gimana ya ?

    maaf pak Handi…jadi diskusi nich kelanjutannya…
    karena sebenarnya background saya bukan IT tapi akuntansi (ekonomi). Tapi karena keinginan saya mempunya web, maka saya beranikan diri tanya kesana-kemari. harap maklum…..

  10. Pak Aswan, mungkin solusinya di simpan dulu datanya ke dalam session, nanti begitu akses ke notify_url-nya kan bisa diambil datanya melalui session tersebut.
    Bagaimana? Tapi saya rasa ada bagusnya disimpan dulu ke dalam database mysql-nya.

    Info lebih lanjut tentang session bisa dilihat disini http://id2.php.net/session

    Tapi bila kesulitan, bagaimana bila pembeli baru mengisi datanya setelah pembayaran mereka berhasil di paypal?

    Ga papa pak Aswan, bagus kok. Saya juga sama-sama masih belajar :)

  11. Hallo pak Handi ?
    Terima kasih atas tutorialnya selama ini.
    Akhirnya saya putuskan untuk membuat flowcart-nya yaitu dari checkout => konfirmasi (disini langsung mengirimkan email konfirmasi ke admin) => paypal (dg notify dari pak Handi & daftarkan di paypal) ==> terima kasih (web kita).

    Namun saya belum bisa memastikan ini bisa atau ndak, karena belum diujicoba.

    pak Handi… kalo pengin mencobanya gimana ya ?
    Karena saya cuma punya 1 account (account diatas).
    Sedangkan untuk membuka account dg cc yg udah saya daftarkan untuk account diatas kok udah nggak bisa.

  12. Maaf pak Handi,
    kemarin lusa saya daftar di paypal sandbox tapi kok nggak dapat email komfirmasi ya ?
    Ketika saya paksakan untuk login, eh nggak bisa dan disuruh memasukkan email untuk mendapatkan instruksi dari paypal sandbox. Ketika saya masukkan dan cek di email, ternyata masih belum dapat email konfirmasinya.

    Apakah ada yang salah dengan pendaftaran saya ya ?

    nb: email yang saya pakai berbeda dengan email untuk paypal saya.

  13. Pak Aswan, seharusnya sih tak masalah ya emailnya berbeda, saya sendiri menggunakan email yang memang berbeda untuk paypal sandbox. Bisa coba cek folder junk / spamnya siapa tahu masuk ke situ atau bisa juga coba menggunakan email yang lain?

  14. Maaf pak Handi,
    Setelah gagal mendaftar di paypal sandbox, akhirnya saya coba daftar lagi, eh…ternyata bisa.
    Kemudian saya login dan test account sehingga mendapatkan account aswan_120XXXXXXX_per@batikm
    arkets.com dengan password 2011xxxxxx.

    Dengan account & password yg dikasih paypal sendbox tsb, akhirnya saya masuk toko online saya & melakukan transaksi (ujicoba) dan masuk ke paypal untuk pembayaran. Ketika saya login dengan account & password tsb kok nggak bisa ya… disitu ada pesan “The information you entered doesn’t match our records. Please try again”

    Saya coba dengan account untuk daftar ke paypal sandbox, ternyata gagal juga….

    Apakah cara yang lakukan salah atau gimana ya seharusnya ?
    Mohon pencerahannya…

  15. Pak Aswan, script bapak sudah diarahkan ke server sandbox belum? soalnya account yang di server sandbox berbeda dengan server yang nyatanya.. bila sudah coba ganti password dari test account yang dibuat ato coba bikin lagi test account yang baru.

  16. Maaf pak Handi,
    Diarahkan ke server sandbox maksudnya gimana ya ?
    Apa…. action=”https:// secure.paypal.com/cgi-bin/webscr” method=”post” diganti menjadi https:// developer.paypal.com/
    atau gimana? saya belum tahu maksud pak Handi…
    mungkin bisa diperjelas ….?

  17. hallo pak Handi…
    Maaf ngerepotin lagi nih….
    barusan saya coba untuk test paypal saya udah bisa belum di toko online saya. maka saya test dengan account paypal betulan.
    untuk web saya pakai account = adbatik@gmail.com
    untuk pembeli saya pakai account = batik@gmail.com

    * pertama saya transaksi, kemudian masuk ke web paypal dan terpampang daftar item dan jumlah yang harus dibayar.
    * lalu saya login dengan batik@gmail.com. eh….., ternyata kok ndak langsung ke halaman web yang saya rujuk (type=”hidden” name=”return” value=”http://www.batikmarkets.com/en/thanks.php”) tapi tampil pilhan “click here to retry” dan “Return to the homepage”.
    saya coba klik pesan pertama tapi ndak ada respon
    kemudian saya klik Return to the homepage ternyata kita malah digiring ke account paypal pembeli (batik@gmail.com).
    Kemudin saya cek di account paypal adbatik@gmail.com ternyata ndak ada pemasukan.

    Apakah ada yang salah dengan skrip saya ya ?

    nb:
    maaf, nama account paypal tsb diatas saya samarkan.

  18. Silahkan pak Handi, dengan senang hati……

    Jika pak Handi mau saya kirimkan skrip yang berhubungan dengan ini, silahkan sebutkan email bapak (email boleh sementara/tidak pribadi).
    email saya aswan@wicaksana.co.id (email tempat kerja)

    Atau mungkin pak Handi mau mencoba via toko online…..
    Saya bisa aktifkan stoknya 1 & harga $ 1 untuk produk tertentu (saat ini stock sengaja saya isi 0 (nol) biar tidak ada transaksi, mengingat web belum selesai).
    Jika ini sukses saya akan mengembalikan sebesar $ 1 juga sebagaimana pak Handi transaksi ujicoba ini.

    Mungkin pak Handi bisa via email diatas, karena fasilitas internet tempat kerja sekarang dibatasi dari pukul 12.00 s/d 13.30.

    Mudah2an ini bisa untuk pencerahan………

  19. mas,saya lagi jajal juga nih pake paypal integration wizard di servernya masterweb..

    trus ketemu masalah :
    Fatal error: Call to undefined function: curl_init() in /home/sloki/user/t86211/sites/ngiklan.com/www/login/paypalfunctions.php on line 260

    kira2 knapa ya? apa CURL-nya ga enable?

  20. mas [jagoan], kayanya sih memang belum di enable CURL-nya. Coba ditambahkan dulu modul CURL nya dengan mengedit php.ini, ini bisa dilakukan melalui spanelnya masterweb.

  21. mas, soal CURL udah ketemu..

    jadi saya cobain pake prosedur dari http://integrationwizard.x.com/ nih, yg pake button express checkout..

    saya bikin account penjual & pembeli di sandbox.. trus si pembeli klik button express checkout.. login ke paypal.. pilih pembayaran dr paypal balance.. trus klik continue.. dan diredirect kembali ke situs toko online saya..

    masalahnya, kenapa ya balance si pembeli tidak berkurang & balance si penjual tidak bertambah..?

    maap nih saya byk tanya.. :)

  22. Hmm, saya pribadi belum sempat nyoba integration wizard. Pendapat saya mungkin harus dilihat dulu apakah variabel amount (AMT) tidak diset 0. Kalo semuanya sudah benar, mungkin ada masalah di server sandbox-nya.

  23. halo pak.
    saya baru saja merintis toko online menggunakan cubecart.
    di dalam menu gateaway memang sudah ada pypal support, ada yang IPN, express checkout dan direct payment. tapi, jujur saja saya malah bingung. sudah dicoba semuanya tapi nggak pernah berhasil paymentnya.
    what should I do? ada saran pak?
    thanks

  24. Halo pak…
    keren bgt, tutorial nya sangat membantu. tapi ada sedikit problem ini pak??
    kalau saya menggunakan ‘subscription’, apakah notify url nya juga akan dijalan kan tiap bulan tiap ada pembayaran dari customer???
    mohon bantuannya

  25. Thx bgt infonya berguna pak…
    Hmmm, saya mau tanya sklian nih mengenai paypal, saya mau membuat script pembayaran sebanyak $10, jd ada button “CheckoutWithPaypal” yang pasti dikenai biaya $10… Nah, ini bagusnya pake Express Checkout aja ya pak??
    Oh iya, saya cm pny PP yg personal, baru aja buat yg business, utk memanfaatkan API dari PP harus pake business toh, udah buat, tapi belum diverifikasi, apakah untuk test2 aja di sand perlu verifikasi?????
    thx yah pak, mohon bantuannya

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>