106 lines
3.8 KiB
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;
|
|
}
|
|
}
|
|
}
|