adjust checkbalnce on PaymentController
|
|
@ -536,63 +536,145 @@ class CinetpayController extends Controller
|
|||
'http_errors' => false
|
||||
]);
|
||||
|
||||
$responseData = json_decode($loginResponse->getBody()->getContents());
|
||||
$token = $responseData->data->token;
|
||||
$responseCode = $loginResponse->getStatusCode();
|
||||
if ( $responseCode == 200 && !empty($token)) {
|
||||
// Add Contact
|
||||
$balanceResponse = $client->get('transfer/check/balance', [
|
||||
'query' => [
|
||||
'token' => $token
|
||||
],
|
||||
'timeout' => $this->timeout,
|
||||
'http_errors' => false
|
||||
]);
|
||||
$responseData = json_decode($loginResponse->getBody()->getContents(), false);
|
||||
|
||||
$responseCode = $balanceResponse->getStatusCode();
|
||||
$responseData = json_decode($balanceResponse->getBody()->getContents());
|
||||
if ($responseCode == 200) {
|
||||
$amountAvailable = $responseData?->data?->countryBalance?->{$countryCode}?->available ?? 0;
|
||||
$fees = 0;
|
||||
$aggregator = PaymentAggregator::where('name','like','%cinetpay%')->first();
|
||||
if(!empty($aggregator)){
|
||||
$baseQuery = $aggregator->rates()->where('type', PaymentType::CASH_IN)
|
||||
->where('method', PaymentMethod::WALLET)
|
||||
->when($paymentChannel, function ($q) use($paymentChannel){
|
||||
return $q->where('channel',$paymentChannel);
|
||||
});
|
||||
// Vérification de la validité de la réponse avant d’accéder aux valeurs
|
||||
if ($responseCode !== 200 || empty($responseData) || empty($responseData->data?->token)) {
|
||||
Log::error("CinetPay Login Error :: code={$responseCode} | message=" . ($responseData->message ?? 'No message'));
|
||||
return $this->errorResponse(__('errors.service_unavailable_try_later'));
|
||||
}
|
||||
|
||||
$rate = (clone $baseQuery)->where('country', $countryCode)->first();
|
||||
if(empty($rate)){
|
||||
$rate = (clone $baseQuery)->where('country','ALL')->first();
|
||||
}
|
||||
$token = $responseData->data->token;
|
||||
|
||||
if(!empty($rate)){
|
||||
if(!empty($rate->fixed_fees)){
|
||||
$targetCurrency = $country->currency->code;
|
||||
$sourceCurrency = $targetCurrency;
|
||||
if(!empty($rate->fixed_fees_currency)){
|
||||
$sourceCurrency = $rate->fixed_fees_currency;
|
||||
}
|
||||
$fixed_fees = $this->toMoneyAmount($rate->fixed_fees, $sourceCurrency, $targetCurrency);
|
||||
$fees = (($amount - $fixed_fees) * $rate->rate / 100 ) + $fixed_fees;
|
||||
}else{
|
||||
$fees = $amount * $rate->rate / 100;
|
||||
}
|
||||
}
|
||||
// Vérification du solde
|
||||
$balanceResponse = $client->get('transfer/check/balance', [
|
||||
'query' => ['token' => $token],
|
||||
'timeout' => $this->timeout,
|
||||
'http_errors' => false
|
||||
]);
|
||||
|
||||
$responseCode = $balanceResponse->getStatusCode();
|
||||
$responseData = json_decode($balanceResponse->getBody()->getContents(), false);
|
||||
|
||||
if ($responseCode == 200) {
|
||||
// Récupération sécurisée du solde
|
||||
$amountAvailable = $responseData?->data?->countryBalance?->{$countryCode}?->available ?? 0;
|
||||
$fees = 0;
|
||||
|
||||
Log::info("CinetPay check Balance : " . $amountAvailable);
|
||||
|
||||
$aggregator = PaymentAggregator::where('name', 'like', '%cinetpay%')->first();
|
||||
if (!empty($aggregator)) {
|
||||
$baseQuery = $aggregator->rates()
|
||||
->where('type', PaymentType::CASH_IN)
|
||||
->where('method', PaymentMethod::WALLET)
|
||||
->when($paymentChannel, function ($q) use ($paymentChannel) {
|
||||
return $q->where('channel', $paymentChannel);
|
||||
});
|
||||
|
||||
$rate = (clone $baseQuery)->where('country', $countryCode)->first();
|
||||
if (empty($rate)) {
|
||||
$rate = (clone $baseQuery)->where('country', 'ALL')->first();
|
||||
}
|
||||
|
||||
$amount += $fees;
|
||||
if (!empty($rate)) {
|
||||
if (!empty($rate->fixed_fees)) {
|
||||
$targetCurrency = $country->currency->code;
|
||||
$sourceCurrency = !empty($rate->fixed_fees_currency)
|
||||
? $rate->fixed_fees_currency
|
||||
: $targetCurrency;
|
||||
|
||||
if ($amountAvailable >= $amount){
|
||||
return $this->successResponse("Solde disponible");
|
||||
}else{
|
||||
Log::error("Solde insuffisant :: ".$amountAvailable);
|
||||
return $this->errorResponse(__('errors.service_unavailable_try_later'));
|
||||
$fixed_fees = $this->toMoneyAmount($rate->fixed_fees, $sourceCurrency, $targetCurrency);
|
||||
$fees = (($amount - $fixed_fees) * $rate->rate / 100) + $fixed_fees;
|
||||
} else {
|
||||
$fees = $amount * $rate->rate / 100;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$amount += $fees;
|
||||
|
||||
if ($amountAvailable >= $amount) {
|
||||
return $this->successResponse("Solde disponible");
|
||||
} else {
|
||||
Log::error("Solde insuffisant :: " . $amountAvailable);
|
||||
return $this->errorResponse(__('errors.service_unavailable_try_later'));
|
||||
}
|
||||
} else {
|
||||
Log::error("CinetPay Balance Error :: code={$responseCode} | message=" . ($responseData->message ?? 'No message'));
|
||||
return $this->errorResponse(__('errors.service_unavailable_try_later'));
|
||||
}
|
||||
|
||||
|
||||
// Login
|
||||
// $loginResponse = $client->post('auth/login', [
|
||||
// 'form_params' => [
|
||||
// "apikey" => config('variables.cinetpay_api_key'),
|
||||
// "password" => config('variables.cinetpay_transfert_password'),
|
||||
// ],
|
||||
// 'timeout' => $this->timeout,
|
||||
// 'http_errors' => false
|
||||
// ]);
|
||||
|
||||
// $responseData = json_decode($loginResponse->getBody()->getContents());
|
||||
// $token = $responseData->data->token;
|
||||
// $responseCode = $loginResponse->getStatusCode();
|
||||
// if ( $responseCode == 200 && !empty($token)) {
|
||||
// // Add Contact
|
||||
// $balanceResponse = $client->get('transfer/check/balance', [
|
||||
// 'query' => [
|
||||
// 'token' => $token
|
||||
// ],
|
||||
// 'timeout' => $this->timeout,
|
||||
// 'http_errors' => false
|
||||
// ]);
|
||||
|
||||
// $responseCode = $balanceResponse->getStatusCode();
|
||||
// $responseData = json_decode($balanceResponse->getBody()->getContents());
|
||||
// if ($responseCode == 200) {
|
||||
// $amountAvailable = $responseData?->data?->countryBalance?->{$countryCode}?->available ?? 0;
|
||||
// $fees = 0;
|
||||
// LOG::info("CinetPay check Balance : ".$amountAvailable);
|
||||
// $aggregator = PaymentAggregator::where('name','like','%cinetpay%')->first();
|
||||
// if(!empty($aggregator)){
|
||||
// $baseQuery = $aggregator->rates()->where('type', PaymentType::CASH_IN)
|
||||
// ->where('method', PaymentMethod::WALLET)
|
||||
// ->when($paymentChannel, function ($q) use($paymentChannel){
|
||||
// return $q->where('channel',$paymentChannel);
|
||||
// });
|
||||
|
||||
// $rate = (clone $baseQuery)->where('country', $countryCode)->first();
|
||||
// if(empty($rate)){
|
||||
// $rate = (clone $baseQuery)->where('country','ALL')->first();
|
||||
// }
|
||||
|
||||
// if(!empty($rate)){
|
||||
// if(!empty($rate->fixed_fees)){
|
||||
// $targetCurrency = $country->currency->code;
|
||||
// $sourceCurrency = $targetCurrency;
|
||||
// if(!empty($rate->fixed_fees_currency)){
|
||||
// $sourceCurrency = $rate->fixed_fees_currency;
|
||||
// }
|
||||
// $fixed_fees = $this->toMoneyAmount($rate->fixed_fees, $sourceCurrency, $targetCurrency);
|
||||
// $fees = (($amount - $fixed_fees) * $rate->rate / 100 ) + $fixed_fees;
|
||||
// }else{
|
||||
// $fees = $amount * $rate->rate / 100;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// $amount += $fees;
|
||||
|
||||
// if ($amountAvailable >= $amount){
|
||||
// return $this->successResponse("Solde disponible");
|
||||
// }else{
|
||||
// Log::error("Solde insuffisant :: ".$amountAvailable);
|
||||
// return $this->errorResponse(__('errors.service_unavailable_try_later'));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
$errorMessage = $responseData?->description ?? $responseData?->message;
|
||||
Log::error("Error CinetPay check balance");
|
||||
Log::error("Response data :: ".json_encode($responseData ?? ''));
|
||||
|
|
|
|||
|
|
@ -433,7 +433,6 @@ class FlutterwaveController extends Controller
|
|||
'type' => 'nullable|string' // mobilemoney,account
|
||||
]);
|
||||
|
||||
|
||||
$amount = floatval($request->input('amount'));
|
||||
$type = $request->input('type', 'mobilemoney');
|
||||
$countryId = $request->input('country_id');
|
||||
|
|
@ -454,6 +453,7 @@ class FlutterwaveController extends Controller
|
|||
$responseData = json_decode($balanceResponse->getBody()->getContents());
|
||||
if ($responseCode == 200) {
|
||||
$amountAvailable = $responseData?->data?->available_balance ?? 0;
|
||||
Log::info("Flutterwave check balance :: ".$amountAvailable." ".$currencyCode);
|
||||
|
||||
// https://flutterwavedoc.readme.io/reference/get-transfer-fee
|
||||
$fees = 0;
|
||||
|
|
@ -477,7 +477,6 @@ class FlutterwaveController extends Controller
|
|||
if(!empty($data)){
|
||||
$fee = $data[0]->fee;
|
||||
$feeType = $data[0]->fee_type;
|
||||
|
||||
if($feeType == 'value'){
|
||||
$fees = $fee;
|
||||
}
|
||||
|
|
@ -492,14 +491,14 @@ class FlutterwaveController extends Controller
|
|||
return $this->successResponse("Solde disponible");
|
||||
}else{
|
||||
|
||||
Log::error("Solde insuffisant :: ".$amountAvailable);
|
||||
Log::error(" Solde insuffisant :: ".$amountAvailable);
|
||||
return $this->errorResponse(__('errors.service_unavailable_try_later'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$errorMessage = $responseData?->description ?? $responseData?->message;
|
||||
Log::error("Error CinetPay check balance");
|
||||
Log::error("Error Flutterwave check balance");
|
||||
Log::error("Response data :: ".json_encode($responseData ?? ''));
|
||||
return $this->errorResponse($errorMessage ?? __('errors.unexpected_error'));
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ class PaymentController extends Controller
|
|||
$networkName = strtolower($request->input('network_name'));
|
||||
|
||||
if(str_contains($networkName,'orange') || str_contains($networkName,'mtn')){
|
||||
// return app(CinetpayController::class)->payOut($request);
|
||||
//return app(CinetpayController::class)->payOut($request);
|
||||
return app(FlutterwaveController::class)->payOut($request);
|
||||
}
|
||||
}
|
||||
|
|
@ -229,8 +229,21 @@ class PaymentController extends Controller
|
|||
*/
|
||||
public function checkBalance(Request $request)
|
||||
{
|
||||
// return app(CinetpayController::class)->checkBalance($request);
|
||||
return app(FlutterwaveController::class)->checkBalance($request);
|
||||
$aggregator = PaymentAggregator::where('status', 1)->first();
|
||||
if (!$aggregator) {
|
||||
return $this->errorResponse(trans('errors.model_not_found', ['model' => 'methods']));
|
||||
}
|
||||
|
||||
switch (strtolower($aggregator->name)) {
|
||||
case 'cinetpay':
|
||||
return app(CinetpayController::class)->checkBalance($request);
|
||||
case 'flutterwave':
|
||||
return app(FlutterwaveController::class)->checkBalance($request);
|
||||
default:
|
||||
return $this->errorResponse(__('errors.unexpected_error'));
|
||||
}
|
||||
//return app(CinetpayController::class)->checkBalance($request);
|
||||
// return app(FlutterwaveController::class)->checkBalance($request);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -353,11 +353,11 @@ class StripeController extends Controller
|
|||
'card_no' => 'required_if:payment_method,CARD',
|
||||
'exp_month' => 'required_if:payment_method,CARD',
|
||||
'exp_year' => 'required_if:payment_method,CARD',
|
||||
// 'cvc' => 'required_if:payment_method,CARD',
|
||||
// 'cvc' => 'required_if:payment_method,CARD',
|
||||
'bank_country' => 'required_if:payment_method,BANK|string|size:2',
|
||||
'bank_currency' => 'required_if:payment_method,BANK|string|size:3',
|
||||
'bank_account_number' => 'required_if:payment_method,BANK|string',
|
||||
// 'aggregator_id' => 'required|integer',
|
||||
//'aggregator_id' => 'required|integer',
|
||||
'amount' => 'required|numeric',
|
||||
'currency' => 'required|string|size:3',
|
||||
'customer_id' => 'nullable',
|
||||
|
|
@ -417,7 +417,7 @@ class StripeController extends Controller
|
|||
'number' => $request->input('card_no'),
|
||||
'exp_month' => $request->input('exp_month'),
|
||||
'exp_year' => $request->input('exp_year'),
|
||||
// 'cvc' => $request->input('cvc'),
|
||||
// 'cvc' => $request->input('cvc'),
|
||||
]
|
||||
]
|
||||
);
|
||||
|
|
|
|||
0
database/migrations/2022_07_06_132028_create_payment_aggregators_table.php
Normal file → Executable file
0
database/migrations/2022_07_27_075519_create_payment_transactions_table.php
Normal file → Executable file
0
database/migrations/2023_06_05_111933_create_payment_refunds_table.php
Normal file → Executable file
0
database/migrations/2023_06_07_070215_rename_state_to_status_in_payment_transactions.php
Normal file → Executable file
0
database/migrations/2023_06_07_102900_change_customer_id_and_customer_phone_number_in_payment_transactions.php
Normal file → Executable file
0
database/migrations/2023_06_29_095044_set_address_column_nullable_in_payment_transactions.php
Normal file → Executable file
0
database/migrations/2023_07_11_143815_create_payment_aggregator_rates_table.php
Normal file → Executable file
0
database/migrations/2023_07_17_110454_update_customer_state_in_payment_transactions.php
Normal file → Executable file
0
database/migrations/2023_08_30_135610_set_date_type_for_payment_date_in_payment_transactions.php
Normal file → Executable file
0
database/migrations/2023_10_12_141608_add_payment_endpoint_and_payment_verify_endpoint_in_payment_transactions.php
Normal file → Executable file
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |