Irvana Buah — Fresh Fruit E-Commerce
Platform e-commerce full-stack untuk toko buah segar dengan storefront responsif, admin dashboard, payment gateway Midtrans, loyalty points, AI chatbot Gemini, dan Google OAuth.
- Laravel 12
- PHP 8.2
- Tailwind CSS
- Alpine.js
- MySQL
- Midtrans
- Gemini AI

Latar Belakang
Irvana Buah adalah platform e-commerce untuk toko buah segar yang mencakup sisi pembeli (storefront) dan sisi pengelola (admin dashboard). Pembayaran diproses melalui Midtrans, ditambah program loyalty points dan chatbot AI untuk membantu pelanggan.
Tanggung Jawab
- Mengembangkan backend dan frontend dengan Laravel 12, Blade, Tailwind CSS, dan Alpine.js.
- Mengintegrasikan payment gateway Midtrans dan Google OAuth.
- Membangun admin dashboard untuk pengelolaan produk dan pesanan.
Pencapaian Utama
- Alur checkout end-to-end dengan pembayaran online.
- Fitur loyalty points dan chatbot Gemini untuk meningkatkan keterlibatan pelanggan.
Cuplikan Kode
PHP
Controller Laravel yang membuat Snap Token Midtrans untuk payment gateway, menangani webhook notifikasi pembayaran, dan mengupdate status pesanan secara otomatis.
<?php
// app/Http/Controllers/PaymentController.php
namespace App\Http\Controllers;
use Midtrans\Snap;
use Midtrans\Config;
use App\Models\Order;
use Illuminate\Http\Request;
class PaymentController extends Controller
{
public function __construct()
{
Config::$serverKey = config('midtrans.server_key');
Config::$isProduction = config('midtrans.is_production');
Config::$isSanitized = true;
Config::$is3ds = true;
}
public function createSnapToken(Order $order): \Illuminate\Http\JsonResponse
{
$params = [
'transaction_details' => [
'order_id' => $order->invoice_number,
'gross_amount' => (int) $order->grand_total,
],
'customer_details' => [
'first_name' => $order->user->name,
'email' => $order->user->email,
'phone' => $order->user->phone,
],
'item_details' => $order->items->map(fn ($item) => [
'id' => $item->product_id,
'price' => (int) $item->unit_price,
'quantity' => $item->quantity,
'name' => $item->product->name,
])->toArray(),
];
$snapToken = Snap::getSnapToken($params);
$order->update(['snap_token' => $snapToken]);
return response()->json(['snap_token' => $snapToken]);
}
public function handleWebhook(Request $request): \Illuminate\Http\Response
{
$payload = $request->all();
$orderId = $payload['order_id'];
$status = $payload['transaction_status'];
$serverKey = config('midtrans.server_key');
// Verifikasi signature Midtrans
$signatureKey = hash('sha512',
$orderId . $payload['status_code'] .
$payload['gross_amount'] . $serverKey
);
if ($signatureKey !== $payload['signature_key']) {
return response('Invalid signature', 403);
}
$order = Order::where('invoice_number', $orderId)->firstOrFail();
$newStatus = match ($status) {
'settlement', 'capture' => 'paid',
'cancel', 'deny' => 'cancelled',
'expire' => 'expired',
default => $order->status,
};
$order->update(['status' => $newStatus]);
return response('OK', 200);
}
}Kode nyata dari proyek ini — bukan ilustrasi.
UTF-8PHP