Cara menggunakan midtrans-php github

Gimana cara integrasi Midtrans di laravel/PHP kayak sistem sekolah koding penasaran saya....

@Nami

24 Kontribusi 1 Poin

Dipost: 4 tahun yang lalu Update 2 tahun yang lalu


Jawaban

Jadi buat akun developer/sandbox Buat akun payment gateway Trus ngoding https://api-docs.midtrans.com/ API. Tapi saya pakainya buat WordPress dan API payment gateway lain (PayPal, Authorize.Net, Stripe)

Cara menggunakan midtrans-php github

@Astried

9 Kontribusi 3 Poin

Dipost: 4 tahun yang lalu Update 4 tahun yang lalu


Pake composer kak, bisa di lihat github midtrans nya: https://github.com/midtrans/midtrans-php


Login untuk gabung berdiskusi

Melihat judul postingan ini, mungkin teman-teman sudah bisa membaca apa isi dari postingan kali ini. Ya, percobaan saya kali ini adalah integrasi midtrans di aplikasi yang dibangun menggunakan PHP. Midtrans ini saya gunakan sebagai payment gateway untuk menangani proses pembayaran. Karena tujuan awalnya itu untuk mempelajari cara kerja integrasi midtrans, jadi aplikasi yang saya jadikan studi kasus itu sederhana. Selain itu, di sini saya hanya menggunakan PHP native dan belum menggunakan framework apapun. Untuk integrasi midtrans dengan framework bisa kita bahas di lain waktu.

Studi kasus postingan kali ini cukup sederhana. Hanya ada tampilan daftar item yang dibeli dan tombol checkout, lalu ada proses pembayaran, lalu menerima notifikasi dari midtrans dan selesai. Ya, sesuai dengan judulnya aplikasi payment sederhana menggunakan PHP dan midtrans.

Ada beberapa tahapan untuk membangun aplikasi payment sederhana menggunakan PHP dan midtrans:

  • Step 1. Persiapan
  • Step 2. Create Halaman Checkout
  • Step 3. Create Checkut Process
  • Step 4. Create Notification Handler
  • Step 5. Uji Coba

Teman-teman ingin coba juga? Yuk, kita mulai.

Persiapan

Sebelum mengikuti tutorial ini, ada beberapa hal yang harus kita persiapkan:

Download dan Setup NGROK

Untuk keperluan uji coba menggunakan midtrans, aplikasi kita itu harus terhubung ke internet. Kabar baiknya kita bisa menggunakan NGROK untuk mengatasi problem tersebut. Teman-teman bisa coba mendaftar dulu untuk masuk ke dashboard NGROK dan mendapatkan authtoken.

Selanjutnya kita download terlebih dahulu ngrok. Kita bisa download langsung di web resminya. Setelah ngrok kita download (dengan nama file ngrok.zip), kita unzip ngrok.zip. Buka terminal lalu run command di bawah ini.

unzip /path/to/ngrok.zip

Kita bisa lihat ada file baru ngrok. Selanjutnya kita run ngrok, lalu kita hubungkan ke akun kita menggunakan authtoken.

ngrok authtoken 

Authtoken-nya ada di menu Getting Started > Your Authtoken. Sampai tahapan ini pengaturan ngrok sudah selesai, nanti kita coba gunakan untuk keperluan uji coba aplikasi.

Mendapatkan Midtrans API Access Key

Teman-teman harus punya API access key midtrans terlebih dahulu. Untuk mendapatkan key tersebut, teman-teman daftar terlebih dahulu dan selesaikan pendaftaran. Setelah itu masuk ke halaman dashboard dengan environtment sandbox (bisa lihat di sidebar ada opsi untuk mengubah environment). Di dalam halaman dashboard, masuk ke menu Settings (atau Pengaturan) lalu pilih sub menu Access Key.

Di halaman Access Key, terdapat Merchant ID, Client Key dan Server Key. Nanti kita akan pakai ketiganya, untuk client key nanti kita gunakan untuk authorization di front end, sedangkan Server Key untuk authorization di bagian backend.

Keterangan: Ada baiknya key ini tidak dibagikan kesiapapun, terutama Server Key.

Setup Codelab

