'required|string', 'status' => 'required|string', ]); try { $plan = Plan::findOrFail($validated['plan_id']); $settings = getPaymentGatewaySettings(); if (!isset($settings['payment_settings']['paiement_merchant_id'])) { return back()->withErrors(['error' => __('Paiement Pro not configured')]); } if ($validated['status'] === 'success') { processPaymentSuccess([ 'user_id' => auth()->id(), 'plan_id' => $plan->id, 'billing_cycle' => $validated['billing_cycle'], 'payment_method' => 'paiement', 'coupon_code' => $validated['coupon_code'] ?? null, 'payment_id' => $validated['transaction_id'], ]); return back()->with('success', __('Payment successful and plan activated')); } return back()->withErrors(['error' => __('Payment failed or cancelled')]); } catch (\Exception $e) { return handlePaymentError($e, 'paiement'); } } public function createPayment(Request $request) { $validated = validatePaymentRequest($request); try { $plan = Plan::findOrFail($validated['plan_id']); $pricing = calculatePlanPricing($plan, $validated['coupon_code'] ?? null); $settings = getPaymentGatewaySettings(); if (!isset($settings['payment_settings']['paiement_merchant_id'])) { return response()->json(['error' => __('Paiement Pro not configured')], 400); } $user = auth()->user(); $transactionId = 'plan_' . $plan->id . '_' . $user->id . '_' . time(); $paymentData = [ 'merchant_id' => $settings['payment_settings']['paiement_merchant_id'], 'amount' => $pricing['final_price'], 'currency' => 'XOF', 'reference' => $transactionId, 'description' => $plan->name, 'return_url' => route('paiement.success'), 'cancel_url' => route('plans.index'), 'notify_url' => route('paiement.callback'), ]; return response()->json([ 'success' => true, 'payment_url' => 'https://www.paiementpro.net/webservice/onlinepayment/init/merchant-payment', 'payment_data' => $paymentData, 'transaction_id' => $transactionId ]); } catch (\Exception $e) { return response()->json(['error' => __('Payment creation failed')], 500); } } public function success(Request $request) { return redirect()->route('plans.index')->with('success', __('Payment completed successfully')); } public function callback(Request $request) { try { $transactionId = $request->input('reference'); $status = $request->input('status'); if ($transactionId && $status === 'success') { $parts = explode('_', $transactionId); if (count($parts) >= 3) { $planId = $parts[1]; $userId = $parts[2]; $plan = Plan::find($planId); $user = User::find($userId); if ($plan && $user) { processPaymentSuccess([ 'user_id' => $user->id, 'plan_id' => $plan->id, 'billing_cycle' => 'monthly', 'payment_method' => 'paiement', 'payment_id' => $request->input('transaction_id'), ]); } } } return response()->json(['status' => 'success']); } catch (\Exception $e) { return response()->json(['error' => __('Callback processing failed')], 500); } } }