41 lines
1.3 KiB
PHP
41 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Jobs\CompositeImage;
|
|
use App\Models\Reservation;
|
|
use App\Services\PaymentGateway;
|
|
use Illuminate\Http\Request;
|
|
|
|
class PaymentController extends Controller
|
|
{
|
|
public function charge(Request $request, PaymentGateway $gateway)
|
|
{
|
|
$reservationId = (int) $request->input('reservation_id');
|
|
|
|
$reservation = Reservation::find($reservationId);
|
|
if (! $reservation || $reservation->status !== 'held') {
|
|
return response()->json(['message' => 'invalid_reservation'], 422);
|
|
}
|
|
|
|
// Compute server-side amount: price_per_cell * area
|
|
$pricePerCell = (int) config('pixel_grid.price_per_cell', 100);
|
|
$amount = $reservation->w * $reservation->h * $pricePerCell;
|
|
$amountCents = $amount; // assume cents already
|
|
|
|
$charge = $gateway->charge($reservation->id, $amountCents, []);
|
|
|
|
if ($charge['status'] !== 'succeeded') {
|
|
return response()->json(['message' => 'payment_failed'], 402);
|
|
}
|
|
|
|
// Mark reservation confirmed and dispatch composite job
|
|
$reservation->status = 'confirmed';
|
|
$reservation->save();
|
|
|
|
dispatch(new CompositeImage($reservation->id));
|
|
|
|
return response()->json(['status' => 'ok', 'charge' => $charge]);
|
|
}
|
|
}
|