Config::$serverKey, 'is_production' => Config::$isProduction ]); } public function getSnapToken($params) { try { Log::info('Getting Snap Token', ['params' => $params]); // Pastikan semua nilai numerik adalah integer if (isset($params['transaction_details']['gross_amount'])) { $params['transaction_details']['gross_amount'] = (int)$params['transaction_details']['gross_amount']; } if (isset($params['item_details'])) { foreach ($params['item_details'] as &$item) { $item['price'] = (int)$item['price']; $item['quantity'] = (int)$item['quantity']; } } // Tambahkan konfigurasi callback $params['callbacks'] = [ 'finish' => config('midtrans.finish_url'), 'unfinish' => config('midtrans.unfinish_url'), 'error' => config('midtrans.error_url') ]; $snapToken = Snap::getSnapToken($params); Log::info('Snap Token Generated', ['token' => $snapToken]); return $snapToken; } catch (\Exception $e) { Log::error('Midtrans Error: ' . $e->getMessage(), [ 'params' => $params, 'trace' => $e->getTraceAsString() ]); throw $e; } } public function handleCallback($payload) { try { $transaksi = Transaksi::where('kode_transaksi', $payload->order_id)->first(); if (!$transaksi) { throw new \Exception('Transaksi tidak ditemukan'); } $transactionStatus = $payload->transaction_status; $fraudStatus = $payload->fraud_status; if ($transactionStatus == 'capture') { if ($fraudStatus == 'challenge') { $transaksi->status = 'challenge'; } else if ($fraudStatus == 'accept') { $transaksi->status = 'success'; $transaksi->pesanan->update(['status' => 'diproses']); } } else if ($transactionStatus == 'settlement') { $transaksi->status = 'success'; $transaksi->pesanan->update(['status' => 'diproses']); } else if ($transactionStatus == 'cancel' || $transactionStatus == 'deny' || $transactionStatus == 'expire') { $transaksi->status = 'failed'; } else if ($transactionStatus == 'pending') { $transaksi->status = 'pending'; } $transaksi->midtrans_transaction_id = $payload->transaction_id; $transaksi->midtrans_payment_type = $payload->payment_type; $transaksi->midtrans_transaction_time = $payload->transaction_time; $transaksi->midtrans_transaction_status = $payload->transaction_status; $transaksi->midtrans_fraud_status = $payload->fraud_status; $transaksi->save(); return $transaksi; } catch (\Exception $e) { Log::error('Error handling callback: ' . $e->getMessage(), [ 'payload' => $payload, 'trace' => $e->getTraceAsString() ]); throw $e; } } }