<?php
namespace App\Http\Controllers\Api\V1\User\Auth;
use Exception;
use App\Models\User;
use Illuminate\Http\Request;
use App\Constants\GlobalConst;
use App\Http\Helpers\Response;
use App\Traits\User\LoggedInUsers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use App\Http\Controllers\Api\V1\User\Auth\AuthorizationController;
use App\Models\MerchantApiKey;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
protected $request_data;
use AuthenticatesUsers, LoggedInUsers;
/**
* Handle a login request to the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function login(Request $request)
{
$this->request_data = $request;
$validator = Validator::make($request->all(),[
'credentials' => 'required|string',
'password' => 'required|string',
]);
if($validator->fails()) {
return Response::error($validator->errors()->all(),[]);
}
$validated = $validator->validate();
if(!User::where($this->username(),$validated['credentials'])->exists()) {
return Response::error([__('User doesn\'t exists!')],[],404);
}
$user = User::where($this->username(),$validated['credentials'])->first();
if(!$user) return Response::error([__('User doesn\'t exists')]);
if(Hash::check($validated['password'],$user->password)) {
if($user->status != GlobalConst::ACTIVE) return Response::error([__("Your account is temporary banded. Please contact with system admin")]);
// User authenticated
$token = $user->createToken("auth_token")->accessToken;
return $this->authenticated($request,$user,$token);
}
return Response::error([__('Credentials didn\'t match')]);
}
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
$request->merge(['status' => true]);
$request->merge([$this->username() => $request->credentials]);
return $request->only($this->username(), 'password','status');
}
/**
* Get the login username to be used by the controller.
*
* @return string
*/
public function username()
{
$request = $this->request_data->all();
$credentials = $request['credentials'];
if(filter_var($credentials,FILTER_VALIDATE_EMAIL)) {
return "email";
}
return "username";
}
/**
* Get the guard to be used during authentication.
*
* @return \Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard()
{
return Auth::guard("api");
}
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user, $token)
{
$user->update([
'two_factor_verified' => false,
]);
try{
$mail_response = [];
if($user->email_verified == false) {
$mail_response = AuthorizationController::sendCodeToMail($user);
}
}catch(Exception $e) {
return Response::error([$e->getMessage()],[],500);
}
try{
$this->refreshUserWallets($user);
$this->refreshMerchant($user);
}catch(Exception $e) {
return Response::error([__('Login Failed! Failed to refresh wallet! Please try again')],[],500);
}
$this->createLoginLog($user);
$merchat_api_keys = MerchantApiKey::where('user_id',$user->id)->first();
return Response::success([__('User successfully logged in')],[
'token' => $token,
'user_info' => $user->only([
'id',
'firstname',
'lastname',
'fullname',
'username',
'email',
'mobile_code',
'mobile',
'full_mobile',
'email_verified',
'kyc_verified',
'two_factor_verified',
'two_factor_status',
'two_factor_secret',
]),
'authorization' => [
'status' => count($mail_response) > 0 ? true : false,
'token' => $mail_response['token'] ?? "",
],
'api_keys' => [
'client_id' => $merchat_api_keys->client_id ?? '',
'secret_id' => $merchat_api_keys->secret_id ?? '',
'env' => $merchat_api_keys->env ?? '',
],
],200);
}
}
Initiates a new payment transaction.
create-order
| Parameter | Type | Details |
|---|---|---|
| amount | decimal | Your Amount , Must be rounded at 2 precision. |
| currency | string | Currency Code, Must be in Upper Case (Alpha-3 code) |
| success_url | string | Enter your return or success URL |
| cancel_url | string (optional) | Enter your cancel or failed URL |
Request Example (guzzle)
<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $base_url.'create-order', [
'headers' => [
'Authorization' => 'Bearer '. $authorizationToken,
'accept' => 'application/json',
'content-type' => 'application/json',
],
'form_params' => [
'amount' => '$amount',
'currency' => 'currency',
'success_url' => 'success_url',
'cancel_url' => 'cancel_url',
],
]);
echo $response->getBody();
**Response: SUCCESS (200 OK)**
{
"message": {
"success": [
"Order created successfully."
]
},
"data": {
"redirect_url":"https://example.com/login/OISADFDFSDFSF",
"order_details":{
"amount" : "10",
"fixed_charge" : 2,
"percent_charge" : 1,
"total_charge" : 3,
"total_payable" : 13,
"currency" : "USD",
"expiry_time": "2024-04-25T06:48:35.984285Z",
"success_url": "http://127.0.0.1/nfcpay/user/transaction/success",
"cancel_url": "http://127.0.0.1/nfcpay/user/transaction/cancel"
}
},
"type": "success"
}
**Response: ERROR (400 FAILED)**
{
"message": {
"error": [
"Invalid token."
]
},
"data": null,
"type": "error"
}