Codelab ini kita gunakan untuk project payment sederhana menggunakan PHP dan midtrans. Sekarang kita akan buat folder khusus project kita. Buka terminal lalu buat folder baru.

mkdir payment-php-midtrans

lalu masuk folder yang baru saja kita buat.

cd payment-php-midtrans

Selanjutnya kita install package yang meng-handle integrasi dengan midtrans.

composer require midtrans/midtrans-php

Untuk menggunakan api key yang sudah kita dapatkan di tahapan sebelumnya, kita akan menggunakan file .env untuk menyimpan key. Jadi kita coba install terlebih dahulu package untuk membaca variable dari .env.

composer require vlucas/phpdotenv

Setelah package selesai terinstall, buat file baru dengan nama .env. Lalu kita masukan merchant id dan juga kedua api key midtrans.

MIDTRANS_MERCHANT_ID=isi-dengan-merchant-id
MIDTRANS_CLIENT_KEY=SB-Mid-client-isi-dengan-key-nya
MIDTRANS_SERVER_KEY=SB-Mid-server-isi-dengan-key-nya

Keterangan: Api Key yang kita pakai untuk environment sandbox ya.. bukan untuk production.

Ini tahapan opsional, jaga-jaga kalau aplikasinya diupload ke github. Buat file baru dengan nama .gitignore, lalu kita ketik beberapa file yang akan kita ignore apabila menggunakan git.

