✏️ 编辑:CheckoutController.php
路径:
/home/boguraj1/app/Http/Controllers/Frontend/CheckoutController.php
大小:7.53 KB · 修改:2026-07-09 06:29:28 · 权限:0644 · 可写
← 返回目录
👁 查看
⬇ 下载
<?php namespace App\Http\Controllers\Frontend; use App\Http\Controllers\Controller; use App\Models\Cart; use App\Models\Order; use App\Models\OrderItem; use App\Models\Product; use App\Models\Setting; use App\Services\MetaConversionsService; use Illuminate\Http\Request; class CheckoutController extends Controller { private function getSessionId(): string { return session()->getId(); } private function calculateShipping(iterable $cartItems, string $area): float { $globalInside = (float) Setting::get('shipping_inside_dhaka', 60); $globalOutside = (float) Setting::get('shipping_outside_dhaka', 120); $globalRate = $area === 'inside_dhaka' ? $globalInside : $globalOutside; $maxCharge = 0; foreach ($cartItems as $item) { $product = $item->product; $custom = $area === 'inside_dhaka' ? $product->shipping_inside_dhaka : $product->shipping_outside_dhaka; // null = use global; 0 = free; number = custom rate $charge = $custom !== null ? (float) $custom : $globalRate; if ($charge > $maxCharge) { $maxCharge = $charge; } } return $maxCharge; } public function index() { $cartItems = Cart::with(['product', 'variation']) ->where('session_id', $this->getSessionId()) ->get(); if ($cartItems->isEmpty()) { return redirect()->route('home')->with('error', 'Your cart is empty.'); } $subtotal = $cartItems->sum(function ($item) { $price = $item->product->current_price + ($item->variation?->price_adjustment ?? 0); return $price * $item->quantity; }); $insideCharge = $this->calculateShipping($cartItems, 'inside_dhaka'); $outsideCharge = $this->calculateShipping($cartItems, 'outside_dhaka'); // Server-side InitiateCheckout event $capi = app(MetaConversionsService::class); $pixelEventId = $capi->sendInitiateCheckout( $subtotal, $cartItems->sum('quantity') ); return view('frontend.checkout', compact('cartItems', 'subtotal', 'insideCharge', 'outsideCharge', 'pixelEventId')); } public function buyNow(Request $request) { $request->validate([ 'product_id' => 'required|exists:products,id', 'variation_id' => 'nullable|exists:product_variations,id', 'quantity' => 'required|integer|min:1', ]); $sessionId = $this->getSessionId(); Cart::where('session_id', $sessionId)->delete(); Cart::create([ 'session_id' => $sessionId, 'product_id' => $request->product_id, 'variation_id' => $request->variation_id, 'quantity' => $request->quantity, ]); return redirect()->route('checkout'); } public function store(Request $request) { $isMfs = in_array($request->payment_method, ['bkash', 'rocket', 'nagad']); $request->validate([ 'name' => 'required|string|max:255', 'address' => 'required|string|max:1000', 'mobile' => 'required|string|max:20', 'note' => 'nullable|string|max:1000', 'shipping_area' => 'required|in:inside_dhaka,outside_dhaka', 'payment_method' => 'required|in:cod,bkash,rocket,nagad', 'payment_phone' => $isMfs ? 'required|string|max:20' : 'nullable', 'payment_trx_id' => $isMfs ? 'required|string|max:100' : 'nullable', ], [ 'payment_phone.required' => 'পেমেন্ট নম্বর দিন।', 'payment_trx_id.required' => 'Transaction ID দিন।', ]); $sessionId = $this->getSessionId(); $cartItems = Cart::with(['product', 'variation']) ->where('session_id', $sessionId) ->get(); if ($cartItems->isEmpty()) { return redirect()->route('home')->with('error', 'Your cart is empty.'); } $subtotal = $cartItems->sum(function ($item) { $price = $item->product->current_price + ($item->variation?->price_adjustment ?? 0); return $price * $item->quantity; }); $shippingArea = $request->shipping_area; $shippingCharge = $this->calculateShipping($cartItems, $shippingArea); $total = $subtotal + $shippingCharge; $order = Order::create([ 'name' => $request->name, 'address' => $request->address, 'mobile' => $request->mobile, 'note' => $request->note, 'payment_method' => $request->payment_method, 'payment_phone' => $request->payment_phone, 'payment_trx_id' => $request->payment_trx_id, 'shipping_area' => $shippingArea, 'shipping_charge' => $shippingCharge, 'subtotal' => $subtotal, 'total' => $total, ]); foreach ($cartItems as $item) { $price = $item->product->current_price + ($item->variation?->price_adjustment ?? 0); OrderItem::create([ 'order_id' => $order->id, 'product_id' => $item->product_id, 'variation_id' => $item->variation_id, 'product_name' => $item->product->name, 'variation_details' => $item->variation?->label, 'price' => $price, 'quantity' => $item->quantity, 'subtotal' => $price * $item->quantity, ]); } Cart::where('session_id', $sessionId)->delete(); // Server-side Purchase event (most important — fires after order confirmed) $contentIds = $cartItems->pluck('product_id')->filter()->map(fn($id) => (string)$id)->values()->toArray(); $capi = app(MetaConversionsService::class); $purchaseEventId = $capi->sendPurchase( $total, $request->mobile, $contentIds, $cartItems->sum('quantity'), $order->order_number ); // Flash pixel Purchase data — read by layout on thank-you page session()->flash('pixel_purchase', json_encode([ 'value' => round($total, 2), 'currency' => 'BDT', 'content_type' => 'product', 'content_ids' => $contentIds, 'num_items' => (int) $cartItems->sum('quantity'), 'order_id' => $order->order_number, ])); session()->flash('pixel_event_id', $purchaseEventId); session()->flash('purchase_event_id', $purchaseEventId); return redirect()->route('order.success', $order->order_number); } public function success(string $orderNumber) { $order = Order::with('items')->where('order_number', $orderNumber)->firstOrFail(); $purchaseEventId = session('purchase_event_id', ''); return view('frontend.order-success', compact('order', 'purchaseEventId')); } public function track(Request $request) { $order = null; if ($request->filled('order_number')) { $order = Order::with(['items', 'trackingUpdates']) ->where('order_number', $request->order_number) ->where('mobile', $request->mobile) ->first(); } return view('frontend.tracking', compact('order')); } }
💾 保存
取消
保存为 UTF-8,换行统一为 LF