+ Implementation of visa-api

This commit is contained in:
Djery-Tom 2020-06-05 18:00:16 +01:00
parent 71270c8e88
commit cbb31f0b97
8 changed files with 202 additions and 110 deletions

View File

@ -11,7 +11,7 @@ LOG_SLACK_WEBHOOK_URL=
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=iLink_test2
DB_DATABASE=iLink_preprod
DB_USERNAME=root
DB_PASSWORD=vps@2017GA
@ -29,3 +29,7 @@ MAIL_USERNAME=noreply@ilink-app.com
MAIL_PASSWORD=ilink2017GA
MAIL_FROM_ADDRESS=noreply@ilink-app.com
MAIL_FROM_NAME="iLink World"
VISA_API_URL=localhost:8082
VISA_API_USERNAME=admin
VISA_API_PASSWORD=PasswordHere!

View File

@ -101,15 +101,26 @@ class Handler extends ExceptionHandler
return $this->errorResponse($exception->getMessage(),Response::HTTP_INTERNAL_SERVER_ERROR);
}
if ($exception instanceof \ErrorException)
{
return $this->errorResponse($exception->getMessage(),Response::HTTP_INTERNAL_SERVER_ERROR);
}
if ( $exception instanceof ClientException)
{
$message = $exception->getResponse()->getBody()->getContents();
$error =json_decode($message);
$code = $exception->getCode();
if($error)
return $this->errorResponse($error->error,$code);
else
if($error){
if($error->message){
$message = json_decode($error->message);
if(isset($message->errorMessage))
return $this->errorResponse($message->errorMessage,$code);
return $this->errorResponse($message,$code);
}
return $this->errorResponse($error,$code);
} else
return $this->errorResponse($message,$code);
}

View File

@ -72,16 +72,68 @@ class CommissionController extends Controller
$file_ext = end($original_filename_arr);
$destination_path = './upload/user/';
$image = 'U-' . time() . '.' . $file_ext;
// File info
// $fileName = basename($_FILES["image"]["name"]);
// $imageUploadPath = $uploadPath . $fileName;
// $fileType = pathinfo($imageUploadPath, PATHINFO_EXTENSION);
if ($request->file('image')->move($destination_path, $image)) {
$user->image = '/upload/user/' . $image;
return $this->successResponse($user);
// Allow certain file formats
$allowTypes = array('jpg','png','jpeg','gif');
if(in_array(strtolower($file_ext), $allowTypes)){
// Image temp source
// $imageTemp = $_FILES["image"]["tmp_name"];
// Compress size and upload image
$compressedImage = $this->compressImage($request->file('image'), '/'. $image, 80);
if($compressedImage){
return $this->successResponse("Image compressed successfully.");
}else{
return $this->errorResponse('Cannot upload file');
return $this->errorResponse( "Image compress failed!");
}
}else{
return $this->errorResponse('Sorry, only JPG, JPEG, PNG, & GIF files are allowed to upload.');
}
// if ($request->file('image')->move($destination_path, $image)) {
// $user->image = '/upload/user/' . $image;
// return $this->successResponse($user);
// } else {
// return $this->errorResponse('Cannot upload file');
// }
} else {
return $this->errorResponse('File not found');
}
}
/*
* Custom function to compress image size and
* upload to the server using PHP
*/
function compressImage($source, $destination, $quality) {
// Get image info
$imgInfo = getimagesize($source);
$mime = $imgInfo['mime'];
// Create a new image from file
switch($mime){
case 'image/jpeg':
$image = imagecreatefromjpeg($source);
break;
case 'image/png':
$image = imagecreatefrompng($source);
break;
case 'image/gif':
$image = imagecreatefromgif($source);
break;
default:
$image = imagecreatefromjpeg($source);
}
// Save image
imagejpeg($image, $destination, $quality);
// Return compressed image
return $destination;
}
}

View File