.env
log/*
vendor

Oke, codelab untuk aplikasi payment sederhana sudah selesai.

Create Halaman Checkout

Halaman ini akan menampilkan halaman untuk checkout ketika kita belanja di online store atau pun market place. Untuk membuat halaman checkout, buat file baru dengan nama index.php, lalu kita ketik baris kode berikut ini.




  
  
  
  Integrasi midtrans di aplikasi payment sederhana - qadrlabs.com


  

  

Cart:

  • Ebook Belajar PHP OOP at qadrLabs x @100000
  • Ebook Belajar Laravel 8 at qadrLabs x @180000

Total: Rp 280.000,00

Seperti yang terlihat pada baris kode di atas, halaman ini menampilkan daftar barang yang dibeli dan juga terdapat form untuk melakukan aksi checkout. Pada form tersebut, terdapat input yang disembunyikan yang berisi value total yang akan dibayarkan melalui payment gateway. Selain itu untuk prosesnya akan ditangani oleh file checkout-process.php yang akan kita buat di tahapan selanjutnya.

Create Checkout Process

Langkah selanjutnya adalah membuat file untuk menangani proses input dari halaman checkout. Buat file baru dengan nama checkout-process.php. Lalu kita ketik baris kode berikut ini.

load();

//Set Your server key
Midtrans\Config::$serverKey = $_ENV['MIDTRANS_SERVER_KEY'];
$clientKey = $_ENV['MIDTRANS_CLIENT_KEY'];

// Uncomment for production environment
// Midtrans\Config::$isProduction = true;

// Enable sanitization
Midtrans\Config::$isSanitized = true;

// Enable 3D-Secure
Midtrans\Config::$is3ds = true;

// Uncomment for append and override notification URL
// Midtrans\Config::$appendNotifUrl = "https://example.com";
// Midtrans\Config::$overrideNotifUrl = "https://example.com";

// Required
$transaction_details = array(
    'order_id' => rand(),
    'gross_amount' => 94000, // no decimal allowed for creditcard
);

// Optional
$item1_details = array(
    'id' => 'a1',
    'price' => 100000,
    'quantity' => 1,
    'name' => "Ebook Belajar PHP OOP at qadrLabs"
);

// Optional
$item2_details = array(
    'id' => 'a2',
    'price' => 180000,
    'quantity' => 1,
    'name' => "Ebook Belajar Laravel 8 at qadrLabs"
);

// Optional
$item_details = array($item1_details, $item2_details);

// Optional
$billing_address = array(
    'first_name'    => "Nadia",
    'last_name'     => "Rizky",
    'address'       => "Mangga 20",
    'city'          => "Sukabumi",
    'postal_code'   => "143115",
    'phone'         => "081122334455",
    'country_code'  => 'IDN'
);

// Optional
$shipping_address = array(
    'first_name'    => "Nadia",
    'last_name'     => "Rizky",
    'address'       => "Mangga 20",
    'city'          => "Sukabumi",
    'postal_code'   => "143115",
    'phone'         => "08113366345",
    'country_code'  => 'IDN'
);

// Optional
$customer_details = array(
    'first_name'    => "Nadia",
    'last_name'     => "Rizky",
    'email'         => "",
    'phone'         => "081122334455",
    'billing_address'  => $billing_address,
    'shipping_address' => $shipping_address
);

// Optional, remove this to display all available payment methods
$enable_payments = array('credit_card','cimb_clicks','mandiri_clickpay','echannel');

// Fill transaction details
$transaction = array(
    'enabled_payments' => $enable_payments,
    'transaction_details' => $transaction_details,
    'customer_details' => $customer_details,
    'item_details' => $item_details,
);

$snapToken = Midtrans\Snap::getSnapToken($transaction);
echo "snapToken = ".$snapToken;
$base = $_SERVER['REQUEST_URI'];

?>




    
    
    
    Checkout | Integrasi midtrans di aplikasi payment sederhana - qadrlabs.com




JSON result will appear here after payment:

Create Notification Handler

Setelah pengguna menyelesaikan proses pendaftaran melalui interface dari midtrans ataupun terdapat perubahan status transaksi, notifikasi via HTTP(S) POST / webhooks akan dikirimkan ke server. Nah untuk menangani notifikasi ini kita buat handler-nya. Kita buat file baru dengan nama notification-handler.php dan kita ketik baris kode berikut ini.

load();

Midtrans\Config::$isProduction = false;
Midtrans\Config::$serverKey = $_ENV['MIDTRANS_SERVER_KEY'];

$notif = new Midtrans\Notification();

$transaction = $notif->transaction_status;
$type = $notif->payment_type;
$order_id = $notif->order_id;
$fraud = $notif->fraud_status;

$message = 'ok';

if ($transaction == 'capture') {
    // For credit card transaction, we need to check whether transaction is challenge by FDS or not
    if ($type == 'credit_card') {
        if ($fraud == 'challenge') {
            // TODO set payment status in merchant's database to 'Challenge by FDS'
            // TODO merchant should decide whether this transaction is authorized or not in MAP
            $message = "Transaction order_id: " . $order_id ." is challenged by FDS";
        } else {
            // TODO set payment status in merchant's database to 'Success'
            $message = "Transaction order_id: " . $order_id ." successfully captured using " . $type;
        }
    }
} elseif ($transaction == 'settlement') {
    // TODO set payment status in merchant's database to 'Settlement'
    $message = "Transaction order_id: " . $order_id ." successfully transfered using " . $type;
} elseif ($transaction == 'pending') {
    // TODO set payment status in merchant's database to 'Pending'
    $message = "Waiting customer to finish transaction order_id: " . $order_id . " using " . $type;
} elseif ($transaction == 'deny') {
    // TODO set payment status in merchant's database to 'Denied'
    $message = "Payment using " . $type . " for transaction order_id: " . $order_id . " is denied.";
} elseif ($transaction == 'expire') {
    // TODO set payment status in merchant's database to 'expire'
    $message = "Payment using " . $type . " for transaction order_id: " . $order_id . " is expired.";
} elseif ($transaction == 'cancel') {
    // TODO set payment status in merchant's database to 'Denied'
    $message = "Payment using " . $type . " for transaction order_id: " . $order_id . " is canceled.";
}

$filename = $order_id . ".txt";
$dirpath = 'log';
is_dir($dirpath) || mkdir($dirpath, 0777, true);

echo file_put_contents($dirpath . "/" . $filename, $message);

Dari baris kode di atas, ketika terdapat notifikasi via webhook ataupun HTTP(S), handler akan membaca notifikasi lalu membaca status transaksi. Setiap ada perubahan transaksi, keterangannya akan ditulis di dalam variable $message. Karena di sini kita belum menggunakan database apapun, jadi kita coba tulis keterangan dari setiap prosesnya ke dalam file dengan ekstensi .txt.

Uji Coba

Untuk melakukan uji coba aplikasi payment sederhana ini, kita perlu mendaftarkan terlebih dahulu URL yang digunakan sebagai notification handler. Buka kembali dashboard midtrans, lalu masuk ke menu PENGATURAN, lalu pilih sub menu KONFIGURASI. Pada halaman ini terdapat form untuk mendaftarkan URL yang diperlukan seperti Payment notification URL, Recurring Notification URL, Finish Redirect URL dan lain-lain.

Untuk menangani webhook atau HTTP(S) POST notification, isi payment notification URL dengan url notification-handler.php, misalnya https://your-web.com/notification-handler.php ditulis menggunakan URL protocol prefix https. Ya, notikasinya mesti terhubung dengan internet. Midtrans tidak bisa mengirim notifikasi ke localhost, jadi kita coba pakai ngrok yang sudah kita siapkan sebelumnya.

Sekarang kita coba run dulu aplikasi payment.

php -S localhost:8080

Setelah itu kita buka terminal yang kedua untuk running ngrok. Di dalam direktori ngrok, kita run ngrok dengan port 8080.

./ngrok http 8080

Setelah kita run, nanti terdapat keterangan link aplikasi kita dengan format: https://3xxx-1xx-1x4-xx2-xxxx.ngrok.io/. Ya, linknya beda beda. Nah dengan menggunakan link ini kita sudah terhubung ke internet. Jadi kita bisa mendaftarkan link untuk Payment notification URL dengan URL https://3xxx-1xx-1x4-xx2-xxxx.ngrok.io/notification-handler.php.

Buka kembali halaman KONFIGURASI di dahsboard midtrans, di bagian Payment notification URL isi dengan link https://3xxx-1xx-1x4-xx2-xxxx.ngrok.io/notification-handler.php, setelah itu tekan button UPDATE.

Persiapan uji coba sudah selesai, selanjutnya kita bisa coba langsung buka aplikasi dengan menggunakan url dari ngrok. Kalau kita buka melalui chrome, halaman ini tidak bisa kita buka langsung, klik Visit this unsafe site untuk membukan halaman.

Di halaman awal tampil daftar item yang dibeli dan terdapat button checkout. Klik button checkout untuk masuk ke halaman checkout-process.php. Ketika membuka halaman ini, kita bisa lihat ada snapToken. SnapToken ini kita dapatkan setelah mengirim request menggunakan server key dan function getSnapToken() dari package midtrans.

$snapToken = Midtrans\Snap::getSnapToken($transaction);

Nah snapToken ini kita gunakan untuk memanggil built-in interface (snap) dari midtrans. Bisa kita lihat di bagian kode javascript.

snap.pay('',
    ... kode lainnya
)

Selanjutnya coba klik button Pay!. Kita bisa lihat ada interface untuk melakukan pembayaran. Pilih Continue, lalu pilih metode pembayaran (misalnya Mandiri), lalu klik SEE ACCOUNT NUMBER. Setelah itu kita bisa lihat Company Code dan juga Payment Code. Keterangan: ini hanya uji coba jadi tidak perlu mengirim uang betulan, sekali lagi mengingatkan jangan coba mengirim uang betulan ya.

Nah ketika selesai proses di atas, midtrans akan mengirimkan HTTP(S) POST notification dan kita bisa lihat di folder log terdapat file .txt, tanda notication handler kita berjalan dengan baik.

Penutup

Pada tutorial kali ini, yaitu membuat aplikasi payment sederhana menggunakan PHP dan midtrans, ada beberapa hal yang kita pelajari. Dimulai dari proses instalasi API Client dari midtrans sampai dengan uji coba proses pembayaran menggunakan built-in interface atau snap.

Berbeda dengan tutorial sebelumnya, aplikasi kita harus terhubung ke internet ketika proses uji coba, karena harus menerima notifikasi via HTTP(S) POST atau webhook dari midtrans. Di sini kita sudah coba menggunakan ngrok untuk tunneling, supaya aplikasi dapat diakses lewat internet dan supaya HTTP(S) POST dapat dihandle langsung oleh notification-handler. Selain itu, untuk mengetahui apakah proses pembayaran melalui midtrans berhasil atau gagal, kita sudah coba untuk menuliskannya ke dalam file .txt dan setelah uji coba kita bisa lihat beberapa file .txt setiap proses pembayaran atau terjadinya perubahan status transaksi.

Tertarik untuk eksplorasi lebih jauh? Selamat bereksperimen dan tetap semangat berkarya.