+ 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_CONNECTION=mysql
DB_HOST=127.0.0.1 DB_HOST=127.0.0.1
DB_PORT=3306 DB_PORT=3306
DB_DATABASE=iLink_test2 DB_DATABASE=iLink_preprod
DB_USERNAME=root DB_USERNAME=root
DB_PASSWORD=vps@2017GA DB_PASSWORD=vps@2017GA
@ -29,3 +29,7 @@ MAIL_USERNAME=noreply@ilink-app.com
MAIL_PASSWORD=ilink2017GA MAIL_PASSWORD=ilink2017GA
MAIL_FROM_ADDRESS=noreply@ilink-app.com MAIL_FROM_ADDRESS=noreply@ilink-app.com
MAIL_FROM_NAME="iLink World" 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); 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) if ( $exception instanceof ClientException)
{ {
$message = $exception->getResponse()->getBody()->getContents(); $message = $exception->getResponse()->getBody()->getContents();
$error =json_decode($message) ; $error =json_decode($message);
$code = $exception->getCode(); $code = $exception->getCode();
if($error) if($error){
return $this->errorResponse($error->error,$code); if($error->message){
else $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); return $this->errorResponse($message,$code);
} }

View File

@ -72,16 +72,68 @@ class CommissionController extends Controller
$file_ext = end($original_filename_arr); $file_ext = end($original_filename_arr);
$destination_path = './upload/user/'; $destination_path = './upload/user/';
$image = 'U-' . time() . '.' . $file_ext; $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)) { // Allow certain file formats
$user->image = '/upload/user/' . $image; $allowTypes = array('jpg','png','jpeg','gif');
return $this->successResponse($user); if(in_array(strtolower($file_ext), $allowTypes)){
} else { // Image temp source
return $this->errorResponse('Cannot upload file'); // $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( "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 { } else {
return $this->errorResponse('File not found'); 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 class TransactionController extends Controller
{ {
use ApiResponser; use ApiResponser;
/** /**
* Create a new controller instance. * Create a new controller instance.
* *
@ -29,117 +30,134 @@ class TransactionController extends Controller
public function add(Request $request) public function add(Request $request)
{ {
$transaction = new WalletTransaction ; $transaction = new WalletTransaction;
$this->validate($request,$transaction->rules()); $this->validate($request, $transaction->rules());
$walletAgent = Wallet::findOrFail($request->get('id_wallet')); $walletAgent = Wallet::findOrFail($request->get('id_wallet'));
$network_agent = NetworksAgent::findOrFail( $walletAgent->id_networkAgent); $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
// Configuratrion du wallet // Configuratrion du wallet
$config = ConfigWallet::where('id_network',$network_agent->network_id)->firstOrFail(); $config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail();
// Recuperation des wallets hyperviseur et superviseur // Recuperation des wallets hyperviseur et superviseur
$codeGenerer = CodeGenerer::findOrFail($network_agent->codeGenerer_id); $codeGenerer = CodeGenerer::findOrFail($network_agent->codeGenerer_id);
$superviseur = AgentPlus::where('code_membre',$codeGenerer->code_parrain)->firstOrFail(); $superviseur = AgentPlus::where('code_membre', $codeGenerer->code_parrain)->firstOrFail();
$hyperviseur = AgentPlus::where('code_membre',$superviseur->code_parrain)->firstOrFail(); $hyperviseur = AgentPlus::where('code_membre', $superviseur->code_parrain)->firstOrFail();
$wallet_agent_sup = WalletAgent::where('agent_id', $superviseur->id)->firstOrFail(); $wallet_agent_sup = WalletAgent::where('agent_id', $superviseur->id)->firstOrFail();
$wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail(); $wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail();
$walletSuperviseur = Wallet::findOrFail($wallet_agent_sup->wallet_id); $walletSuperviseur = Wallet::findOrFail($wallet_agent_sup->wallet_id);
$walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id); $walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id);
$data = $request->all(); $data = $request->all();
$data['expiration_date'] = \DateTime::createFromFormat('m/y',$request->expiration_date); 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); $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 // Procedure de depot d'argent
if($transaction->type == 'credit') if ($transaction->type == 'credit') {
{ $frais = $transaction->montant * $config->taux_com_client_depot / 100;
$frais = $transaction->montant * $config->taux_com_client_depot / 100 ;
// Verification faites au niveau du frontend //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
//transaction la frais calculé en % - frais minimum fixe du
//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)){ // if($walletAgent->balance_princ >= ($transaction->montant + $frais + $config->frais_min_banque_depot)){
$response = $client->post('https://ilink-app.com/mobilebackendtest/interacted/MembersAction.php'); $response = $client->post('fund-transfer-api/v1/transaction/push', ['json' => $body]);
$code = $response->getStatusCode(); $code = $response->getStatusCode();
if($code == 200){ 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
//transaction la frais calculé en % - frais minimum fixe du
//dépôt client) et créditer sa carte visa de cette valeur
$montantDepot = $transaction->montant - $frais - $config->frais_min_banque_depot;
$banqueCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->part_banque_depot / 100); $banqueCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->part_banque_depot / 100);
$transaction->commission_banque = $banqueCommission; $transaction->commission_banque = $banqueCommission;
// 2---> Emmètre via API sécurisé SSL une requête de débit de notre // 2---> Emmètre via API sécurisé SSL une requête de débit de notre
//compte marchand du (Part de la banque partenaire en % //compte marchand du (Part de la banque partenaire en %
//pour le dépôtqui sapplique sur les frais minimum) et créditer //pour le dépôtqui sapplique sur les frais minimum) et créditer
//le compte des opérations défini avec notre banque //le compte des opérations défini avec notre banque
//partenaire //partenaire
$walletAgent->balance_princ -= $transaction->montant; $walletAgent->balance_princ -= $transaction->montant;
$agentCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->taux_com_ag_depot / 100); $agentCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->taux_com_ag_depot / 100);
$superviseurCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->taux_com_sup_depot / 100); $superviseurCommission = floatval(($frais + $config->frais_min_banque_depot) * $config->taux_com_sup_depot / 100);
$hyperviseurCommission = $frais + $config->frais_min_banque_depot - $superviseurCommission - $agentCommission - $banqueCommission; $hyperviseurCommission = $frais + $config->frais_min_banque_depot - $superviseurCommission - $agentCommission - $banqueCommission;
$walletAgent->balance_com += $agentCommission; $walletAgent->balance_com += $agentCommission;
$walletSuperviseur->balance_com += $superviseurCommission; $walletSuperviseur->balance_com += $superviseurCommission;
$walletHyperviseur->balance_com += $hyperviseurCommission; $walletHyperviseur->balance_com += $hyperviseurCommission;
$transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->commission_sup = $superviseurCommission; $transaction->commission_sup = $superviseurCommission;
$transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->commission_hyp = $hyperviseurCommission; $transaction->commission_hyp = $hyperviseurCommission;
$transaction->commission_ag = $agentCommission; $transaction->commission_ag = $agentCommission;
} }
// }else{ // }else{
// return $this->errorResponse('Solde agent inferieur au montant de depot + frais + frais minimun de depot de la banque', Response::HTTP_BAD_REQUEST); // return $this->errorResponse('Solde agent inferieur au montant de depot + frais + frais minimun de depot de la banque', Response::HTTP_BAD_REQUEST);
// } // }
// Procedure de retrait d'argent // 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 // 12-05-20: Modif de Mr Manga : Le montant de la transaction c'est le montant de retrait sans les frais
//Bloquer le retrait //Bloquer le retrait
return $this->errorResponse(trans('errors.service_unavailable'),Response::HTTP_BAD_REQUEST); // return $this->errorResponse(trans('errors.service_unavailable'), Response::HTTP_BAD_REQUEST);
// $frais = $transaction->montant * $config->taux_com_client_retrait / 100; $frais = $transaction->montant * $config->taux_com_client_retrait / 100;
//
// $response = $client->post('https://ilink-app.com/mobilebackendtest/interacted/MembersAction.php'); //Requete vers la banque
// $code = $response->getStatusCode(); // 1 ---> Emmètre via API sécurisé SSL une requête de retrait du
// if($code == 200) { //(montant de la transaction + frais de transaction) pour débiter
// //Requete vers la banque //sa carte et créditer notre compte marchand
// // 1 ---> Emmètre via API sécurisé SSL une requête de retrait du $montantRetrait = $transaction->montant + $frais;
// //(montant de la transaction + frais de transaction) pour débiter
// //sa carte et créditer notre compte marchand $body['amount'] = $montantRetrait;
// $montantRetrait = $transaction->montant + $frais; $body['card_number'] = $transaction->numCarte;
// $body['cvv'] = $request->cvv;
// $banqueCommission = floatval($transaction->montant * $config->part_banque_retrait / 100); $body['expiry_date'] = $data['expiration_date']->format('Y-m');
// $transaction->commission_banque = $banqueCommission;
// // 2---> Emmètre via API sécurisé SSL une requête de débit de notre $response = $client->post('fund-transfer-api/v1/transaction/pull', ['json' => $body]);
// //compte marchand du (montant de la transaction multiplié $code = $response->getStatusCode();
// //par la Part de la banque partenaire en % ) et créditer le if($code == 200) {
// //compte des opérations défini avec notre banque partenaire
// $banqueCommission = floatval($transaction->montant * $config->part_banque_retrait / 100);
// $walletAgent->balance_princ += $transaction->montant; $transaction->commission_banque = $banqueCommission;
// // 2---> Emmètre via API sécurisé SSL une requête de débit de notre
// $agentCommission=floatval($transaction->montant*$config->taux_com_ag_retrait / 100); //compte marchand du (montant de la transaction multiplié
// $superviseurCommission=floatval($transaction->montant*$config->taux_com_sup_retrait / 100); //par la Part de la banque partenaire en % ) et créditer le
// $hyperviseurCommission = $frais - $superviseurCommission - $agentCommission - $banqueCommission; //compte des opérations défini avec notre banque partenaire
//
//// dd(array($hyperviseurCommission ,$superviseurCommission)); $walletAgent->balance_princ += $transaction->montant;
// $walletAgent->balance_com += $agentCommission;
// $walletSuperviseur->balance_com += $superviseurCommission; $agentCommission=floatval($transaction->montant*$config->taux_com_ag_retrait / 100);
// $walletHyperviseur->balance_com += $hyperviseurCommission; $superviseurCommission=floatval($transaction->montant*$config->taux_com_sup_retrait / 100);
// $hyperviseurCommission = $frais - $superviseurCommission - $agentCommission - $banqueCommission;
// $transaction->id_wallet_sup = $walletSuperviseur->id;
// $transaction->commission_sup = $superviseurCommission; // dd(array($hyperviseurCommission ,$superviseurCommission));
// $transaction->id_wallet_hyp = $walletHyperviseur->id; $walletAgent->balance_com += $agentCommission;
// $transaction->commission_hyp = $hyperviseurCommission; $walletSuperviseur->balance_com += $superviseurCommission;
// $transaction->commission_ag = $agentCommission; $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,9 +170,10 @@ class TransactionController extends Controller
return $this->successResponse($walletAgent); 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']); $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); return $this->successResponse($transactions);
} }
@ -162,28 +181,28 @@ class TransactionController extends Controller
{ {
$rules = [ $rules = [
'id_wallet' => 'required|integer|min:1', 'id_wallet' => 'required|integer|min:1',
'montant'=> 'required|numeric|min:0|not_in:0', 'montant' => 'required|numeric|min:0|not_in:0',
'type' =>'required|in:credit,debit', 'type' => 'required|in:credit,debit',
]; ];
$this->validate($request,$rules); $this->validate($request, $rules);
$walletAgent = Wallet::findOrFail($request->get('id_wallet')); $walletAgent = Wallet::findOrFail($request->get('id_wallet'));
$network_agent = NetworksAgent::findOrFail( $walletAgent->id_networkAgent); $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
// Configuratrion du wallet // Configuratrion du wallet
$config = ConfigWallet::where('id_network',$network_agent->network_id)->firstOrFail(); $config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail();
$commission = null; $commission = null;
if($request->type == 'credit') { if ($request->type == 'credit') {
//Depot //Depot
$commission = ( $request->montant * $config->taux_com_client_depot / 100 ) + $config->frais_min_banque_depot; $commission = ($request->montant * $config->taux_com_client_depot / 100) + $config->frais_min_banque_depot;
$data['montant_calcule'] = $request->montant - $commission; $data['montant_calcule'] = $request->montant - $commission;
}elseif ($request->type == 'debit'){ } elseif ($request->type == 'debit') {
// Retrait // Retrait
$commission = $request->montant * $config->taux_com_client_retrait / 100 ; $commission = $request->montant * $config->taux_com_client_retrait / 100;
$data['montant_calcule'] = $request->montant + $commission; $data['montant_calcule'] = $request->montant + $commission;
} }
$data['commission'] = $commission ; $data['commission'] = $commission;
return $this->successResponse($data); return $this->successResponse($data);
} }
} }

View File

@ -100,11 +100,15 @@ class WalletTransaction extends Model
public function rules() 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 [ return [
'facade'=>'required|in:front,back',
'montant'=> 'required|numeric|min:0|not_in:0', 'montant'=> 'required|numeric|min:0|not_in:0',
'numCarte'=>'required', 'numCarte'=>'required',
'cvv'=>'required|integer|min:100|max:9999', 'cvv'=>'required_if:facade,front|size:3',
'expiration_date'=>'required|date_format:m/y|after_or_equal:today', 'expiration_date'=>'required_if:facade,front|date_format:m/y|after_or_equal:today',
'type' =>'required|in:credit,debit', 'type' =>'required|in:credit,debit',
'id_wallet' => 'required|integer|min:0' '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'); 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); return response()->json($this->formatResponse($code,null,$message), $code);
} }

View File

@ -2,5 +2,6 @@
return [ return [
'model_not_found' => 'Does not exist any instance of :model with given id', 'model_not_found' => 'Does not exist any instance of :model with given id',
'unexpected_error'=> 'Unexpected error. Try later', '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 [ return [
'model_not_found' => 'Il n\'existe aucune instance de :model avec l\'id donné', 'model_not_found' => 'Il n\'existe aucune instance de :model avec l\'id donné',
'unexpected_error'=> 'Erreur inattendue. Essayer plus tard', 'unexpected_error'=> 'Erreur inattendue. Essayer plus tard',
'service_unavailable' => 'Service non disponible' 'service_unavailable' => 'Service non disponible',
'invalid_cvv' => 'CVV invalide'
]; ];