Cara Membuat QR Code untuk Verifikasi Invoice Laravel
Apa Itu QR Code Verifikasi Invoice?
QR Code verifikasi invoice adalah kode yang dapat dipindai menggunakan kamera smartphone untuk membuka halaman verifikasi invoice.
Contoh alurnya:
Invoice PDF
↓
QR Code
↓
Scan dengan Smartphone
↓
Halaman Verifikasi
↓
Invoice Valid / Tidak Valid
Informasi yang dapat ditampilkan:
Nomor invoice.
Tanggal invoice.
Nama pelanggan.
Total transaksi.
Status pembayaran.
Waktu verifikasi.
Install Library QR Code
Salah satu package yang dapat digunakan adalah Simple QR Code.
Install menggunakan Composer:
composer require simplesoftwareio/simple-qrcode
Kemudian QR Code dapat dibuat dari URL verifikasi invoice.
Membuat Route Verifikasi
Tambahkan route:
Route::get(
'/invoice/{invoice}/verify',
[InvoiceController::class, 'verify']
)->name('invoice.verify');
Contohnya, invoice dengan ID 125 memiliki URL:
https://example.com/invoice/125/verify
Namun, untuk keamanan sebaiknya jangan menggunakan ID database secara langsung sebagai kode verifikasi.
Gunakan Token Verifikasi
Tambahkan kolom token pada tabel invoice:
$table->string('verification_token')
->unique();
Kemudian buat token ketika invoice dibuat:
use Illuminate\Support\Str;
$invoice = Invoice::create([
'invoice_number' => $invoiceNumber,
'customer_id' => $request->customer_id,
'verification_token' => Str::random(64),
'invoice_date' => now(),
'total' => $request->total,
]);
Contoh URL:
https://example.com/invoice/verify/8f72a9...
Token tersebut digunakan sebagai identitas publik invoice.
Membuat Halaman Verifikasi
Pada controller:
public function verify(string $token)
{
$invoice = Invoice::where(
'verification_token',
$token
)->first();
if (!$invoice) {
return view(
'invoices.invalid'
);
}
return view(
'invoices.verify',
compact('invoice')
);
}
Jika token ditemukan, invoice dianggap valid.
Membuat QR Code
Pada halaman atau template invoice:
use SimpleSoftwareIO\QrCode\Facades\QrCode;
Kemudian:
{!! QrCode::size(120)->generate(
route(
'invoice.verify',
$invoice->verification_token
)
) !!}
QR Code tersebut akan berisi URL verifikasi.
Menampilkan QR Code pada PDF
Jika invoice dibuat menjadi PDF, QR Code dapat ditempatkan pada bagian bawah invoice.
Contohnya:
<div class="verification">
<p>
Scan QR Code untuk verifikasi invoice
</p>
{!! QrCode::size(100)->generate(
route(
'invoice.verify',
$invoice->verification_token
)
) !!}
</div>
Hasilnya kira-kira:
┌─────────────────────────────┐
│ INVOICE │
│ │
│ No: INV/2026/08/000001 │
│ Total: Rp1.500.000 │
│ │
│ [ QR CODE ] │
│ │
│ Scan untuk verifikasi │
└─────────────────────────────┘
Membuat Halaman Invoice Valid
Contoh Blade:
<h1>Invoice Valid</h1>
<p>
Nomor Invoice:
{{ $invoice->invoice_number }}
</p>
<p>
Tanggal:
{{ $invoice->invoice_date->format('d/m/Y') }}
</p>
<p>
Total:
Rp {{ number_format(
$invoice->total,
0,
',',
'.'
) }}
</p>
<p>
Status:
{{ strtoupper($invoice->status) }}
</p>
Halaman tersebut dapat dibuat lebih sederhana agar pelanggan langsung mengetahui bahwa invoice berhasil diverifikasi.
Jika Invoice Tidak Valid
Buat:
resources/views/invoices/invalid.blade.php
Contohnya:
<h1>Invoice Tidak Ditemukan</h1>
<p>
Nomor invoice tidak dapat diverifikasi.
</p>
<p>
Silakan hubungi pihak penerbit invoice.
</p>
Jangan menampilkan informasi database atau error internal kepada pengguna.
Tambahkan Status Pembayaran
Halaman verifikasi dapat menampilkan:
Invoice : INV/2026/08/000001
Tanggal : 23/08/2026
Total : Rp1.500.000
Status : LUNAS
Status dapat dibuat berdasarkan field:
$invoice->status
Contohnya:
UNPAID
PAID
CANCELLED
EXPIRED
Dengan demikian QR Code tidak hanya memverifikasi keberadaan invoice, tetapi juga membantu pelanggan mengetahui status dokumen tersebut.
Jangan Masukkan Data Sensitif ke QR Code
Hindari memasukkan data seperti:
NIK
Nomor rekening
Password
Token pembayaran
Data kartu
Data pribadi lengkap
QR Code cukup berisi URL verifikasi atau identifier acak.
Contohnya:
https://example.com/verify/8f72a9...
Data invoice kemudian diambil dari server.
Tambahkan Signature untuk Keamanan
Untuk sistem dengan kebutuhan keamanan lebih tinggi, URL verifikasi dapat menggunakan signed URL atau token acak yang tidak mudah ditebak.
Laravel menyediakan signed URL untuk memastikan URL tidak dimodifikasi tanpa terdeteksi.
Contohnya:
URL::signedRoute(
'invoice.verify',
[
'invoice' => $invoice->id,
]
);
Pada route:
Route::get(
'/invoice/{invoice}/verify',
[InvoiceController::class, 'verify']
)->name('invoice.verify')
->middleware('signed');
Pendekatan ini dapat menjadi lapisan keamanan tambahan.
QR Code untuk Invoice yang Sudah Dibatalkan
Invoice yang dibatalkan tetap dapat ditemukan, tetapi statusnya harus ditampilkan dengan jelas.
Contohnya:
Invoice: INV/2026/08/000001
Status:
DIBATALKAN
Invoice ini tidak lagi berlaku.
Jangan menghapus data invoice hanya karena statusnya dibatalkan jika sistem membutuhkan riwayat transaksi.
QR Code untuk Invoice Lunas
Untuk invoice yang sudah dibayar:
✓ INVOICE VALID
Nomor:
INV/2026/08/000001
Status:
LUNAS
Total:
Rp1.500.000
Informasi tersebut membantu pelanggan atau pihak lain melakukan pengecekan tanpa harus meminta dokumen tambahan.
Contoh Alur Lengkap
Pelanggan melakukan transaksi
↓
Laravel membuat invoice
↓
Generate nomor invoice
↓
Generate verification token
↓
Simpan invoice
↓
Generate QR Code
↓
QR Code dimasukkan ke PDF
↓
Invoice dikirim ke pelanggan
↓
Pelanggan melakukan scan
↓
Laravel memeriksa token
↓
Tampilkan status invoice
Fitur Tambahan yang Bisa Dibuat
Sistem verifikasi dapat dikembangkan dengan:
QR Code invoice.
Nomor invoice otomatis.
Status pembayaran realtime.
Digital signature.
Timestamp verifikasi.
Link download invoice.
Cetak ulang invoice.
Riwayat perubahan status.
Payment gateway.
WhatsApp invoice.
Untuk sistem multi-cabang, QR Code juga dapat menampilkan informasi cabang penerbit invoice.
Kesalahan yang Perlu Dihindari
Menggunakan ID Database sebagai QR Code
ID seperti:
/invoice/125
lebih mudah ditebak.
Gunakan token acak atau signed URL.
Menyimpan Data Invoice di QR Code
QR Code sebaiknya berisi URL verifikasi, bukan seluruh informasi transaksi.
Tidak Menggunakan HTTPS
Halaman verifikasi invoice sebaiknya menggunakan HTTPS untuk melindungi komunikasi antara perangkat pelanggan dan server.
Tidak Memeriksa Status Invoice
Invoice yang dibatalkan atau expired tetap dapat ditemukan, tetapi statusnya harus ditampilkan dengan benar.
Membuka Data Sensitif
Tampilkan informasi yang diperlukan untuk verifikasi saja.
QR Code Invoice Bersama Ovla Media
Ovla Media dapat membantu mengembangkan sistem invoice dan verifikasi digital untuk:
Invoice PDF.
QR Code verification.
Digital signature.
Payment gateway.
QRIS.
WhatsApp invoice.
Sistem multi-cabang.
Point of Sales.
Sistem billing.
Aplikasi bisnis custom.
Sistem dapat dibuat agar pelanggan cukup melakukan scan QR Code untuk memastikan invoice benar-benar diterbitkan oleh perusahaan dan mengetahui status pembayarannya.
Kesimpulan
QR Code dapat menjadi bagian penting dari sistem verifikasi invoice Laravel.
Konsep sederhananya:
Invoice
↓
QR Code
↓
URL Verifikasi
↓
Token
↓
Database
↓
Status Invoice
QR Code sebaiknya hanya menyimpan URL atau token verifikasi, sementara informasi invoice tetap diambil dari database.
Dengan pendekatan ini, bisnis dapat membuat invoice PDF yang lebih profesional sekaligus menyediakan mekanisme verifikasi yang mudah digunakan oleh pelanggan.
Artikel Terkait
Cara Mengatasi Permission Denied pada Folder Storage Laravel
Error “Permission Denied” pada folder storage Laravel biasanya terjadi karena user yang menjalankan PHP tidak memiliki izin untuk membaca atau menulis file. Masalah ini sering muncul setelah deployment, migrasi server, perubahan owner folder, atau penggunaan Laravel pada VPS dan cPanel.
Cara Mengatasi Could Not Find Driver pada Laravel dan PHP
Error “Could Not Find Driver” pada Laravel biasanya terjadi karena extension PHP untuk database yang digunakan belum terpasang atau belum aktif. Masalah ini sering ditemukan saat menggunakan MySQL, PostgreSQL, SQLite, atau aplikasi Laravel pada server production.
Cara Mencegah Transaksi Ganda dari Webhook Payment Gateway
Webhook payment gateway dapat terkirim lebih dari satu kali karena retry atau gangguan jaringan. Jika tidak ditangani dengan benar, satu pembayaran dapat tercatat sebagai transaksi ganda. Laravel dapat mencegah masalah ini dengan idempotency, unique transaction ID, database transaction, dan validasi status pembayaran.