<?php
namespace App\Http\Controllers\Api\V2;
use App\Models\CombinedOrder;
use App\Models\User;
use Exception;
use Rave as Flutterwave;
use Illuminate\Http\Request;
class FlutterwaveController extends Controller
{
public function getUrl(Request $request)
{
$payment_type = $request->payment_type;
$combined_order_id = $request->combined_order_id;
$amount = $request->amount;
$user_id = $request->user_id;
if (isset($request->package_id)) {
$package_id = $request->package_id;
}
if ($payment_type == 'cart_payment') {
$combined_order = CombinedOrder::find($combined_order_id);
return $this->initialize($payment_type, $combined_order_id, $combined_order->grand_total, $user_id);
} elseif ($payment_type == 'wallet_payment') {
return $this->initialize($payment_type, $combined_order_id, $amount, $user_id);
} elseif (
$payment_type == 'seller_package_payment' ||
$payment_type == 'customer_package_payment'
) {
return $this->initialize($payment_type, $combined_order_id, $amount, $user_id, $package_id);
}
}
public function initialize($payment_type, $combined_order_id, $amount, $user_id, $package_id = 0)
{
$user = User::find($user_id);
//This generates a payment reference
$reference = Flutterwave::generateReference();
// Enter the details of the payment
$data = [
'payment_options' => 'card,banktransfer',
'amount' => $amount,
'email' => $user->email,
'tx_ref' => $reference,
'currency' => env('FLW_PAYMENT_CURRENCY_CODE'),
'redirect_url' => route(
'api.flutterwave.callback',
[
"payment_type" => $payment_type,
"combined_order_id" => $combined_order_id,
"amount" => $amount,
"user_id" => $user_id,
'package_id' => $package_id
]
),
'customer' => [
'email' => $user->email,
"phone_number" => $user->phone,
"name" => $user->name
],
"customizations" => [
"title" => 'Payment',
"description" => ""
]
];
$payment = Flutterwave::initializePayment($data);
if ($payment['status'] !== 'success') {
// notify something went wrong
return response()->json(['result' => false, 'url' => '', 'message' => "Could not find redirect url"]);
}
return response()->json(['result' => true, 'url' => $payment['data']['link'], 'message' => "Url generated"]);
}
public function callback(Request $request)
{
$status = $request->status;
//if payment is successful
if ($status == 'successful') {
$transactionID = Flutterwave::getTransactionIDFromCallback();
$data = Flutterwave::verifyTransaction($transactionID);
try {
$payment = $data['data'];
if ($payment['status'] == "successful") {
if ($request->payment_type == 'cart_payment') {
checkout_done($request->combined_order_id, json_encode($payment));
}
if ($request->payment_type == 'wallet_payment') {
wallet_payment_done($request->user_id, $request->amount, 'Flutterwave', json_encode($payment));
}
if ($request->payment_type == 'seller_package_payment') {
seller_purchase_payment_done($request->user_id, $request->package_id, $request->amount, 'Flutterwave', json_encode($payment));
}
if ($request->payment_type == 'customer_package_payment') {
customer_purchase_payment_done($request->user_id, $request->package_id);
}
return response()->json(['result' => true, 'message' => translate("Payment is successful")]);
} else {
return response()->json(['result' => false, 'message' => translate("Payment is unsuccessful")]);
}
} catch (Exception $e) {
return response()->json(['result' => false, 'message' => translate("Unsuccessful")]);
}
} elseif ($status == 'cancelled') {
return response()->json(['result' => false, 'message' => translate("Payment Cancelled")]);
}
}
}
|