You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.4 KiB
119 lines
4.4 KiB
2 years ago
|
<?php
|
||
|
|
||
|
namespace App\Http\Controllers;
|
||
|
|
||
|
use App\Models\Order;
|
||
|
use App\Models\BusinessSetting;
|
||
|
use App\CentralLogics\Helpers;
|
||
|
use Illuminate\Http\Request;
|
||
|
use KingFlamez\Rave\Facades\Rave as Flutterwave;
|
||
|
|
||
|
class FlutterwaveController extends Controller
|
||
|
{
|
||
|
/**
|
||
|
* Initialize Rave payment process
|
||
|
* @return void
|
||
|
*/
|
||
|
public function initialize(Request $request)
|
||
|
{
|
||
|
//This generates a payment reference
|
||
|
$reference = Flutterwave::generateReference();
|
||
|
$order = Order::with(['details','customer'])->where(['id' => $request->order_id, 'user_id'=>$request->customer_id])->first();
|
||
|
$user_data = $order->customer;
|
||
|
// Enter the details of the payment
|
||
|
$data = [
|
||
|
'payment_options' => 'card,banktransfer',
|
||
|
'amount' => $order->order_amount,
|
||
|
'email' => $user_data['email'],
|
||
|
'tx_ref' => $reference,
|
||
|
'currency' => Helpers::currency_code(),
|
||
|
'redirect_url' => route('flutterwave_callback',['order_id'=>$order->id]),
|
||
|
'customer' => [
|
||
|
'email' => $user_data['email'],
|
||
|
"phone_number" => $user_data['phone'],
|
||
|
"name" => $user_data['f_name'].''.$user_data['l_name']
|
||
|
],
|
||
|
|
||
|
"customizations" => [
|
||
|
"title" => BusinessSetting::where(['key'=>'business_name'])->first()->value??'Stack Food',
|
||
|
"description" => $order->id,
|
||
|
]
|
||
|
];
|
||
|
|
||
|
$payment = Flutterwave::initializePayment($data);
|
||
|
|
||
|
if ($payment['status'] !== 'success') {
|
||
|
$order->order_status = 'failed';
|
||
|
$order->failed = now();
|
||
|
$order->save();
|
||
|
if ($order->callback != null) {
|
||
|
return redirect($order->callback . '&status=fail');
|
||
|
}else{
|
||
|
return \redirect()->route('payment-fail');
|
||
|
}
|
||
|
}
|
||
|
return redirect($payment['data']['link']);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Obtain Rave callback information
|
||
|
* @return void
|
||
|
*/
|
||
|
public function callback(Request $request, $order_id)
|
||
|
{
|
||
|
$order = Order::with(['details'])->where(['id' => $order_id])->first();
|
||
|
//Payment successful response
|
||
|
// array (
|
||
|
// 'status' => 'completed',
|
||
|
// 'tx_ref' => 'flw_166339765163256f133120d',
|
||
|
// 'transaction_id' => '716320049',
|
||
|
// )
|
||
|
if (in_array($request->status, ['successful','completed'])) {
|
||
|
|
||
|
$transactionID = Flutterwave::getTransactionIDFromCallback();
|
||
|
$data = Flutterwave::verifyTransaction($transactionID);
|
||
|
|
||
|
try {
|
||
|
$order->transaction_reference = $transactionID;
|
||
|
$order->payment_method = 'flutterwave';
|
||
|
$order->payment_status = 'paid';
|
||
|
$order->order_status = 'confirmed';
|
||
|
$order->confirmed = now();
|
||
|
$order->save();
|
||
|
Helpers::send_order_notification($order);
|
||
|
} catch (\Exception $e) {
|
||
|
info($e->getMessage());
|
||
|
}
|
||
|
|
||
|
if ($order->callback != null) {
|
||
|
return redirect($order->callback . '&status=success');
|
||
|
}else{
|
||
|
return \redirect()->route('payment-success');
|
||
|
}
|
||
|
}
|
||
|
// elseif ($status == 'cancelled'){
|
||
|
// //Put desired action/code after transaction has been cancelled here
|
||
|
// }
|
||
|
else{
|
||
|
$order->order_status = 'failed';
|
||
|
$order->failed = now();
|
||
|
$order->save();
|
||
|
if ($order->callback != null) {
|
||
|
return redirect($order->callback . '&status=fail');
|
||
|
}else{
|
||
|
return \redirect()->route('payment-fail');
|
||
|
}
|
||
|
}
|
||
|
// Get the transaction from your DB using the transaction reference (txref)
|
||
|
// Check if you have previously given value for the transaction. If you have, redirect to your successpage else, continue
|
||
|
// Confirm that the currency on your db transaction is equal to the returned currency
|
||
|
// Confirm that the db transaction amount is equal to the returned amount
|
||
|
// Update the db transaction record (including parameters that didn't exist before the transaction is completed. for audit purpose)
|
||
|
// Give value for the transaction
|
||
|
// Update the transaction to note that you have given value for the transaction
|
||
|
// You can also redirect to your success page from here
|
||
|
|
||
|
}
|
||
|
}
|