<?php
namespace App\Controller;
use App\Repository\PatientRepository;
use App\Service\Abha;
use Doctrine\Persistence\ManagerRegistry;
use Dompdf\{Dompdf, Options};
use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
use phpseclib3\Crypt\PublicKeyLoader;
use phpseclib3\Crypt\RSA;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\{Request, Response};
use Symfony\Component\Routing\Annotation\Route;
#[Route(path: '/abha'), IsGranted(data: 'IS_AUTHENTICATED_REMEMBERED')]
class AbhaController extends AbstractController
{
public function __construct(
private ManagerRegistry $doctrine,
private Encryptor $encryptor
) {}
#[Route(path: '/abha-number-verify', name: 'abha_num_verify', methods: ['GET', 'POST'])]
public function abhaNumberVerify(Request $request): Response
{
if ($request->request->has('type') || $request->get('data')) {
$type = $request->request->get('type');
} else {
$type = $this->encryptor->decrypt($request->query->get('type'));
}
return $this->render('abha/verify1.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
]);
}
#[Route(path: '/aadharnumberverify', name: 'aadharnumberverify', methods: ['GET', 'POST'])]
public function aadharnumberverify(Request $request): Response
{
if ($request->request->has('type') || $request->get('data')) {
$type = $request->request->get('type');
} else {
$type = $this->encryptor->decrypt($request->query->get('type'));
}
return $this->render('abha/aadharnumberverify.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
]);
}
#[Route(path: '/mobilenumberverify', name: 'mobilenumberverify', methods: ['GET', 'POST'])]
public function mobilenumberverify(Request $request): Response
{
if ($request->request->has('type') || $request->get('data')) {
$type = $request->request->get('type');
} else {
$type = $this->encryptor->decrypt($request->query->get('type'));
}
return $this->render('abha/mobilenumberverify.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
]);
}
#[Route(path: '/abha-address-num-verification', name: 'abha_address_num_verification', methods: ['GET', 'POST'])]
public function abhaAddressNumberVerification(Request $request): Response
{
if ($request->request->has('type') || $request->get('data')) {
$type = $request->request->get('type');
} else {
$type = $this->encryptor->decrypt($request->query->get('type'));
}
return $this->render('abha/verifyt1.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
]);
}
#[Route(path: '/abha-num-generate-otp', name: 'abha_num_generate_otp', methods: ['GET', 'POST'])]
public function abhaNumGenerateOtp(Request $request): Response
{
$auth_mode = $request->request->get('auth_mode');
$timer = $request->request->get('timer');
$type = $request->request->get('type');
$abhaNumber = $request->request->get('abha_number');
$mobileNumber = $request->request->get('mobile_number');
$aadharcardNumber = $request->request->get('aadharcard_number');
if ($auth_mode == 'auth_mobile') {
$scope = ['abha-login', 'mobile-verify'];
$encryptNumber = $mobileNumber;
$otpsystem = 'abdm';
$loginhint = 'mobile';
} elseif ($auth_mode == 'auth_viaaadhaar') {
$scope = ['abha-login', 'aadhaar-verify'];
$encryptNumber = $aadharcardNumber;
$otpsystem = 'aadhaar';
$loginhint = 'aadhaar';
} elseif ($auth_mode == 'auth_aadhaar') {
$scope = ['abha-login', 'aadhaar-verify'];
$encryptNumber = $abhaNumber;
$otpsystem = 'aadhaar';
$loginhint = 'abha-number';
} else {
$scope = ['abha-login', 'mobile-verify'];
$encryptNumber = $abhaNumber;
$otpsystem = 'abdm';
$loginhint = 'abha-number';
}
$encrypted = $this->encryptWithPublicKey($encryptNumber);
$loginId = (base64_encode($encrypted));
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => $scope,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem
]
]);
$decodedPayload = $response->toArray();
if ($decodedPayload['txnId'] == '') {
// dd('if ma aavyu');
$this->addFlash(
'danger',
'This Details Not Found'
);
return $this->render('abha/verify1.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
'message' => 'This Details Not Found',
]);
} else {
// dd('else ma aavyu');
$this->addFlash(
'success',
$decodedPayload['message']
);
return $this->render('abha/verify2.html.twig', [
'txn_id' => $decodedPayload['txnId'],
'timer' => $timer,
'message' => $decodedPayload['message'],
'authMode' => $auth_mode,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem,
'mobileNumber' => $mobileNumber,
'abhaNumber' => $abhaNumber,
'aadharcardNumber' => $aadharcardNumber
]);
}
} catch (\Exception) {
// dd('catch ma aavyu');
if($auth_mode == 'auth_viaaadhaar'){
return $this->render('abha/aadharnumberverify.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
]);
}elseif($auth_mode == 'auth_mobile'){
return $this->render('abha/mobilenumberverify.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
'message' => 'This Details Not Found',
]);
}else{
return $this->render('abha/mobilenumberverify.html.twig', [
'abha_number' => '',
'mobile_number' => '',
'aadharcard_number' => '',
'type' => $type,
'message' => 'This Details Not Found',
]);
}
}
}
#[Route(path: '/abha-number-resend-otp', name: 'abhanumber_resend_otp', methods: ['GET', 'POST'])]
public function abhaNumberResendOtp(Request $request): Response
{
$txn_id = $request->request->get('txn_id');
$auth_mode = $request->request->get('authMode');
$aadharcardNumber = $request->request->get('aadharcardNumber');
$abhaNumber = $request->request->get('abhaNumber');
$mobileNumber = $request->request->get('mobileNumber');
if ($auth_mode == 'auth_mobile') {
$scope = ['abha-login', 'mobile-verify'];
$encryptNumber = $mobileNumber;
$otpsystem = 'abdm';
$loginhint = 'mobile';
} elseif ($auth_mode == 'auth_viaaadhaar') {
$scope = ['abha-login', 'aadhaar-verify'];
$encryptNumber = $aadharcardNumber;
$otpsystem = 'aadhaar';
$loginhint = 'aadhaar';
} elseif ($auth_mode == 'auth_aadhaar') {
$scope = ['abha-login', 'aadhaar-verify'];
$encryptNumber = $abhaNumber;
$otpsystem = 'aadhaar';
$loginhint = 'abha-number';
} else {
$scope = ['abha-login', 'mobile-verify'];
$encryptNumber = $abhaNumber;
$otpsystem = 'abdm';
$loginhint = 'abha-number';
}
$encrypted = $this->encryptWithPublicKey($encryptNumber);
$loginId = (base64_encode($encrypted));
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => $scope,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem
]
]);
$decodedPayload = $response->toArray();
return $this->json([
'txn_id' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'authMode' => $auth_mode,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem,
'mobileNumber' => $mobileNumber,
'abhaNumber' => $abhaNumber,
'aadharcardNumber' => $aadharcardNumber
]);
} catch (\Exception) {
return $this->json([
'txn_id' => $txn_id,
'message' => '',
'authMode' => $auth_mode,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem,
'mobileNumber' => $mobileNumber,
'abhaNumber' => $abhaNumber,
'aadharcardNumber' => $aadharcardNumber
]);
}
}
#[Route(path: '/abha-number-otp-verify', name: 'verify_abhanumber_otp', methods: ['GET', 'POST'])]
public function abhaNumberOtpVerify(Request $request): Response
{
$otp = $request->request->get('otp');
$timer = $request->request->get('timer');
$auth_mode = $request->request->get('auth_mode');
$txnId = $request->request->get('txn_id');
$aadharcardNumber = $request->request->get('aadharcardNumber');
$abhaNumber = $request->request->get('abhaNumber');
$mobileNumber = $request->request->get('mobileNumber');
$otpsystem = $request->request->get('otpSystem');
$loginhint = $request->request->get('loginHint');
$loginId = $request->request->get('loginId');
$scope = match ($auth_mode) {
'auth_mobile' => ['abha-login', 'mobile-verify'],
'auth_aadhaar' => ['abha-login', 'aadhaar-verify'],
'auth_viaaadhaar' => ['abha-login', 'aadhaar-verify'],
default => ['abha-login', 'mobile-verify'],
};
$encrypted = $this->encryptWithPublicKey($otp);
$otpencoded = (base64_encode($encrypted));
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => $scope,
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'txnId' => $txnId,
'otpValue' => $otpencoded,
]
]
]
]);
$decodedPayload = $response->toArray();
if($decodedPayload['authResult'] == 'success') {
$this->addFlash(
'success',
$decodedPayload['message']
);
if (isset($decodedPayload['accounts']) && is_array($decodedPayload['accounts'])) {
foreach ($decodedPayload['accounts'] as $account) {
$base64Image = $account['profilePhoto'];
$imageUrl = 'data:image/jpeg;base64,' . $base64Image;
$accounts[] = ['name' => $account['name'], 'profilePhoto' => $imageUrl, 'ABHANumber' => $account['ABHANumber'], 'preferredAbhaAddress' => $account['preferredAbhaAddress']];
}
} else {
throw new \Exception('No account found.');
}
if ($auth_mode == 'auth_mobile') {
return $this->render('abha/verify3.html.twig', [
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'token' => $decodedPayload['token'],
'accounts' => $accounts,
'authMode' => $auth_mode
]);
} else {
return $this->redirectToRoute('abha_num_verify_account', ['tokens' => $this->encryptor->encrypt($decodedPayload['token']), 'txnId' => $this->encryptor->encrypt($txnId)]);
}
} else {
$this->addFlash(
'error',
$decodedPayload['message']
);
}
$accounts = [];
return $this->render('abha/verify2.html.twig', [
'txn_id' => $txnId,
'message' => '',
'timer' => $timer,
'authMode' => $auth_mode,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem,
'mobileNumber' => $mobileNumber,
'abhaNumber' => $abhaNumber,
'aadharcardNumber' => $aadharcardNumber
]);
} catch (\Exception) {
return $this->render('abha/verify2.html.twig', [
'txn_id' => $txnId,
'message' => '',
'timer' => $timer,
'authMode' => $auth_mode,
'loginHint' => $loginhint,
'loginId' => $loginId,
'otpSystem' => $otpsystem,
'mobileNumber' => $mobileNumber,
'abhaNumber' => $abhaNumber,
'aadharcardNumber' => $aadharcardNumber
]);
}
}
#[Route('/abha-number-user-verify', name: 'mobile_abhanumber_mode', methods: ['GET', 'POST'])]
public function mobileAbhaNumberMode(Request $request): Response
{
$token = $request->request->get('token');
$fetch_mode = $request->request->get('fetch_mode');
$txnId = $request->request->get('txnId');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify/user', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'T-token: Bearer ' . $token,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'ABHANumber' => $fetch_mode,
'txnId' => $txnId
]
]);
$decodedPayload = $response->toArray();
return $this->redirectToRoute('abha_num_verify_account', ['tokens' => $this->encryptor->encrypt($decodedPayload['token']), 'txnId' => $this->encryptor->encrypt($txnId)]);
}
#[Route(path: '/abha-number-verify-account/{tokens}/{txnId}', name: 'abha_num_verify_account', methods: ['GET', 'POST'])]
#[ParamDecryptor(["tokens","txnId"])]
public function abhaNumberVerifyAccount(string $tokens, string $txnId): Response
{
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => []
]);
$decodedPayload = $response->toArray();
if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
$data['dob'] = $decodedPayload['dayOfBirth'] . '-' . $decodedPayload['monthOfBirth'] . '-' . $decodedPayload['yearOfBirth'];
}
return $this->render('abha/abhaverification.html.twig', [
'tokens' => $tokens,
'type' => '',
'verify_flow' => 'true',
'txnId' => $txnId,
'message' => '',
'firstName' => $decodedPayload['firstName'],
'middleName' => $decodedPayload['middleName'],
'lastName' => $decodedPayload['lastName'],
'dob' => $data['dob'],
'gender' => $decodedPayload['gender'],
'profilePhoto' => $decodedPayload['profilePhoto'],
'mobile' => $decodedPayload['mobile'],
'preferredAbhaAddress' => $decodedPayload['preferredAbhaAddress'],
'address' => $decodedPayload['address'],
'pincode' => $decodedPayload['pincode'],
'ABHANumber' => $decodedPayload['ABHANumber']
]);
}
#[Route(path: '/abha-card', name: 'abha_card', methods: ['GET', 'POST'])]
public function abhaCard(Request $request): Response
{
if ($request->request->has('type') || $request->get('data')) {
$type = $request->request->get('type');
} else {
$type = $this->encryptor->decrypt($request->query->get('type'));
}
$caseId = $request->request->get('case_id');
if (!empty($caseId)) {
$session = $request->getSession();
$session->set('case_id', $caseId);
}
return $this->render('abha/step1.html.twig', [
'aadhar_number' => '',
'type' => $type,
]);
}
#[Route(path: '/generate-otp', name: 'generate_otp', methods: ['GET', 'POST'])]
public function generateOtp(Request $request): Response
{
$type = $request->request->get('type');
$aadharNumber = $request->request->get('aadhar_number');
$encrypted = $this->encryptWithPublicKey($aadharNumber);
$loginId = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => '',
'scope' => ['abha-enrol'],
'loginHint' => 'aadhaar',
'loginId' => $loginId,
'otpSystem' => 'aadhaar'
]
]);
$session = $request->getSession();
$session->set('session_txnId', 0);
$decodedPayload = $response->toArray();
} catch (\Exception) {
$this->addFlash(
'danger',
'Please enter valid Aadharcard Number.'
);
return $this->redirectToRoute('abha_card');
}
return $this->render('abha/step2.html.twig', [
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'aadharNumber' => $aadharNumber,
'type' => $type,
'timer' => '0'
]);
}
#[Route('/verify-otp', name: 'verify_otp', methods: ['GET', 'POST'])]
public function verifyOtp(Request $request): Response
{
$session = $request->getSession();
// dd($request->request->get('timer'));
if ($request->getMethod() == 'POST') {
$type = $request->request->get('type');
$message = $request->request->get('message');
$aadharNumber = $request->request->get('aadharNumber');
$otp = $request->request->get('otp');
$mobile_number = $request->request->get('mobile_number');
$txnId = $request->request->get('txn_id');
$timer = $request->request->get('timer');
// dd($message,$txnId,$aadharNumber,$otp,$mobile_number,$type);
} else {
$type = $session->get('type');
$otp = $session->get('otp');
$mobile_number = $session->get('mobile_number');
$txnId = $session->get('txnId');
$timer = $request->request->get('timer');
}
if (empty($type) || empty($otp) || empty($mobile_number) || empty($txnId) || empty($message) || empty($aadharNumber) || empty($timer)) {
throw $this->createNotFoundException('Invalid request parameters.');
}
$encrypted = $this->encryptWithPublicKey($otp);
$otpValue = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'timeStamp' => $isoTimestamp,
'txnId' => $txnId,
'otpValue' => $otpValue,
'mobile' => $mobile_number
]
],
'consent' => [
'code' => 'abha-enrollment',
'version' => '1.4'
]
]
]);
$decodedPayload = $response->toArray();
if ($decodedPayload['isNew'] == 'false') {
$message = $decodedPayload['ABHAProfile']['mobile'];
$mobile_numberdigit = ".$mobile_number";
$extractedDigits = substr($message, -4);
$extractedDigitsmobile = substr($mobile_numberdigit, -4);
if ($extractedDigits === $extractedDigitsmobile) {
return $this->render('abha/abhalink_step1.html.twig', [
'tokens' => $decodedPayload['tokens']['token'],
'type' => $type,
'verify_flow' => 'false',
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'firstName' => $decodedPayload['ABHAProfile']['firstName'],
'middleName' => $decodedPayload['ABHAProfile']['middleName'],
'lastName' => $decodedPayload['ABHAProfile']['lastName'],
'dob' => $decodedPayload['ABHAProfile']['dob'],
'gender' => $decodedPayload['ABHAProfile']['gender'],
'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
'mobile' => $decodedPayload['ABHAProfile']['mobile'],
'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
'address' => $decodedPayload['ABHAProfile']['address'],
'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
]);
} else {
return $this->render('abha/step3.html.twig', [
'txnId' => $decodedPayload['txnId'],
'type' => $type,
'mobile_number' => $mobile_number,
'tokens' => $decodedPayload['tokens']['token']
]);
}
} else {
return $this->render('abha/abhalink_step1.html.twig', [
'tokens' => $decodedPayload['tokens']['token'],
'type' => $type,
'verify_flow' => 'false',
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'firstName' => $decodedPayload['ABHAProfile']['firstName'],
'middleName' => $decodedPayload['ABHAProfile']['middleName'],
'lastName' => $decodedPayload['ABHAProfile']['lastName'],
'dob' => $decodedPayload['ABHAProfile']['dob'],
'gender' => $decodedPayload['ABHAProfile']['gender'],
'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
'mobile' => $decodedPayload['ABHAProfile']['mobile'],
'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
'address' => $decodedPayload['ABHAProfile']['address'],
'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
]);
}
} catch (\Exception) {
// $session->set('type', );
// $session->set('otp', $otp);
// $session->set('mobile_number', $mobile_number);
// $session->set('txnId', $txnId);
$this->addFlash('danger', 'The OTP entered is invalid. Please verify and re-enter the correct OTP.');
return $this->render('abha/step2.html.twig', [
'txnId' => $txnId,
'message' => $message,
'mobile_number' => $mobile_number,
'type' => $type,
'aadharNumber' => $aadharNumber,
'otp' => $otp,
'timer' => $timer
]);
//return $this->redirectToRoute('generate_otp');
}
}
#[Route('/process-verify-otp', name: 'process_verify_otp', methods: ['GET', 'POST'])]
public function processVerifyOtp(Request $request): Response
{
$session = $request->getSession();
$type = $session->get('type');
$otp = $session->get('otp');
$mobile_number = $session->get('mobile_number');
$txnId = $session->get('txnId');
if (empty($type) || empty($otp) || empty($mobile_number) || empty($txnId)) {
throw $this->createNotFoundException('Invalid request parameters.');
}
$encrypted = $this->encryptWithPublicKey($otp);
$otpValue = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'timeStamp' => $isoTimestamp,
'txnId' => $txnId,
'otpValue' => $otpValue,
'mobile' => $mobile_number
]
],
'consent' => [
'code' => 'abha-enrollment',
'version' => '1.4'
]
]
]);
$decodedPayload = $response->toArray();
if ($decodedPayload['isNew'] == true) {
$message = $decodedPayload['ABHAProfile']['mobile'];
$mobile_numberdigit = ".$mobile_number";
$extractedDigits = substr($message, -4);
$extractedDigitsmobile = substr($mobile_numberdigit, -4);
if ($extractedDigits === $extractedDigitsmobile && $decodedPayload['ABHAProfile']['mobile'] === 'null') {
$this->addFlash('success', $decodedPayload['message']);
return $this->render('abha/abhalink_step1.html.twig', [
'tokens' => $decodedPayload['tokens']['token'],
'type' => $type,
'verify_flow' => 'false',
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'firstName' => $decodedPayload['ABHAProfile']['firstName'],
'middleName' => $decodedPayload['ABHAProfile']['middleName'],
'lastName' => $decodedPayload['ABHAProfile']['lastName'],
'dob' => $decodedPayload['ABHAProfile']['dob'],
'gender' => $decodedPayload['ABHAProfile']['gender'],
'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
'mobile' => $decodedPayload['ABHAProfile']['mobile'],
'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
'address' => $decodedPayload['ABHAProfile']['address'],
'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
]);
} else {
return $this->render('abha/step3.html.twig', [
'txnId' => $decodedPayload['txnId'],
'type' => $type,
'mobile_number' => $mobile_number,
'tokens' => $decodedPayload['tokens']['token']
]);
}
} else {
return $this->render('abha/abhalink_step1.html.twig', [
'tokens' => $decodedPayload['tokens']['token'],
'type' => $type,
'verify_flow' => 'false',
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'firstName' => $decodedPayload['ABHAProfile']['firstName'],
'middleName' => $decodedPayload['ABHAProfile']['middleName'],
'lastName' => $decodedPayload['ABHAProfile']['lastName'],
'dob' => $decodedPayload['ABHAProfile']['dob'],
'gender' => $decodedPayload['ABHAProfile']['gender'],
'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
'mobile' => $decodedPayload['ABHAProfile']['mobile'],
'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
'address' => $decodedPayload['ABHAProfile']['address'],
'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
]);
}
} catch (\Exception $e) {
throw $this->createNotFoundException($e->getMessage());
}
}
#[Route('/abha-suggestion-new', name: 'abha_suggestion_new', methods: ['GET', 'POST'])]
public function abhaSuggestionNew(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
// dd($tokens,$txnId);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/suggestion', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'Transaction_Id: ' . $txnId,
'TIMESTAMP: ' . $isoTimestamp
],
'json' => []
]);
// dd($response);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
return $this->render('abha/abhalink_step2.html.twig', [
'tokens' => $tokens,
'txnId' => $decodedPayload['txnId'],
'abhaAddressList' => $decodedPayload['abhaAddressList']
]);
}
#[Route('/abha-address-verify-new', name: 'abha_addressverify_new', methods: ['GET', 'POST'])]
public function abhaAddressVerifyNew(Request $request): Response
{
$selectabha = $request->request->get('health_id');
$txnId = $request->request->get('txn_id');
$tokens = $request->request->get('tokens');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$client1 = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/abha-address', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getAccessToken(),
'Content-Type' => 'application/json',
'REQUEST-ID' => $this->GUID(),
'TIMESTAMP' => $isoTimestamp,
],
'json' => [
'txnId' => $txnId,
'abhaAddress' => $selectabha,
'preferred' => 1,
],
]);
$profileData1 = $response->toArray();
$response2 = $client1->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getAccessToken(),
'X-Token' => 'Bearer ' . $tokens,
'Content-Type' => 'application/json',
'REQUEST-ID' => $this->GUID(),
'TIMESTAMP' => $isoTimestamp,
],
]);
$profileData = $response2->toArray();
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
} catch (\Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface $e) {
return new Response('Error occurred!', Response::HTTP_BAD_REQUEST);
}
return $this->render('abha/stepnew10.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $profileData['firstName'],
'middleName' => $profileData['middleName'],
'lastName' => $profileData['lastName'],
'dob' => $data['dob'],
'gender' => $profileData['gender'],
'profilePhoto' => $profileData['profilePhoto'],
'mobile' => $profileData['mobile'] ?? '',
'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
'address' => $profileData['address'],
'pincode' => $profileData['pincode'],
'ABHANumber' => $profileData['ABHANumber']
]);
}
#[Route('/generate-abha-card-status', name: 'abhacard_status', methods: ['GET', 'POST'])]
public function abhaCardStatus(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$pincode = $request->request->get('pincode');
$firstName = $request->request->get('firstName');
$middleName = $request->request->get('middleName');
$lastName = $request->request->get('lastName');
$gender = $request->request->get('gender');
$dob = $request->request->get('dob');
$mobile = $request->request->get('mobile');
$preferredAbhaAddress = $request->request->get('preferredAbhaAddress');
$address = $request->request->get('address');
$pincode = $request->request->get('pincode');
$ABHANumber = $request->request->get('ABHANumber');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-Token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
]);
$binaryImageData = $response->getContent();
$base64Image = base64_encode($binaryImageData);
$mimeType = $response->getHeaders()['content-type'][0];
$imageUrl = 'data:' . $mimeType . ';base64,' . $base64Image;
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setDebugPng(false);
$pdfOptions->setDebugKeepTemp(false);
$pdfOptions->setIsRemoteEnabled(true);
$dompdf = new Dompdf($pdfOptions);
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
return $this->render('abha/step10.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $firstName,
'middleName' => $middleName,
'lastName' => $lastName,
'dob' => $dob,
'gender' => $gender,
'profilePhoto' => '',
'mobile' => $mobile,
'preferredAbhaAddress' => $preferredAbhaAddress,
'address' => $address,
'pincode' => $pincode,
'ABHANumber' => $ABHANumber,
'type' => 'test',
'imageUrl' => $imageUrl
]);
$html = preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi', '', $html);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
'Cache-Control' => 'no-cache, private',
'Pragma' => 'no-cache'
]);
}
#[Route('/generate-abha-card-status-verification', name: 'abhacard_status_verification', methods: ['GET', 'POST'])]
public function abhaCardStatusverification(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$pincode = $request->request->get('pincode');
$firstName = $request->request->get('firstName');
$middleName = $request->request->get('middleName');
$lastName = $request->request->get('lastName');
$gender = $request->request->get('gender');
$dob = $request->request->get('dob');
$mobile = $request->request->get('mobile');
$preferredAbhaAddress = $request->request->get('preferredAbhaAddress');
$address = $request->request->get('address');
$pincode = $request->request->get('pincode');
$ABHANumber = $request->request->get('ABHANumber');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-Token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
]);
$binaryImageData = $response->getContent();
$base64Image = base64_encode($binaryImageData);
$mimeType = $response->getHeaders()['content-type'][0];
$imageUrl = 'data:' . $mimeType . ';base64,' . $base64Image;
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setDebugPng(false);
$pdfOptions->setDebugKeepTemp(false);
$pdfOptions->setIsRemoteEnabled(true);
$dompdf = new Dompdf($pdfOptions);
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
return $this->render('abha/abhaverificationview.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $firstName,
'middleName' => $middleName,
'lastName' => $lastName,
'dob' => $dob,
'gender' => $gender,
'profilePhoto' => '',
'mobile' => $mobile,
'preferredAbhaAddress' => $preferredAbhaAddress,
'address' => $address,
'pincode' => $pincode,
'ABHANumber' => $ABHANumber,
'type' => 'test',
'imageUrl' => $imageUrl
]);
$html = preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi', '', $html);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
'Cache-Control' => 'no-cache, private',
'Pragma' => 'no-cache'
]);
}
#[Route('/generate-abha-card-address-status', name: 'abhacard_address_status', methods: ['GET', 'POST'])]
public function abhaCardAddressStatus(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$pincode = $request->request->get('pincode');
$firstName = $request->request->get('firstName');
$middleName = $request->request->get('middleName');
$lastName = $request->request->get('lastName');
$gender = $request->request->get('gender');
$dob = $request->request->get('dob');
$mobile = $request->request->get('mobile');
$preferredAbhaAddress = $request->request->get('preferredAbhaAddress');
$address = $request->request->get('address');
$pincode = $request->request->get('pincode');
$ABHANumber = $request->request->get('ABHANumber');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha/phr-card', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-Token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
]);
$binaryImageData = $response->getContent();
$base64Image = base64_encode($binaryImageData);
$mimeType = $response->getHeaders()['content-type'][0];
$imageUrl = 'data:' . $mimeType . ';base64,' . $base64Image;
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setDebugPng(false);
$pdfOptions->setDebugKeepTemp(false);
$pdfOptions->setIsRemoteEnabled(true);
$dompdf = new Dompdf($pdfOptions);
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
return $this->render('abha/addressdownload.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $firstName,
'middleName' => $middleName,
'lastName' => $lastName,
'dob' => $dob,
'gender' => $gender,
'profilePhoto' => '',
'mobile' => $mobile,
'preferredAbhaAddress' => $preferredAbhaAddress,
'address' => $address,
'pincode' => $pincode,
'ABHANumber' => $ABHANumber,
'type' => 'test',
'imageUrl' => $imageUrl
]);
$html = preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi', '', $html);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
'Cache-Control' => 'no-cache, private',
'Pragma' => 'no-cache'
]);
}
#[Route('/generate-abhacard-address', name: 'generate_address_abhacard', methods: ['GET', 'POST'])]
public function generateAbhaCardAddress(Request $request): Response
{
$tokens = $request->request->get('tokens');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha/phr-card', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-Token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
]);
$binaryImageData = $response->getContent();
$base64Image = base64_encode($binaryImageData);
// Determine the image mime type (for example, 'image/png' or 'image/jpeg')
$mimeType = $response->getHeaders()['content-type'][0];
$imageUrl = 'data:' . $mimeType . ';base64,' . $base64Image;
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setDebugPng(false);
$pdfOptions->setDebugKeepTemp(false);
$pdfOptions->setIsRemoteEnabled(true);
$dompdf = new Dompdf($pdfOptions);
$html = $this->renderView('abha/step6.html.twig', [
'imageUrl' => $imageUrl
]);
$html = preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi', '', $html);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
'Cache-Control' => 'no-cache, private',
'Pragma' => 'no-cache'
]);
}
#[Route('/generate-abha-card', name: 'generate_abhacard', methods: ['GET', 'POST'])]
public function generateAbhaCard(Request $request): Response
{
$tokens = $request->request->get('tokens');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-Token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
]);
$binaryImageData = $response->getContent();
$base64Image = base64_encode($binaryImageData);
// Determine the image mime type (for example, 'image/png' or 'image/jpeg')
$mimeType = $response->getHeaders()['content-type'][0];
$imageUrl = 'data:' . $mimeType . ';base64,' . $base64Image;
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setDebugPng(false);
$pdfOptions->setDebugKeepTemp(false);
$pdfOptions->setIsRemoteEnabled(true);
$dompdf = new Dompdf($pdfOptions);
$html = $this->renderView('abha/step6.html.twig', [
'imageUrl' => $imageUrl
]);
$html = preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi', '', $html);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
'Cache-Control' => 'no-cache, private',
'Pragma' => 'no-cache'
]);
}
#[Route('/generate-mobile-otp-update', name: 'generate_mobile_otp_update', methods: ['GET', 'POST'])]
public function generateMobileOtpupdate(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$mobileNumber = $request->request->get('mobilenumber');
$type = $request->request->get('type');
$timer = $request->request->get('timer');
$encrypted = $this->encryptWithPublicKey($mobileNumber);
$mobileEncoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
//dd($tokens,$txnId,$mobileNumber,$type,$mobileEncoded,$isoTimestamp);
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txnId,
'scope' => ['abha-enrol', 'mobile-verify'],
'loginHint' => 'mobile',
'loginId' => $mobileEncoded,
'otpSystem' => 'abdm'
]
]);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
return $this->render('abha/mobileupdate.html.twig', [
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'mobile_number' => $mobileNumber,
'type' => $type,
'tokens' => $tokens,
'timer' => $timer
]);
} catch (\Exception $e) {
// dd($e->getMessage());
return $this->render('abha/mobileupdate.html.twig', [
'txnId' => $txnId,
'message' => '',
'mobile_number' => $mobileNumber,
'type' => $type,
'tokens' => $tokens,
'timer' => $timer
]);
}
}
#[Route('/generate-mobile-otp-update-verification', name: 'generate_mobile_otp_update_verification', methods: ['GET', 'POST'])]
public function generateMobileOtpupdateverification(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$mobileNumber = $request->request->get('mobilenumber');
$type = $request->request->get('type');
$timer = $request->request->get('timer');
$encrypted = $this->encryptWithPublicKey($mobileNumber);
$mobileEncoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
// dd($tokens,$txnId,$mobileNumber,$type,$mobileEncoded,$isoTimestamp);
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txnId,
'scope' => ['abha-profile', 'mobile-verify'],
'loginHint' => 'mobile',
'loginId' => $mobileEncoded,
'otpSystem' => 'abdm'
]
]);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
return $this->render('abha/mobileupdateverification.html.twig', [
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'mobile_number' => $mobileNumber,
'type' => $type,
'tokens' => $tokens,
'timer' => $timer,
]);
} catch (\Exception $e) {
// dd($e->getMessage());
return $this->render('abha/mobileupdateverification.html.twig', [
'txnId' => $txnId,
'message' => '',
'mobile_number' => $mobileNumber,
'type' => $type,
'tokens' => $tokens,
'timer' => $timer,
]);
}
}
#[Route('/generate-mobile-otp', name: 'generate_mobile_otp', methods: ['GET', 'POST'])]
public function generateMobileOtp(Request $request): Response
{
$tokens = $request->request->get('tokens');
$type = $request->request->get('type');
$txnId = $request->request->get('txn_id');
$mobileNumber = $request->request->get('mobile_number');
$timer = $request->request->get('timer');
$encrypted = $this->encryptWithPublicKey($mobileNumber);
$mobileEncoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txnId,
'scope' => ['abha-enrol', 'mobile-verify'],
'loginHint' => 'mobile',
'loginId' => $mobileEncoded,
'otpSystem' => 'abdm'
]
]);
$decodedPayload = $response->toArray();
return $this->render('abha/step4.html.twig', [
'txnId' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'mobile_number' => $mobileNumber,
'type' => $type,
'tokens' => $tokens,
'timer' => $timer,
]);
} catch (\Exception $e) {
return $this->render('abha/step4.html.twig', [
'txnId' => $txnId,
'message' => '',
'mobile_number' => $mobileNumber,
'type' => $type,
'tokens' => $tokens,
'timer' => $timer,
]);
}
}
#[Route('/verify-mobile-otp-update', name: 'verify_mobile_otp_update', methods: ['GET', 'POST'])]
public function verifyMobileOtpUpdate(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$otp = $request->request->get('otp');
$mobileNumber = $request->request->get('mobile_number');
$timer = $request->request->get('timer');
$encrypted = $this->encryptWithPublicKey($otp);
$otpencoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
// dd($tokens,$txnId,$otp,$mobileNumber,$otpencoded,$isoTimestamp);
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/auth/byAbdm', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => [
'abha-enrol',
'mobile-verify'
],
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'timeStamp' => $isoTimestamp,
'txnId' => $txnId,
'otpValue' => $otpencoded
]
]
]
]);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
if ($decodedPayload['authResult'] == 'success') {
$client1 = HttpClient::create();
$response2 = $client1->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getAccessToken(),
'X-Token' => 'Bearer ' . $tokens,
'Content-Type' => 'application/json',
'REQUEST-ID' => $this->GUID(),
'TIMESTAMP' => $isoTimestamp,
],
]);
$profileData = $response2->toArray();
// dd($profileData);
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
return $this->render('abha/mobileupdatestep.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $profileData['firstName'],
'middleName' => $profileData['middleName'],
'lastName' => $profileData['lastName'],
'dob' => $data['dob'],
'gender' => $profileData['gender'],
'profilePhoto' => $profileData['profilePhoto'],
'mobile' => $profileData['mobile'],
'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
'address' => $profileData['address'],
'pincode' => $profileData['pincode'],
'ABHANumber' => $profileData['ABHANumber']
]);
} else {
return $this->render('abha/mobileupdate.html.twig', [
'txnId' => $txnId,
'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
'mobile_number' => $mobileNumber,
'type' => '',
'tokens' => $tokens,
'timer' => $timer
]);
}
} catch (\Exception $e) {
// dd($e->getMessage());
return $this->render('abha/mobileupdate.html.twig', [
'txnId' => $txnId,
'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
'mobile_number' => $mobileNumber,
'type' => '',
'tokens' => $tokens,
'timer' => $timer
]);
}
}
#[Route('/verify-mobile-otp-update-verification', name: 'verify_mobile_otp_update_verification', methods: ['GET', 'POST'])]
public function verifyMobileOtpUpdateverification(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$otp = $request->request->get('otp');
$mobileNumber = $request->request->get('mobile_number');
$timer = $request->request->get('timer');
$encrypted = $this->encryptWithPublicKey($otp);
$otpencoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
// dd($tokens,$txnId,$otp,$mobileNumber,$otpencoded,$isoTimestamp);
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/verify', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => [
'abha-profile',
'mobile-verify'
],
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'timeStamp' => $isoTimestamp,
'txnId' => $txnId,
'otpValue' => $otpencoded
]
]
]
]);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
if ($decodedPayload['authResult'] == 'success') {
$client1 = HttpClient::create();
$response2 = $client1->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getAccessToken(),
'X-Token' => 'Bearer ' . $tokens,
'Content-Type' => 'application/json',
'REQUEST-ID' => $this->GUID(),
'TIMESTAMP' => $isoTimestamp,
],
]);
$profileData = $response2->toArray();
// dd($profileData);
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
return $this->render('abha/mobileupdatestepverification.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $profileData['firstName'],
'middleName' => $profileData['middleName'],
'lastName' => $profileData['lastName'],
'dob' => $data['dob'],
'gender' => $profileData['gender'],
'profilePhoto' => $profileData['profilePhoto'],
'mobile' => $profileData['mobile'],
'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
'address' => $profileData['address'],
'pincode' => $profileData['pincode'],
'ABHANumber' => $profileData['ABHANumber']
]);
} else {
return $this->render('abha/mobileupdateverification.html.twig', [
'txnId' => $txnId,
'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
'mobile_number' => $mobileNumber,
'type' => '',
'tokens' => $tokens,
'timer' => $timer
]);
}
} catch (\Exception $e) {
// dd($e->getMessage());
return $this->render('abha/mobileupdateverification.html.twig', [
'txnId' => $txnId,
'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
'mobile_number' => $mobileNumber,
'type' => '',
'tokens' => $tokens,
'timer' => $timer
]);
}
}
#[Route('/verify-mobile-otp', name: 'verify_mobile_otp', methods: ['GET', 'POST'])]
public function verifyMobileOtp(Request $request): Response
{
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$otp = $request->request->get('otp');
$mobileNumber = $request->request->get('mobile_number');
$timer = $request->request->get('timer');
$encrypted = $this->encryptWithPublicKey($otp);
$otpencoded = (base64_encode($encrypted));
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
//dd($tokens,$txnId,$otp,$mobileNumber,$otpencoded,$isoTimestamp);
try {
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/auth/byAbdm', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => [
'abha-enrol',
'mobile-verify'
],
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'timeStamp' => $isoTimestamp,
'txnId' => $txnId,
'otpValue' => $otpencoded
]
]
]
]);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
if ($decodedPayload['authResult'] == 'success') { // if api success, get tnx id
return $this->redirectToRoute('abha_suggestion', ['txnId' => $this->encryptor->encrypt($decodedPayload['txnId']), 'tokens' => $this->encryptor->encrypt($tokens), 'message' => $this->encryptor->encrypt($decodedPayload['message'])]);
} else {
$this->addFlash(
'danger',
'The OTP entered is invalid. Please verify and re-enter the correct OTP',
);
return $this->render('abha/step4.html.twig', [
'txnId' => $txnId,
'message' => '',
'mobile_number' => $mobileNumber,
'type' => '',
'tokens' => $tokens,
'timer' => $timer
]);
}
} catch (\Exception $e) {
// dd($e->getMessage());
return $this->render('abha/step4.html.twig', [
'txnId' => $txnId,
'message' => '',
'mobile_number' => $mobileNumber,
'type' => '',
'tokens' => $tokens,
'timer' => $timer
]);
}
// return $this->redirectToRoute('abha_suggestion', ['txnId' => $decodedPayload['txnId'], 'tokens' => $tokens, 'message' => $decodedPayload['message']]);
}
#[Route('/abha-suggestion/{txnId}/{tokens}/{message}', name: 'abha_suggestion', methods: ['GET', 'POST'])]
#[ParamDecryptor(["txnId","tokens","message"])]
public function abhaSuggestion(string $txnId, string $tokens, string $message): Response
{
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/suggestion', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'Transaction_Id: ' . $txnId,
'TIMESTAMP: ' . $isoTimestamp
],
'json' => []
]);
$decodedPayload = $response->toArray();
$this->addFlash(
'success',
$message
);
return $this->render('abha/step5.html.twig', [
'txnId' => $decodedPayload['txnId'],
'message' => $message,
'tokens' => $tokens,
'abhaAddressList' => $decodedPayload['abhaAddressList']
]);
}
#[Route('/abha-address-verify', name: 'abha_addressverify', methods: ['GET', 'POST'])]
public function abhaAddressVerify(Request $request): Response
{
$selectabha = $request->request->get('fetch_mode');
$tokens = $request->request->get('tokens');
$txnId = $request->request->get('txn_id');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
// dd($selectabha,$tokens,$txnId,$isoTimestamp);
$client = HttpClient::create();
$client1 = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/abha-address', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txnId,
'abhaAddress' => $selectabha,
'preferred' => 1
]
]);
$response2 = $client1->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getAccessToken(),
'X-Token' => 'Bearer ' . $tokens,
'Content-Type' => 'application/json',
'REQUEST-ID' => $this->GUID(),
'TIMESTAMP' => $isoTimestamp,
],
]);
$profileData = $response2->toArray();
if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
$data['dob'] = $profileData['dayOfBirth'] . '-' . $profileData['monthOfBirth'] . '-' . $profileData['yearOfBirth'];
}
} catch (\Exception $e) {
// dd($e->getMessage());
return redirect('searchAbha');
}
return $this->render('abha/stepnew10.html.twig', [
'txnId' => $txnId,
'message' => '',
'tokens' => $tokens,
'firstName' => $profileData['firstName'],
'middleName' => $profileData['middleName'],
'lastName' => $profileData['lastName'],
'dob' => $data['dob'],
'gender' => $profileData['gender'],
'profilePhoto' => $profileData['profilePhoto'],
'mobile' => $profileData['mobile'],
'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
'address' => $profileData['address'],
'pincode' => $profileData['pincode'],
'ABHANumber' => $profileData['ABHANumber']
]);
}
// #[Route('/abha-emaiAddressverify', name: 'abha_emailverify', methods: ['GET', 'POST'])]
// public function abhaEmailverify(Request $request ): Response
// {
// $text = $this->loadPublicKeyText();
// try {
// $publicKey = PublicKeyLoader::loadPublicKey($text);
// } catch (\phpseclib3\Exception\NoKeyLoadedException $e) {
// throw new \Exception('Error loading key: ' . $e->getMessage());
// }
// $encrypted = $publicKey
// ->withPadding(RSA::ENCRYPTION_OAEP)
// ->withHash('sha1')
// ->withMGFHash('sha1')
// ->encrypt($aadharNumber);
// $aadharcardencoded = (base64_encode($encrypted));
// $now = new \DateTime('now', new \DateTimeZone('UTC'));
// $isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z'); // ISO 8601 with milliseconds (v) and Z for UTC
// $requestId = $this->GUID();
// $accessToken = $this->getAccessToken();
// $now = new \DateTime('now', new \DateTimeZone('UTC'));
// $isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
// $client = HttpClient::create();
// $response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/request/emailVerificationLink', [
// 'headers' => [
// 'Authorization: Bearer ' . $accessToken,
// 'Content-Type: application/json',
// 'REQUEST-ID: ' . $requestId,
// 'TIMESTAMP: ' . $isoTimestamp
// ],
// 'json' => [
// 'txnId' => '',
// 'scope' => ['abha-enrol'],
// 'loginHint' => 'aadhaar',
// 'loginId' => $aadharcardencoded,
// 'otpSystem' => 'aadhaar'
// ]
// ]);
// $decodedPayload = $response->toArray();
// }
#[Route('/abha-exists', name: 'abha_exists', methods: ['GET', 'POST'])]
public function abhaExistsCheck(Request $request, PatientRepository $patientRepo): Response
{
try {
$type = $request->request->get('type');
$healthId = $request->request->get('health_id');
$txnId = $request->request->get('txn_id');
if (!$healthId && strlen($healthId) <= 6) {
$this->addFlash(
'danger',
'Please enter valid abha address.'
);
return $this->render('abha/step5.html.twig', [
'txnId' => $txnId,
'type' => $type,
'step' => $request->request->get('step'),
]);
}
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://healthid.abdm.gov.in/api/v1/registration/aadhaar/createHealthIdWithPreVerified', [
'headers' => [
'Authorization' => $this->getAccessToken(),
'Content-Type' => 'application/json',
],
'json' => [
'healthId' => $healthId,
'txnId' => $txnId
]
]);
$decodedPayload = $response->toArray();
$data = [
'token' => $decodedPayload['token'] ?? '',
'firstName' => $decodedPayload['firstName'] ?? '',
'lastName' => $decodedPayload['lastName'] ?? '',
'middleName' => $decodedPayload['middleName'] ?? '',
'stateCode' => $decodedPayload['stateCode'] ?? '',
'mobile' => $decodedPayload['mobile'] ?? '',
'gender' => $decodedPayload['gender'] ?? '',
'healthIdNumber' => $decodedPayload['healthIdNumber'] ?? '',
'dayOfBirth' => $decodedPayload['dayOfBirth'] ?? '',
'monthOfBirth' => $decodedPayload['monthOfBirth'] ?? '',
'yearOfBirth' => $decodedPayload['yearOfBirth'] ?? '',
'districtCode' => $decodedPayload['districtCode'] ?? '',
'stateName' => $decodedPayload['stateName'] ?? '',
'districtName' => $decodedPayload['districtName'] ?? '',
'healthIdAddress' => $decodedPayload['healthId'] ?? '',
];
if (empty($data['healthIdAddress']) || empty($data['healthIdNumber'])) {
$getTokenData = (array) json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $data['token'])[1]))));
$data['healthIdAddress'] = $getTokenData['healthId'] ?? '';
$data['healthIdNumber'] = $getTokenData['healthIdNumber'] ?? '';
}
if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
$data['dob'] = $decodedPayload['dayOfBirth'] . '-' . $decodedPayload['monthOfBirth'] . '-' . $decodedPayload['yearOfBirth'];
}
if ($type == 'reg') {
return $this->redirectToRoute('patient_new', ['data' => $data]);
} else if ($type == 'case_diagnose') {
$session = $request->getSession();
if (is_numeric($session->get('case_id'))) {
$caseId = $session->get('case_id');
} else {
$caseId = $this->encryptor->decrypt($session->get('case_id'));
}
$patientId = $patientRepo->getPatientId($caseId); // get patient id
if (isset($patientId[0]['id'])) {
$patientRepo->updateAbhaDetails($data, $patientId[0]['id']);
}
return $this->redirectToRoute('data_link_fetch', ['id' => $this->encryptor->encrypt($caseId)]);
} elseif ($type == 'lab_case_index') { // lab user
return $this->redirectToRoute('lab_case_index');
} elseif ($type == 'case_lab_test') { // lab user
return $this->redirectToRoute('case_lab_test');
} elseif ($type == 'ext_samp_index') { // lab user
return $this->redirectToRoute('ext_samp_index');
} elseif ($type == 'oth_hosp_test_index') { // lab user
return $this->redirectToRoute('oth_hosp_test_index');
} elseif ($type == 'case_radiology_completed') { // radiology user
return $this->redirectToRoute('case_rad_test_completed');
} elseif ($type == 'case_radiology_pending') { // radiology user
return $this->redirectToRoute('case_rad_test');
}
} catch (\Exception) {
$this->addFlash(
'danger',
'Something went wrong, please try again.'
);
return $this->render('abha/step5.html.twig', [
'txnId' => $txnId,
'type' => $type,
'step' => $request->request->get('step'),
]);
}
}
#[Route('/is-abha-exists', name: 'is_abha_exists', methods: ['GET', 'POST'])]
public function isAbhaExists(Request $request): Response
{
// $healthId = $request->request->get('health_id');
$healthId = $request->request->get('health_id') ? $request->request->get('health_id') : '';
if ($_ENV['ABHA_ENV'] == 'sandbox') {
$abhaSuffix = $_ENV['ABHA_SBX_SUFFIX'];
} else {
$abhaSuffix = $_ENV['ABHA_PROD_SUFFIX'];
}
// Check if the last 4 characters of $healthId match $abhaSuffix
if ($healthId) {
if (substr($healthId, -strlen($abhaSuffix)) !== $abhaSuffix) {
// Append suffix if it doesn't match
$healthId .= $abhaSuffix;
}
} else {
"";
}
try {
$accessToken = $this->getAccessToken();
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
// dd($accessToken,$isoTimestamp,$healthId);
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/search', [
'headers' => [
'Authorization' => $accessToken,
'Content-Type' => 'application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'abhaAddress' => $healthId
]
]);
$decodedPayload = $response->toArray();
if($decodedPayload['status'] == 'ACTIVE'){
return $this->json('invalid');
}else{
return $this->json('valid');
}
} catch (\Exception $e) {
if($response->getStatusCode() == '400' ){
return $this->json('valid');
}else{
return $this->json('invalid');
}
}
}
// m2 flow start here
#[Route('/abha-link', name: 'abha_link', methods: ['GET', 'POST'])]
public function abhaLink(Request $request): Response
{
$type = $request->request->get('type');
$patient_id = $request->request->get('patient_id');
// check patient id is available
if ($patient_id) {
$session = $request->getSession(); // get session variable from request
$session->set('patient_id', $patient_id); // patient id store in session
}
// abha address get
$abhaDetail = $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
$readOnly = '';
if ($abhaDetail != '') { // abha address is available then readonly mode
$readOnly = 'readonly';
}
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => $readOnly,
'abhaDetail' => $abhaDetail
]);
}
#[Route('/fetch-mode', name: 'fetch_mode', methods: ['GET', 'POST'])]
public function fetchMode(Request $request): Response
{
$abhaAddress = $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
$type = $request->request->get('type') ? $request->request->get('type') : '';
// $auth_mode = $request->request->get('auth_mode') ? $request->request->get('auth_mode') : '';
if ($_ENV['ABHA_ENV'] == 'sandbox') {
$abhaSuffix = $_ENV['ABHA_SBX_SUFFIX'];
} else {
$abhaSuffix = $_ENV['ABHA_PROD_SUFFIX'];
}
// Check if the last 4 characters of $abhaAddress match $abhaSuffix
if ($abhaAddress) {
if (substr($abhaAddress, -strlen($abhaSuffix)) !== $abhaSuffix) {
// Append suffix if it doesn't match
$abhaAddress .= $abhaSuffix;
}
} else {
"";
}
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
try {
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/search', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'abhaAddress' => $abhaAddress
]
]);
$decodedPayload = $response->toArray();
} catch (\Exception) {
$this->addFlash(
'danger',
'Please enter a valid ABHA address.'
);
return $this->redirectToRoute('abha_link');
}
$this->addFlash(
'success',
'ABHA address verified successfully.'
);
return $this->render('abha/fetch_modes.html.twig', [
'abha_details' => $abhaAddress,
'type' => $type,
'modesArr' => $decodedPayload['authMethods']
]);
}
#[Route('/post-fetch-mode', name: 'post_fetch_modes', methods: ['GET', 'POST'])]
public function postFetchMode(Request $request): Response
{
$fetchMode = $request->request->get('fetch_mode');
$abhaDetails = $request->request->get('abha_details');
$type = $request->request->get('type');
$timer = $request->request->get('timer');
try {
if ($fetchMode == 'MOBILE_OTP') {
$scope = ['abha-address-login', 'mobile-verify'];
$otpsystem = 'abdm';
} else {
$scope = ['abha-address-login', 'aadhaar-verify'];
$otpsystem = 'aadhaar';
}
$encrypted = $this->encryptWithPublicKey($abhaDetails);
$loginId = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => '',
'scope' => $scope,
'loginHint' => 'abha-address',
'loginId' => $loginId,
'otpSystem' => $otpsystem
]
]);
$decodedPayload = $response->toArray();
return $this->render('abha/link_step2.html.twig', [
'modes' => $fetchMode,
'type' => $type,
'txn_id' => $decodedPayload['txnId'],
'message' => $decodedPayload['message'],
'abha_details' => $abhaDetails,
'timer' => $timer
]);
} catch (\Exception) {
// $session->set('type', );
// $session->set('otp', $otp);
// $session->set('mobile_number', $mobile_number);
// $session->set('txnId', $txnId);
// $this->addFlash('danger', 'An error occurred while processing your request.');
// dd($fetchMode,$type,$abhaDetails);
return $this->render('abha/link_step2.html.twig', [
'modes' => $fetchMode,
'timer' => $timer,
'type' => $type,
'txn_id' => '',
'message' => '',
'abha_details' => $abhaDetails,
]);
//return $this->redirectToRoute('generate_otp');
}
}
#[Route('/post-fetch-mode-resend', name: 'post_fetch_modes_resend_otp', methods: ['GET', 'POST'])]
public function postFetchModeResendOtp(Request $request): Response
{
$fetchMode = $request->request->get('modes');
$abhaDetails = $request->request->get('abha_details');
$type = $request->request->get('type');
if ($fetchMode == 'MOBILE_OTP') {
$scope = ['abha-address-login', 'mobile-verify'];
$otpsystem = 'abdm';
} else {
$scope = ['abha-address-login', 'aadhaar-verify'];
$otpsystem = 'aadhaar';
}
$encrypted = $this->encryptWithPublicKey($abhaDetails);
$loginId = (base64_encode($encrypted));
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => '',
'scope' => $scope,
'loginHint' => 'abha-address',
'loginId' => $loginId,
'otpSystem' => $otpsystem
]
]);
$decodedPayload = $response->toArray();
// dd($fetchMode,$decodedPayload['txnId']);
return $this->json([
'modes' => $fetchMode,
'type' => $type,
'txn_id' => $decodedPayload['txnId'],
'abha_details' => $abhaDetails,
]);
}
#[Route(path: '/link-verify-otp', name: 'link_verify_otp', methods: ['GET', 'POST'])]
public function linkVerifyOtp(Request $request): Response
{
$modes = $request->request->get('modes');
$abha_details = $request->request->get('abha_details');
$type = $request->request->get('type');
$txnId = $request->request->get('txn_id');
$auth_code = $request->request->get('otp');
$timer = $request->request->get('timer');
try {
if ($modes == 'MOBILE_OTP') {
$scope = ['abha-address-login', 'mobile-verify'];
} else {
$scope = ['abha-address-login', 'aadhaar-verify'];
}
$encrypted = $this->encryptWithPublicKey($auth_code);
$otpencoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/verify', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'scope' => $scope,
'authData' => [
'authMethods' => [
'otp'
],
'otp' => [
'txnId' => $txnId,
'otpValue' => $otpencoded,
]
]
]
]);
$decodedPayload = $response->toArray();
if ($decodedPayload['authResult'] == 'success') {
$this->addFlash(
'success',
$decodedPayload['message']
);
return $this->redirectToRoute('link_abha_profile', ['tokens' => $this->encryptor->encrypt($decodedPayload['tokens']['token']), 'txnId' => $this->encryptor->encrypt($txnId)]);
} else {
return $this->render('abha/link_step2.html.twig', [
'modes' => $modes,
'type' => $type,
'txn_id' => $txnId,
'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
'abha_details' => $abha_details,
'otp' => $auth_code,
'timer' => $timer
]);
}
} catch (\Exception) {
return $this->render('abha/link_step2.html.twig', [
'modes' => $modes,
'type' => $type,
'txn_id' => $txnId,
'message' => '',
'abha_details' => $abha_details,
'otp' => $auth_code,
'timer' => $timer
]);
}
}
#[Route(path: '/link-abha-profile/{tokens}/{txnId}', name: 'link_abha_profile', methods: ['GET', 'POST'])]
#[ParamDecryptor(["tokens","txnId"])]
public function linkAbhaProfile(string $tokens, string $txnId): Response
{
//dd($tokens,$txnId);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha-profile', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => []
]);
$decodedPayload = $response->toArray();
return $this->render('abha/addressview.html.twig', [
'txnId' => $txnId,
'type' => '',
'message' => '',
'tokens' => $tokens,
'firstName' => $decodedPayload['firstName'],
'middleName' => $decodedPayload['middleName'],
'lastName' => $decodedPayload['lastName'],
'dob' => $decodedPayload['dateOfBirth'],
'gender' => $decodedPayload['gender'],
'profilePhoto' => $decodedPayload['profilePhoto'],
'mobile' => $decodedPayload['mobile'],
'preferredAbhaAddress' => $decodedPayload['abhaAddress'],
'address' => $decodedPayload['address'],
'pincode' => $decodedPayload['pinCode'],
'ABHANumber' => $decodedPayload['abhaNumber'] ?? ''
]);
}
#[Route(path: '/link-abha-profile-new', name: 'link_abha_profile_new', methods: ['GET', 'POST'])]
public function linkAbhaProfilenew(Request $request): Response
{
$tokens = $request->request->get('tokens');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => []
]);
$decodedPayload = $response->toArray();
$base64Image = $decodedPayload['profilePhoto'];
$imageUrl = 'data:image/jpeg;base64,' . $base64Image;
$data = [
'token' => $decodedPayload['token'] ?? '',
'firstName' => $decodedPayload['firstName'] ?? '',
'lastName' => $decodedPayload['lastName'] ?? '',
'middleName' => $decodedPayload['middleName'] ?? '',
'stateCode' => $decodedPayload['stateCode'] ?? '',
'mobile' => $decodedPayload['mobile'] ?? '',
'gender' => $decodedPayload['gender'] ?? '',
'healthIdNumber' => $decodedPayload['ABHANumber'] ?? '',
'dayOfBirth' => $decodedPayload['dayOfBirth'] ?? '',
'monthOfBirth' => $decodedPayload['monthOfBirth'] ?? '',
'yearOfBirth' => $decodedPayload['yearOfBirth'] ?? '',
'districtCode' => $decodedPayload['districtCode'] ?? '',
'profilePhoto' => $imageUrl ?? '',
'address' => $decodedPayload['address'] ?? '',
'pincode' => $decodedPayload['pincode'] ?? '',
'stateName' => $decodedPayload['stateName'] ?? '',
'districtName' => $decodedPayload['districtName'] ?? '',
'healthIdAddress' => $decodedPayload['preferredAbhaAddress'] ?? '',
];
if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
$data['dob'] = $decodedPayload['dayOfBirth'] . '-' . $decodedPayload['monthOfBirth'] . '-' . $decodedPayload['yearOfBirth'];
}
$request->getSession()->set('v3data', $data);
return $this->redirectToRoute('patient_new');
}
#[Route(path: '/link-abha-profile-address', name: 'link_abha_profile_address', methods: ['GET', 'POST'])]
public function linkAbhaProfileaddress(Request $request): Response
{
$tokens = $request->request->get('tokens');
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('GET', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha-profile', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => []
]);
$decodedPayload = $response->toArray();
// dd($decodedPayload);
$base64Image = $decodedPayload['profilePhoto'];
$imageUrl = 'data:image/jpeg;base64,' . $base64Image;
$data = [
'token' => $decodedPayload['token'] ?? '',
'firstName' => $decodedPayload['firstName'] ?? '',
'lastName' => $decodedPayload['lastName'] ?? '',
'middleName' => $decodedPayload['middleName'] ?? '',
'stateCode' => $decodedPayload['stateCode'] ?? '',
'mobile' => $decodedPayload['mobile'] ?? '',
'gender' => $decodedPayload['gender'] ?? '',
'healthIdNumber' => $decodedPayload['abhaNumber'] ?? '',
'dayOfBirth' => $decodedPayload['dayOfBirth'] ?? '',
'monthOfBirth' => $decodedPayload['monthOfBirth'] ?? '',
'yearOfBirth' => $decodedPayload['yearOfBirth'] ?? '',
'districtCode' => $decodedPayload['districtCode'] ?? '',
'profilePhoto' => $imageUrl ?? '',
'address' => $decodedPayload['address'] ?? '',
'pincode' => $decodedPayload['pinCode'] ?? '',
'stateName' => '',
'districtName' => '',
'healthIdAddress' => $decodedPayload['abhaAddress'] ?? '',
];
if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
$data['dob'] = $decodedPayload['dayOfBirth'] . '-' . $decodedPayload['monthOfBirth'] . '-' . $decodedPayload['yearOfBirth'];
}
$request->getSession()->set('v3data', $data);
return $this->redirectToRoute('patient_new');
}
public function getAccessToken()
{
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://dev.abdm.gov.in/api/hiecm/gateway/v3/sessions', [
'headers' => [
'Content-Type' => 'application/json',
'REQUEST-ID' => $this->GUID(),
'TIMESTAMP' => $isoTimestamp,
'X-CM-ID' => 'sbx',
],
'json' => [
'clientId' => $_ENV['CLIENT_ID'],
'clientSecret' => $_ENV['CLIENT_SECRET'],
'grantType' => 'client_credentials'
]
]);
$decodedPayload = $response->toArray();
return 'Bearer ' . $decodedPayload['accessToken'];
}
private function GUID()
{
return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
private function verifyGoogleRecaptcha($token)
{
$ip2020 = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip2020 = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip2020 = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip2020 = $_SERVER['REMOTE_ADDR'];
}
$endpoint = 'https://www.google.com/recaptcha/api/siteverify';
$secretKey = $_ENV['GOOGLE_RECAPTCHA_SECRET_KEY'];
$arrParams = "secret=$secretKey" . "&response=$token" . "&remoteip=$ip2020";
$ch = @curl_init();
@curl_setopt($ch, CURLOPT_POST, true);
@curl_setopt($ch, CURLOPT_POSTFIELDS, $arrParams);
@curl_setopt($ch, CURLOPT_URL, $endpoint);
@curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded'
));
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = @curl_exec($ch); // Log the response from HubSpot as needed.
@curl_close($ch);
return json_decode($response, true);
}
#[Route(path: '/resend-otp', name: 'resend_otp', methods: ['GET', 'POST'])]
public function aadhaarResendOtp(Request $request)
{
$counter = 0;
$txnIdSession = $request->getSession();
$txtId = $request->request->get('txnId');
$aadharNumber = $request->request->get('aadharNumber');
// if (!$txtId) {
// return $this->json('invalid');
// }
$counter = $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
$dataCounter = $txnIdSession->get('session_txnId');
if ($dataCounter >= 500) {
return throw $this->createNotFoundException('Limit is over');
} else {
$counter++;
$txnIdSession->set('session_txnId', $counter);
}
$encrypted = $this->encryptWithPublicKey($aadharNumber);
$loginId = (base64_encode($encrypted));
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => '',
'scope' => ['abha-enrol'],
'loginHint' => 'aadhaar',
'loginId' => $loginId,
'otpSystem' => 'aadhaar'
]
]);
$txnIdSession->set('session_txnId', 0);
$decodedPayload = $response->toArray();
return $this->json($decodedPayload['txnId']);
}
#[Route(path: '/mobile-otp-update', name: 'mobileOTPupdate', methods: ['GET', 'POST'])]
public function mobileOtpUpdate(Request $request)
{
$counter = 0;
$txnIdSession = $request->getSession();
$txtId = $request->request->get('txn_id');
$mobileNumber = $request->request->get('mobile_number');
// if (!$txtId) {
// return $this->json(['txtId' => '', 'type' => 'invalid']);
// }
$counter = $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
$dataCounter = $txnIdSession->get('session_txnId');
if ($dataCounter >= 500) {
return throw $this->createNotFoundException('Limit is over');
} else {
$counter++;
$txnIdSession->set('session_txnId', $counter);
}
$encrypted = $this->encryptWithPublicKey($mobileNumber);
$mobileEncoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txtId,
'scope' => ['abha-enrol', 'mobile-verify'],
'loginHint' => 'mobile',
'loginId' => $mobileEncoded,
'otpSystem' => 'abdm'
]
]);
$decodedPayload = $response->toArray();
return $this->json(['txn_id' => $decodedPayload['txnId'], 'type' => 'success', 'mobile_number' => $mobileNumber]);
}
#[Route(path: '/mobile-otp-update-verification', name: 'mobileOTPupdateverification', methods: ['GET', 'POST'])]
public function mobileOtpUpdateverification(Request $request)
{
$counter = 0;
$txnIdSession = $request->getSession();
$txtId = $request->request->get('txn_id');
$mobileNumber = $request->request->get('mobile_number');
$tokens = $request->request->get('tokens');
// if (!$txtId) {
// return $this->json(['txtId' => '', 'type' => 'invalid']);
// }
$counter = $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
$dataCounter = $txnIdSession->get('session_txnId');
if ($dataCounter >= 500) {
return throw $this->createNotFoundException('Limit is over');
} else {
$counter++;
$txnIdSession->set('session_txnId', $counter);
}
$encrypted = $this->encryptWithPublicKey($mobileNumber);
$mobileEncoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'X-token: Bearer ' . $tokens,
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txtId,
'scope' => ['abha-profile', 'mobile-verify'],
'loginHint' => 'mobile',
'loginId' => $mobileEncoded,
'otpSystem' => 'abdm'
]
]);
$decodedPayload = $response->toArray();
return $this->json(['txn_id' => $decodedPayload['txnId'], 'type' => 'success', 'mobile_number' => $mobileNumber,
'tokens' => $tokens]);
}
#[Route(path: '/generate-mobile-otp-resend', name: 'mobileOTP', methods: ['GET', 'POST'])]
public function mobileOtp(Request $request)
{
$counter = 0;
$txnIdSession = $request->getSession();
$txtId = $request->request->get('txnId');
$mobileNumber = $request->request->get('mobile_number');
// if (!$txtId) {
// return $this->json(['txtId' => '', 'type' => 'invalid']);
// }
$counter = $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
$dataCounter = $txnIdSession->get('session_txnId');
if ($dataCounter >= 500) {
return throw $this->createNotFoundException('Limit is over');
} else {
$counter++;
$txnIdSession->set('session_txnId', $counter);
}
$encrypted = $this->encryptWithPublicKey($mobileNumber);
$mobileEncoded = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => $txtId,
'scope' => ['abha-enrol', 'mobile-verify'],
'loginHint' => 'mobile',
'loginId' => $mobileEncoded,
'otpSystem' => 'abdm'
]
]);
$decodedPayload = $response->toArray();
return $this->json(['txtId' => $decodedPayload['txnId'], 'type' => 'success', 'mobile_number' => $mobileNumber]);
}
#[Route(path: '/known-mode', name: 'known_mode', methods: ['GET', 'POST'])]
public function knownMode(Request $request)
{
$type = $request->request->get('type');
$authMode = $request->request->get('auth_type');
$abhaDetail = $request->request->get('abha_details');
if ($_ENV['ABHA_ENV'] == 'sandbox') {
$abhaSuffix = $_ENV['ABHA_SBX_SUFFIX'];
} else {
$abhaSuffix = $_ENV['ABHA_PROD_SUFFIX'];
}
$abhaAddress = $abhaDetail . $abhaSuffix;
if ($authMode == 'auth_mobile') {
$authMode = 'MOBILE_OTP';
} else {
$authMode = 'AADHAAR_OTP';
}
$encrypted = $this->encryptWithPublicKey($abhaAddress);
$loginId = base64_encode($encrypted);
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/request/otp', [
'headers' => [
'Authorization: Bearer ' . $this->getAccessToken(),
'Content-Type: application/json',
'REQUEST-ID: ' . $this->GUID(),
'TIMESTAMP: ' . $isoTimestamp
],
'json' => [
'txnId' => '',
'scope' => ['abha-address-login', 'mobile-verify'],
'loginHint' => 'abha-address',
'loginId' => $loginId,
'otpSystem' => 'abdm'
]
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
$txnId = '';
if ($statusCode == '200') { // if api success, get tnx id
if (isset($content['message'])) {
$this->addFlash(
'danger',
$content['message']
);
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abhaDetail,
]);
} else {
$txnId = isset($content['txn_id']) ? $content['txn_id'] : '';
return $this->render('abha/otp.html.twig', [
'auth_type' => $authMode == 'MOBILE_OTP' ? 'Mobile OTP' : 'Aadhaar OTP',
'auth_method' => $authMode,
'type' => $type,
'txn_id' => $txnId,
'abha_detail' => $abhaDetail
]);
}
} elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '403' || $statusCode == '404' || $statusCode == '422' || $statusCode == '500') { // if api get error
$content = $content['message'];
if ($statusCode == '422') {
$content = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$content
);
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abhaDetail,
]);
}
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abhaDetail,
]);
}
#[Route(path: '/known-mode-otp', name: 'known_mode_otp', methods: ['GET', 'POST'])]
public function knownModeOTP(Request $request, PatientRepository $patientRepo, Abha $abha)
{
$type = $request->request->get('type');
$txn_id = $request->request->get('txn_id');
$auth_method = $request->request->get('auth_method');
$abha_detail = $request->request->get('abha_details');
$otp = $request->request->get('otp');
if (!$txn_id || !$type || !$auth_method || !$abha_detail || !$otp) {
$this->addFlash(
'danger',
'Please enter valid abha address.'
);
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abha_detail,
]);
}
$payload = [
'otp' => $otp,
'transaction_id' => $txn_id,
'auth_method' => $auth_method
];
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', $_ENV['ABDM_BASE_URL'] . 'data-link/v1-confirm', [
'headers' => [
'Content-Type' => 'application/json'
],
'json' => $payload
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
if ($statusCode == '200') { // if api success, get tnx id
if (isset($content['message'])) {
$this->addFlash(
'danger',
$content['message']
);
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abha_detail,
]);
} else {
$profilePayload = [
'token' => $content['token']
];
$profileResponse = $client->request('POST', $_ENV['ABDM_BASE_URL'] . 'data-link/get-profile', [
'headers' => [
'Content-Type' => 'application/json'
],
'json' => $profilePayload
]);
$profileStatusCode = $profileResponse->getStatusCode();
$profileContent = json_decode($profileResponse->getContent(), true);
if ($profileStatusCode == '200') {
$session = $request->getSession();
$updateData = $abha->getUserDetails($content);
if ($request->request->get('type') == 'reg') {
return $this->redirectToRoute('patient_new', ['dataLink' => $updateData]);
} else if ($request->request->get('type') == 'case') {
$patientRepo->updateAbhaDetails($updateData, $session->get('patient_id'));
return $this->redirectToRoute('case_new', ['patient_id' => $session->get('patient_id')]);
}
} elseif ($profileStatusCode == '400' || $profileStatusCode == '401' || $profileStatusCode == '403' || $profileStatusCode == '404' || $profileStatusCode == '422' || $profileStatusCode == '500') {
$profileContent = $profileContent['message'];
if ($profileStatusCode == '422') {
$profileContent = isset($profileContent['message']) ? $profileContent['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$profileContent
);
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abha_detail,
]);
}
}
} elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '403' || $statusCode == '404' || $statusCode == '422' || $statusCode == '500') { // if api get error
$content = $content['message'];
if ($statusCode == '422') {
$content = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$content
);
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abha_detail,
]);
}
return $this->render('abha/link_step1.html.twig', [
'type' => $type,
'readOnly' => '',
'abhaDetail' => $abha_detail,
]);
if ($request->request->get('type') == 'case') {
return $this->redirectToRoute('case_new');
}
if ($request->isMethod('POST') && !empty($request->request->get('otp'))) {
return $this->redirectToRoute('patient_new');
}
}
#[Route('/abha-init', name: 'abha_init', methods: ['GET', 'POST'])]
public function abhaInit(Request $request, PatientRepository $patientRepo, Abha $abha): Response
{
$abhaAddress = $request->request->get('abha_details');
$type = $request->request->get('type');
$patientId = $request->request->get('patientId');
$name = $request->request->get('name');
$gender = $request->request->get('gender');
$dob = $request->request->get('dob');
$mobile = $request->request->get('mobile');
$profileId = $request->request->get('profile_shared_id');
if ($_ENV['ABHA_ENV'] == 'sandbox') {
$abhaSuffix = $_ENV['ABHA_SBX_SUFFIX'];
} else {
$abhaSuffix = $_ENV['ABHA_PROD_SUFFIX'];
}
if (!strpos($abhaAddress, $abhaSuffix) !== false) {
$abhaAddress = $abhaAddress . $abhaSuffix;
}
if ($type != 'case' && $patientId != '0' && $patientId != '') {
$this->addFlash(
'danger',
'Currently server is busy, please try after sometime.'
);
return $this->render('abha/fetch_modes.html.twig', [
'abha_details' => $abhaAddress,
'type' => $type,
'modesArr' => ''
]);
}
if (!$abhaAddress || !$type) {
$this->addFlash(
'danger',
'Please enter valid abha address.'
);
return $this->render('abha/fetch_modes.html.twig', [
'abha_details' => $abhaAddress,
'type' => $type,
'modesArr' => ''
]);
}
// define hip code and get hip id from hospital table
$hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode();
// create the payload for fetch mode api
$payload = [
'id' => $abhaAddress,
'hip_id' => $hipCode,
'auth_mode' => 'DEMOGRAPHICS',
];
// call api for init
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$header = [
'Content-Type' => 'application/json',
];
$response = $client->request('POST', $_ENV['ABDM_BASE_URL'] . 'data-link/init', [
'headers' => $header,
'json' => $payload
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
$message = $content['message'];
if ($statusCode == '422') {
$message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$message
);
return $this->redirectToRoute('abha_init');
} elseif ($statusCode == '202') {
if (isset($content['message'])) {
$this->addFlash(
'danger',
$content['message']
);
return $this->redirectToRoute('abha_init');
}
if ($request->request->get('gender') == 'Male') {
$gender = 'M';
} elseif ($request->request->get('gender') == 'Female') {
$gender = 'F';
} elseif ($request->request->get('gender') == 'Other') {
$gender = 'O';
}
$payload = [
'transaction_id' => $content['txn_id'],
'modes' => 'DEMOGRAPHICS',
'name' => $name,
'gender' => $gender,
'dob' => date('Y-m-d', strtotime($dob)),
'mobile' => $mobile,
];
$header = [
'Content-Type' => 'application/json',
];
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$client = HttpClient::create();
$response = $client->request('POST', $_ENV['ABDM_BASE_URL'] . 'data-link/confirm', [
'headers' => $header,
'json' => $payload
]);
$content = json_decode($response->getContent(), true);
$contentArr = $abha->getUserDetails($content);
$conn = $this->doctrine->getConnection('cnmgts');
$conn->delete('cnmgts_abha_profile_share', ['id' => $profileId]);
if ($type == 'reg') {
return $this->redirectToRoute('patient_new', ['dataLink' => $contentArr]);
} elseif ($type == 'case') {
if ($patientId) {
$patientRepo->updateAbhaDetails($contentArr, $patientId);
return $this->redirectToRoute('case_new', ['patient_id' => $patientId]);
} else {
return $this->redirectToRoute('patient_new', ['dataLink' => $contentArr]);
}
}
} else {
return $this->redirectToRoute('patient_search_with_abha');
}
}
private function loadPublicKeyText(): string
{
return <<<EOD
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAstWB95C5pHLXiYW59qyO
4Xb+59KYVm9Hywbo77qETZVAyc6VIsxU+UWhd/k/YtjZibCznB+HaXWX9TVTFs9N
wgv7LRGq5uLczpZQDrU7dnGkl/urRA8p0Jv/f8T0MZdFWQgks91uFffeBmJOb58u
68ZRxSYGMPe4hb9XXKDVsgoSJaRNYviH7RgAI2QhTCwLEiMqIaUX3p1SAc178ZlN
8qHXSSGXvhDR1GKM+y2DIyJqlzfik7lD14mDY/I4lcbftib8cv7llkybtjX1Aayf
Zp4XpmIXKWv8nRM488/jOAF81Bi13paKgpjQUUuwq9tb5Qd/DChytYgBTBTJFe7i
rDFCmTIcqPr8+IMB7tXA3YXPp3z605Z6cGoYxezUm2Nz2o6oUmarDUntDhq/PnkN
ergmSeSvS8gD9DHBuJkJWZweG3xOPXiKQAUBr92mdFhJGm6fitO5jsBxgpmulxpG
0oKDy9lAOLWSqK92JMcbMNHn4wRikdI9HSiXrrI7fLhJYTbyU3I4v5ESdEsayHXu
iwO/1C8y56egzKSw44GAtEpbAkTNEEfK5H5R0QnVBIXOvfeF4tzGvmkfOO6nNXU3
o/WAdOyV3xSQ9dqLY5MEL4sJCGY1iJBIAQ452s8v0ynJG5Yq+8hNhsCVnklCzAls
IzQpnSVDUVEzv17grVAw078CAwEAAQ==
-----END PUBLIC KEY-----
EOD;
}
private function encryptWithPublicKey(string $str): string
{
$text = $this->loadPublicKeyText();
try {
$publicKey = PublicKeyLoader::loadPublicKey($text);
} catch (\phpseclib3\Exception\NoKeyLoadedException $e) {
throw new \Exception('Error loading key!');
}
$encrypted = $publicKey
->withPadding(RSA::ENCRYPTION_OAEP)
->withHash('sha1')
->withMGFHash('sha1')
->encrypt($str);
return $encrypted;
}
private function currentIsoTimestamp(): string
{
//return (new \DateTime())->format('Y-m-d\TH:i:s.u\Z');
return (new \DateTime('now', new \DateTimeZone('UTC')))->format('Y-m-d\TH:i:s.u\Z');
}
}