![]() Server : Apache/2.4.62 (Unix) OpenSSL/1.0.2k-fips System : Linux server1.richineiserver.com 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 User : fdshops ( 1003) PHP Version : 8.2.21 Disable Function : NONE Directory : /home/fdshops/public_html/app/Http/Controllers/ |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Contracts\View\View; use MyFatoorah\Library\MyFatoorah; use MyFatoorah\Library\API\Payment\MyFatoorahPayment; use MyFatoorah\Library\API\Payment\MyFatoorahPaymentEmbedded; use MyFatoorah\Library\API\Payment\MyFatoorahPaymentStatus; use Exception; class MyFatoorahController extends Controller { /** * @var array */ public $mfConfig = []; //----------------------------------------------------------------------------------------------------------------------------------------- /** * Initiate MyFatoorah Configuration */ public function __construct() { $this->mfConfig = [ 'apiKey' => config('myfatoorah.api_key'), 'isTest' => config('myfatoorah.test_mode'), 'countryCode' => config('myfatoorah.country_iso'), ]; } //----------------------------------------------------------------------------------------------------------------------------------------- /** * Redirect to MyFatoorah Invoice URL * Provide the index method with the order id and (payment method id or session id) * * @return Response */ public function index() { try { //For example: pmid=0 for MyFatoorah invoice or pmid=1 for Knet in test mode $paymentId = request('pmid') ?: 0; $sessionId = request('sid') ?: null; $package_id = request('package_id'); $email = request('email'); $amount = request('amount'); $currency = request('currency'); $coupon_code = request('coupon_code'); $name = request('name'); $user_id = request('user_id'); $business_id = request('business_id'); $language = request('language'); $curlData = $this->getPayLoadData($package_id, $amount , $currency, $coupon_code, $email, $name, $user_id, $business_id, $language); $mfObj = new MyFatoorahPayment($this->mfConfig); $payment = $mfObj->getInvoiceURL($curlData, $paymentId, $package_id, $sessionId); return redirect($payment['invoiceURL']); } catch (Exception $ex) { $exMessage = __('myfatoorah.' . $ex->getMessage()); return response()->json(['IsSuccess' => 'false', 'Message' => $exMessage]); } } //----------------------------------------------------------------------------------------------------------------------------------------- /** * Example on how to map order data to MyFatoorah * You can get the data using the order object in your system * * @param int|string $orderId * * @return array */ private function getPayLoadData($package_id = null, $amount, $currency, $coupon_code, $email, $name, $user_id, $business_id, $language) { $callbackURL = route('myfatoorah_callback'); //You can get the data using the order object in your system $order = $this->getTestOrderData($package_id); return [ 'CustomerName' => $name, 'InvoiceValue' => $amount, 'DisplayCurrencyIso' => $currency, 'CustomerEmail' => $email, 'CallBackUrl' => $callbackURL, 'ErrorUrl' => $callbackURL, 'Language' => $language, 'CustomerReference' => $package_id, 'UserDefinedField' => json_encode(['business_id' => $business_id, 'coupon_code' => $coupon_code, 'user_id' => $user_id]), 'SourceInfo' => 'Laravel ' . app()::VERSION . ' - MyFatoorah Package ' . MYFATOORAH_LARAVEL_PACKAGE_VERSION ]; } //----------------------------------------------------------------------------------------------------------------------------------------- /** * Get MyFatoorah Payment Information * Provide the callback method with the paymentId * * @return Response */ public function callback() { try { $paymentId = request('paymentId'); $mfObj = new MyFatoorahPaymentStatus($this->mfConfig); $data = $mfObj->getPaymentStatus($paymentId, 'PaymentId'); return $data; } catch (Exception $ex) { $exMessage = __('myfatoorah.' . $ex->getMessage()); $response = ['success' => 'false', 'Message' => $exMessage]; } } //----------------------------------------------------------------------------------------------------------------------------------------- /** * Example on how to Display the enabled gateways at your MyFatoorah account to be displayed on the checkout page * Provide the checkout method with the order id to display its total amount and currency * * @return View */ public function checkout() { try { //You can get the data using the order object in your system $orderId = request('oid') ?: 147; $order = $this->getTestOrderData($orderId); //You can replace this variable with customer Id in your system $customerId = request('customerId'); //You can use the user defined field if you want to save card $userDefinedField = config('myfatoorah.save_card') && $customerId ? "CK-$customerId" : ''; //Get the enabled gateways at your MyFatoorah acount to be displayed on checkout page $mfObj = new MyFatoorahPaymentEmbedded($this->mfConfig); $paymentMethods = $mfObj->getCheckoutGateways($order['total'], $order['currency'], config('myfatoorah.register_apple_pay')); if (empty($paymentMethods['all'])) { throw new Exception('noPaymentGateways'); } //Generate MyFatoorah session for embedded payment $mfSession = $mfObj->getEmbeddedSession($userDefinedField); //Get Environment url $isTest = $this->mfConfig['isTest']; $vcCode = $this->mfConfig['countryCode']; $countries = MyFatoorah::getMFCountries(); $jsDomain = ($isTest) ? $countries[$vcCode]['testPortal'] : $countries[$vcCode]['portal']; return view('myfatoorah.checkout', compact('mfSession', 'paymentMethods', 'jsDomain', 'userDefinedField')); } catch (Exception $ex) { $exMessage = __('myfatoorah.' . $ex->getMessage()); return view('myfatoorah.error', compact('exMessage')); } } //----------------------------------------------------------------------------------------------------------------------------------------- /** * Example on how the webhook is working when MyFatoorah try to notify your system about any transaction status update */ public function webhook(Request $request) { try { //Validate webhook_secret_key $secretKey = config('myfatoorah.webhook_secret_key'); if (empty($secretKey)) { return response(null, 404); } //Validate MyFatoorah-Signature $mfSignature = $request->header('MyFatoorah-Signature'); if (empty($mfSignature)) { return response(null, 404); } //Validate input $body = $request->getContent(); $input = json_decode($body, true); if (empty($input['Data']) || empty($input['EventType']) || $input['EventType'] != 1) { return response(null, 404); } //Validate Signature if (!MyFatoorah::isSignatureValid($input['Data'], $secretKey, $mfSignature, $input['EventType'])) { return response(null, 404); } //Update Transaction status on your system $result = $this->changeTransactionStatus($input['Data']); return response()->json($result); } catch (Exception $ex) { $exMessage = __('myfatoorah.' . $ex->getMessage()); return response()->json(['IsSuccess' => false, 'Message' => $exMessage]); } } //----------------------------------------------------------------------------------------------------------------------------------------- private function changeTransactionStatus($inputData) { //1. Check if orderId is valid on your system. $orderId = $inputData['CustomerReference']; //2. Get MyFatoorah invoice id $invoiceId = $inputData['InvoiceId']; //3. Check order status at MyFatoorah side if ($inputData['TransactionStatus'] == 'SUCCESS') { $status = 'Paid'; $error = ''; } else { $mfObj = new MyFatoorahPaymentStatus($this->mfConfig); $data = $mfObj->getPaymentStatus($invoiceId, 'InvoiceId'); $status = $data->InvoiceStatus; $error = $data->InvoiceError; } $message = $this->getTestMessage($status, $error); //4. Update order transaction status on your system return ['IsSuccess' => true, 'Message' => $message, 'Data' => $inputData]; } //----------------------------------------------------------------------------------------------------------------------------------------- private function getTestOrderData($orderId) { return [ 'total' => 15, 'currency' => 'KWD' ]; } //----------------------------------------------------------------------------------------------------------------------------------------- private function getTestMessage($status, $error) { if ($status == 'Paid') { return 'Invoice is paid.'; } else if ($status == 'Failed') { return 'Invoice is not paid due to ' . $error; } else if ($status == 'Expired') { return $error; } } //----------------------------------------------------------------------------------------------------------------------------------------- }