NIM_E31222518/app/Services/MidtransService.php

106 lines
3.8 KiB
PHP

<?php
namespace App\Services;
use App\Models\Transaksi;
use Illuminate\Support\Facades\Log;
use Midtrans\Config;
use Midtrans\Snap;
class MidtransService
{
public function __construct()
{
Config::$serverKey = config('midtrans.server_key');
Config::$isProduction = config('midtrans.is_production', false);
Config::$isSanitized = true;
Config::$is3ds = true;
Log::info('Midtrans Config', [
'server_key' => 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;
}
}
}