Deploy Ladill Mini / deploy (push) Successful in 55s
Standardize customer-facing Ladill Pay checkout shells across products, open them on all viewports, and escape iframe callbacks back to the product flow.
94 lines
2.9 KiB
PHP
94 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Public;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\MiniPayment;
|
|
use App\Models\QrCode;
|
|
use App\Services\Mini\MiniPaymentService;
|
|
use App\Support\LadillLink;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
use RuntimeException;
|
|
|
|
class PaymentController extends Controller
|
|
{
|
|
public function __construct(private MiniPaymentService $payments) {}
|
|
|
|
public function pay(Request $request, string $shortCode): JsonResponse|RedirectResponse
|
|
{
|
|
$qrCode = QrCode::query()
|
|
->with('user.qrSetting')
|
|
->where('short_code', $shortCode)
|
|
->where('type', QrCode::TYPE_PAYMENT)
|
|
->where('is_active', true)
|
|
->firstOrFail();
|
|
|
|
$validated = $request->validate([
|
|
'amount' => 'required|numeric|min:0.01',
|
|
'customer_phone' => 'nullable|string|max:32',
|
|
]);
|
|
|
|
try {
|
|
$result = $this->payments->initiate($qrCode, $validated);
|
|
} catch (RuntimeException $e) {
|
|
if ($request->expectsJson()) {
|
|
return response()->json(['error' => $e->getMessage()], 422);
|
|
}
|
|
|
|
return back()->withInput()->with('error', $e->getMessage());
|
|
}
|
|
|
|
if ($request->expectsJson()) {
|
|
return response()->json([
|
|
'checkout_url' => $result['checkout_url'],
|
|
'provider' => $result['provider'] ?? null,
|
|
]);
|
|
}
|
|
|
|
return redirect()->away($result['checkout_url']);
|
|
}
|
|
|
|
public function callback(Request $request, string $shortCode): View
|
|
{
|
|
$reference = trim((string) $request->query('reference', ''));
|
|
if ($reference === '') {
|
|
return view('public.payment-return', [
|
|
'redirect' => LadillLink::url($shortCode),
|
|
]);
|
|
}
|
|
|
|
try {
|
|
$payment = $this->payments->complete($reference);
|
|
} catch (RuntimeException $e) {
|
|
return view('public.payment-return', [
|
|
'redirect' => LadillLink::url($shortCode),
|
|
]);
|
|
}
|
|
|
|
return view('public.payment-return', [
|
|
'redirect' => route('qr.public.payment.confirmed', [
|
|
'shortCode' => $shortCode,
|
|
'reference' => $payment->payment_reference,
|
|
], absolute: true),
|
|
]);
|
|
}
|
|
|
|
public function confirmed(string $shortCode, string $reference): View
|
|
{
|
|
$payment = MiniPayment::query()
|
|
->with('qrCode')
|
|
->where('payment_reference', $reference)
|
|
->where('status', MiniPayment::STATUS_PAID)
|
|
->whereHas('qrCode', fn ($q) => $q->where('short_code', $shortCode))
|
|
->firstOrFail();
|
|
|
|
return view('public.qr.payment-confirmed', [
|
|
'payment' => $payment,
|
|
'qrCode' => $payment->qrCode,
|
|
]);
|
|
}
|
|
}
|