ultimatepos/app/Http/Controllers/MyFatoorahController.php

258 lines
9.9 KiB
PHP

<?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;
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------
}