@ -17,6 +17,7 @@ use Illuminate\Support\Facades\DB;
class TransactionController extends Controller
{
use ApiResponser;
/**
* Create a new controller instance.
*
@ -48,21 +49,22 @@ class TransactionController extends Controller
$walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id);
$data = $request->all();
if (isset($request->cvv) && !is_numeric($request->cvv))
return $this->errorResponse('errors.invalid_cvv');
$data['expiration_date'] = \DateTime::createFromFormat('m/y', $request->expiration_date);
if(!$data['expiration_date'])
$data['expiration_date'] = new \DateTime();
$transaction->fill($data);
$client = new \GuzzleHttp\Client();
$client = new \GuzzleHttp\Client([
'base_uri' => env('VISA_API_URL'),
'auth'=>[env('VISA_API_USERNAME') , env('VISA_API_PASSWORD')]
]);
// Procedure de depot d'argent
if($transaction->type == 'credit')
{
if ($transaction->type == 'credit') {
$frais = $transaction->montant * $config->taux_com_client_depot / 100;
// Verification faites au niveau du frontend
// if($walletAgent->balance_princ >= ($transaction->montant + $frais + $config->frais_min_banque_depot)){
$response = $client->post('https://ilink-app.com/mobilebackendtest/interacted/MembersAction.php');
$code = $response->getStatusCode();
if($code == 200){
//Requete vers la banque
// 1 ---> Emmètre via API sécurisé SSL une requête de débit de notre
//compte marchand la valeur égale au $montantDepot( montant de la
@ -70,6 +72,17 @@ class TransactionController extends Controller
//dépôt client) et créditer sa carte visa de cette valeur
$montantDepot = $transaction->montant - $frais - $config->frais_min_banque_depot;
$body['amount'] = $montantDepot;
$body['card_number'] = $transaction->numCarte;
$body['cvv'] = $request->cvv;
$body['expiry_date'] = $data['expiration_date']->format('Y-m');
// Verification faites au niveau du frontend
// if($walletAgent->balance_princ >= ($transaction->montant + $frais + $config->frais_min_banque_depot)){
$response = $client->post('fund-transfer-api/v1/transaction/push', ['json' => $body]);
$code = $response->getStatusCode();
if ($code == 200) {
$banqueCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->part_banque_depot / 100);
$transaction->commission_banque = $banqueCommission;
// 2---> Emmètre via API sécurisé SSL une requête de débit de notre
@ -100,46 +113,51 @@ class TransactionController extends Controller
// }
// Procedure de retrait d'argent
}elseif ($transaction->type == 'debit')
{
} elseif ($transaction->type == 'debit') {
// 12-05-20: Modif de Mr Manga : Le montant de la transaction c'est le montant de retrait sans les frais
//Bloquer le retrait
return $this->errorResponse(trans('errors.service_unavailable'),Response::HTTP_BAD_REQUEST);
// $frais = $transaction->montant * $config->taux_com_client_retrait / 100;
//
// $response = $client->post('https://ilink-app.com/mobilebackendtest/interacted/MembersAction.php');
// $code = $response->getStatusCode();
// if($code == 200) {
// //Requete vers la banque
// // 1 ---> Emmètre via API sécurisé SSL une requête de retrait du
// //(montant de la transaction + frais de transaction) pour débiter
// //sa carte et créditer notre compte marchand
// $montantRetrait = $transaction->montant + $frais;
//
// $banqueCommission = floatval($transaction->montant * $config->part_banque_retrait / 100);
// $transaction->commission_banque = $banqueCommission;
// // 2---> Emmètre via API sécurisé SSL une requête de débit de notre
// //compte marchand du (montant de la transaction multiplié
// //par la Part de la banque partenaire en % ) et créditer le
// //compte des opérations défini avec notre banque partenaire
//
// $walletAgent->balance_princ += $transaction->montant;
//
// $agentCommission=floatval($transaction->montant*$config->taux_com_ag_retrait / 100);
// $superviseurCommission=floatval($transaction->montant*$config->taux_com_sup_retrait / 100);
// $hyperviseurCommission = $frais - $superviseurCommission - $agentCommission - $banqueCommission;
//
//// dd(array($hyperviseurCommission ,$superviseurCommission));
// $walletAgent->balance_com += $agentCommission;
// $walletSuperviseur->balance_com += $superviseurCommission;
// $walletHyperviseur->balance_com += $hyperviseurCommission;
//
// $transaction->id_wallet_sup = $walletSuperviseur->id;
// $transaction->commission_sup = $superviseurCommission;
// $transaction->id_wallet_hyp = $walletHyperviseur->id;
// $transaction->commission_hyp = $hyperviseurCommission;
// $transaction->commission_ag = $agentCommission;
// }
// return $this->errorResponse(trans('errors.service_unavailable'), Response::HTTP_BAD_REQUEST);
$frais = $transaction->montant * $config->taux_com_client_retrait / 100;
//Requete vers la banque
// 1 ---> Emmètre via API sécurisé SSL une requête de retrait du
//(montant de la transaction + frais de transaction) pour débiter
//sa carte et créditer notre compte marchand
$montantRetrait = $transaction->montant + $frais;
$body['amount'] = $montantRetrait;
$body['card_number'] = $transaction->numCarte;
$body['cvv'] = $request->cvv;
$body['expiry_date'] = $data['expiration_date']->format('Y-m');
$response = $client->post('fund-transfer-api/v1/transaction/pull', ['json' => $body]);
$code = $response->getStatusCode();
if($code == 200) {
$banqueCommission = floatval($transaction->montant * $config->part_banque_retrait / 100);
$transaction->commission_banque = $banqueCommission;
// 2---> Emmètre via API sécurisé SSL une requête de débit de notre
//compte marchand du (montant de la transaction multiplié
//par la Part de la banque partenaire en % ) et créditer le
//compte des opérations défini avec notre banque partenaire
$walletAgent->balance_princ += $transaction->montant;
$agentCommission=floatval($transaction->montant*$config->taux_com_ag_retrait / 100);
$superviseurCommission=floatval($transaction->montant*$config->taux_com_sup_retrait / 100);
$hyperviseurCommission = $frais - $superviseurCommission - $agentCommission - $banqueCommission;
// dd(array($hyperviseurCommission ,$superviseurCommission));
$walletAgent->balance_com += $agentCommission;
$walletSuperviseur->balance_com += $superviseurCommission;
$walletHyperviseur->balance_com += $hyperviseurCommission;
$transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->commission_sup = $superviseurCommission;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->commission_hyp = $hyperviseurCommission;
$transaction->commission_ag = $agentCommission;
}
}
@ -152,7 +170,8 @@ class TransactionController extends Controller
return $this->successResponse($walletAgent);
}
public function lastTransactions($id_wallet){
public function lastTransactions($id_wallet)
{
$transactions = WalletTransaction::where('id_wallet', $id_wallet)->orderBy('date', 'desc')->limit(10)
->get(['type', DB::raw('\'wallet\' as source'), 'montant', 'numCarte AS destinataire', 'date', 'id']);
return $this->successResponse($transactions);

View File

@ -100,11 +100,15 @@ class WalletTransaction extends Model
public function rules()
{
//Verifier si ce sont les infos de la face avant ou arriere de la carte qui sont envoyés
// front -> Face avant : Numero de carte , cvv , etc...
// back -> Face arriere : Numero de serie
return [
'facade'=>'required|in:front,back',
'montant'=> 'required|numeric|min:0|not_in:0',
'numCarte'=>'required',
'cvv'=>'required|integer|min:100|max:9999',
'expiration_date'=>'required|date_format:m/y|after_or_equal:today',
'cvv'=>'required_if:facade,front|size:3',
'expiration_date'=>'required_if:facade,front|date_format:m/y|after_or_equal:today',
'type' =>'required|in:credit,debit',
'id_wallet' => 'required|integer|min:0'
];

View File

@ -11,7 +11,7 @@ trait ApiResponser
return response($this->formatResponse($code,$data,null) , $code)->header('Content-Type', 'application/json');
}
public function errorResponse($message , $code)
public function errorResponse($message , $code = Response::HTTP_BAD_REQUEST)
{
return response()->json($this->formatResponse($code,null,$message), $code);
}

View File

@ -2,5 +2,6 @@
return [
'model_not_found' => 'Does not exist any instance of :model with given id',
'unexpected_error'=> 'Unexpected error. Try later',
'service_unavailable' => 'Service unavailable'
'service_unavailable' => 'Service unavailable',
'invalid_cvv' => 'Invalid CVV'
];

View File

@ -2,5 +2,6 @@
return [
'model_not_found' => 'Il n\'existe aucune instance de :model avec l\'id donné',
'unexpected_error'=> 'Erreur inattendue. Essayer plus tard',
'service_unavailable' => 'Service non disponible'
'service_unavailable' => 'Service non disponible',
'invalid_cvv' => 'CVV invalide'
];