zibalPaymentService = $zibalPaymentService; $this->walletService = $walletService; $this->invoiceService = $invoiceService; } public function store(PaymentRequest $request) { $invoice = Invoice::where('id', $request->invoice_id) ->where('user_id', Auth::id()) ->where('status', InvoiceStatusEnum::Pending->value) ->firstOrFail(); $payment = $this->zibalPaymentService->request(Auth::user(), $invoice->amount, $invoice->number, [ 'purpose' => PaymentPurposeEnum::Invoice->value, 'invoice_id' => $invoice->id, ]); return response()->json([ 'payment' => new PaymentResource($payment), 'url' => $this->zibalPaymentService->paymentUrl($payment), ]); } public function callback(Request $request) { $payment = Payment::where('track_id', $request->trackId)->first(); if (!$payment) { return redirect()->route('dashboard.index'); } $wasPending = $payment->status === PaymentStatusEnum::Pending; if ($request->success == 1) { $payment = $this->zibalPaymentService->verify($payment); } else { $payment = $this->zibalPaymentService->markFailed($payment); } if ($wasPending && $payment->status === PaymentStatusEnum::Paid) { $this->settle($payment); } session()->flash('payment_result', [ 'status' => $payment->status === PaymentStatusEnum::Paid ? 'paid' : 'failed', 'track_id' => $payment->track_id, 'purpose' => $payment->purpose->name, ]); return redirect()->route('dashboard.index'); } protected function settle(Payment $payment): void { if ($payment->purpose === PaymentPurposeEnum::WalletTopUp) { $this->walletService->deposit($payment->payer, $payment->amount, WalletTransactionReasonEnum::TopUp, $payment); return; } $invoice = $payment->invoice; if ($invoice && $invoice->status === InvoiceStatusEnum::Pending) { $this->invoiceService->markPaid($invoice, InvoicePaymentMethodEnum::Gateway); $this->walletService->recordGatewayInvoicePayment($invoice, $payment); } } }