src/Controller/AbhaController.php line 579

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\PatientRepository;
  4. use App\Service\Abha;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. use Dompdf\{DompdfOptions};
  7. use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
  8. use phpseclib3\Crypt\PublicKeyLoader;
  9. use phpseclib3\Crypt\RSA;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpClient\HttpClient;
  13. use Symfony\Component\HttpFoundation\{RequestResponse};
  14. use Symfony\Component\Routing\Annotation\Route;
  15. #[Route(path'/abha'), IsGranted(data'IS_AUTHENTICATED_REMEMBERED')]
  16. class AbhaController extends AbstractController
  17. {
  18.     public function __construct(
  19.         private ManagerRegistry $doctrine,
  20.         private Encryptor $encryptor
  21.     ) {}
  22.     #[Route(path'/abha-number-verify'name'abha_num_verify'methods: ['GET''POST'])]
  23.     public function abhaNumberVerify(Request $request): Response
  24.     {
  25.         if ($request->request->has('type') || $request->get('data')) {
  26.             $type $request->request->get('type');
  27.         } else {
  28.             $type $this->encryptor->decrypt($request->query->get('type'));
  29.         }
  30.         return $this->render('abha/verify1.html.twig', [
  31.             'abha_number' => '',
  32.             'mobile_number' => '',
  33.             'aadharcard_number' => '',
  34.             'type' => $type,
  35.         ]);
  36.     }
  37.     #[Route(path'/aadharnumberverify'name'aadharnumberverify'methods: ['GET''POST'])]
  38.     public function aadharnumberverify(Request $request): Response
  39.     {
  40.         if ($request->request->has('type') || $request->get('data')) {
  41.             $type $request->request->get('type');
  42.         } else {
  43.             $type $this->encryptor->decrypt($request->query->get('type'));
  44.         }
  45.         return $this->render('abha/aadharnumberverify.html.twig', [
  46.             'abha_number' => '',
  47.             'mobile_number' => '',
  48.             'aadharcard_number' => '',
  49.             'type' => $type,
  50.         ]);
  51.     }
  52.     #[Route(path'/mobilenumberverify'name'mobilenumberverify'methods: ['GET''POST'])]
  53.     public function mobilenumberverify(Request $request): Response
  54.     {
  55.         if ($request->request->has('type') || $request->get('data')) {
  56.             $type $request->request->get('type');
  57.         } else {
  58.             $type $this->encryptor->decrypt($request->query->get('type'));
  59.         }
  60.         return $this->render('abha/mobilenumberverify.html.twig', [
  61.             'abha_number' => '',
  62.             'mobile_number' => '',
  63.             'aadharcard_number' => '',
  64.             'type' => $type,
  65.         ]);
  66.     }
  67.     #[Route(path'/abha-address-num-verification'name'abha_address_num_verification'methods: ['GET''POST'])]
  68.     public function abhaAddressNumberVerification(Request $request): Response
  69.     {
  70.         if ($request->request->has('type') || $request->get('data')) {
  71.             $type $request->request->get('type');
  72.         } else {
  73.             $type $this->encryptor->decrypt($request->query->get('type'));
  74.         }
  75.         return $this->render('abha/verifyt1.html.twig', [
  76.             'abha_number' => '',
  77.             'mobile_number' => '',
  78.             'aadharcard_number' => '',
  79.             'type' => $type,
  80.         ]);
  81.     }
  82.     #[Route(path'/abha-num-generate-otp'name'abha_num_generate_otp'methods: ['GET''POST'])]
  83.     public function abhaNumGenerateOtp(Request $request): Response
  84.     {
  85.         $auth_mode $request->request->get('auth_mode');
  86.         $timer $request->request->get('timer');
  87.         $type $request->request->get('type');
  88.         $abhaNumber $request->request->get('abha_number');
  89.         $mobileNumber $request->request->get('mobile_number');
  90.         $aadharcardNumber $request->request->get('aadharcard_number');
  91.         if ($auth_mode == 'auth_mobile') {
  92.             $scope = ['abha-login''mobile-verify'];
  93.             $encryptNumber $mobileNumber;
  94.             $otpsystem 'abdm';
  95.             $loginhint 'mobile';
  96.         } elseif ($auth_mode == 'auth_viaaadhaar') {
  97.             $scope = ['abha-login''aadhaar-verify'];
  98.             $encryptNumber $aadharcardNumber;
  99.             $otpsystem 'aadhaar';
  100.             $loginhint 'aadhaar';
  101.         } elseif ($auth_mode == 'auth_aadhaar') {
  102.             $scope = ['abha-login''aadhaar-verify'];
  103.             $encryptNumber $abhaNumber;
  104.             $otpsystem 'aadhaar';
  105.             $loginhint 'abha-number';
  106.         } else {
  107.             $scope = ['abha-login''mobile-verify'];
  108.             $encryptNumber $abhaNumber;
  109.             $otpsystem 'abdm';
  110.             $loginhint 'abha-number';
  111.         }
  112.         $encrypted $this->encryptWithPublicKey($encryptNumber);
  113.         $loginId = (base64_encode($encrypted));
  114.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  115.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  116.         $client HttpClient::create();
  117.         try {
  118.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp', [
  119.                 'headers' => [
  120.                     'Authorization: Bearer ' $this->getAccessToken(),
  121.                     'Content-Type: application/json',
  122.                     'REQUEST-ID: ' $this->GUID(),
  123.                     'TIMESTAMP: ' $isoTimestamp
  124.                 ],
  125.                 'json' => [
  126.                     'scope' => $scope,
  127.                     'loginHint' => $loginhint,
  128.                     'loginId' => $loginId,
  129.                     'otpSystem' => $otpsystem
  130.                 ]
  131.             ]);
  132.             $decodedPayload $response->toArray();
  133.             if ($decodedPayload['txnId'] == '') {
  134.                 // dd('if ma aavyu');
  135.                 $this->addFlash(
  136.                     'danger',
  137.                     'This Details Not Found'
  138.                 );
  139.                 return $this->render('abha/verify1.html.twig', [
  140.                     'abha_number' => '',
  141.                     'mobile_number' => '',
  142.                     'aadharcard_number' => '',
  143.                     'type' => $type,
  144.                     'message' => 'This Details Not Found',
  145.                 ]);
  146.             } else {
  147.                 // dd('else ma aavyu');
  148.                 $this->addFlash(
  149.                     'success',
  150.                     $decodedPayload['message']
  151.                 );
  152.                 return $this->render('abha/verify2.html.twig', [
  153.                     'txn_id' => $decodedPayload['txnId'],
  154.                     'timer' => $timer,
  155.                     'message' => $decodedPayload['message'],
  156.                     'authMode' => $auth_mode,
  157.                     'loginHint' => $loginhint,
  158.                     'loginId' => $loginId,
  159.                     'otpSystem' => $otpsystem,
  160.                     'mobileNumber' => $mobileNumber,
  161.                     'abhaNumber' => $abhaNumber,
  162.                     'aadharcardNumber' => $aadharcardNumber
  163.                 ]);
  164.             }
  165.         } catch (\Exception) {
  166.             //   dd('catch ma aavyu');
  167.             if($auth_mode == 'auth_viaaadhaar'){
  168.                 return $this->render('abha/aadharnumberverify.html.twig', [
  169.                     'abha_number' => '',
  170.                     'mobile_number' => '',
  171.                     'aadharcard_number' => '',
  172.                     'type' => $type,
  173.                 ]);
  174.             }elseif($auth_mode == 'auth_mobile'){
  175.                 return $this->render('abha/mobilenumberverify.html.twig', [
  176.                     'abha_number' => '',
  177.                     'mobile_number' => '',
  178.                     'aadharcard_number' => '',
  179.                     'type' => $type,
  180.                     'message' => 'This Details Not Found',
  181.                 ]);
  182.             }else{
  183.                 return $this->render('abha/mobilenumberverify.html.twig', [
  184.                     'abha_number' => '',
  185.                     'mobile_number' => '',
  186.                     'aadharcard_number' => '',
  187.                     'type' => $type,
  188.                     'message' => 'This Details Not Found',
  189.                 ]);
  190.             }
  191.             
  192.         }
  193.     }
  194.     #[Route(path'/abha-number-resend-otp'name'abhanumber_resend_otp'methods: ['GET''POST'])]
  195.     public function abhaNumberResendOtp(Request $request): Response
  196.     {
  197.         $txn_id $request->request->get('txn_id');
  198.         $auth_mode $request->request->get('authMode');
  199.         $aadharcardNumber $request->request->get('aadharcardNumber');
  200.         $abhaNumber $request->request->get('abhaNumber');
  201.         $mobileNumber $request->request->get('mobileNumber');
  202.         if ($auth_mode == 'auth_mobile') {
  203.             $scope = ['abha-login''mobile-verify'];
  204.             $encryptNumber $mobileNumber;
  205.             $otpsystem 'abdm';
  206.             $loginhint 'mobile';
  207.         } elseif ($auth_mode == 'auth_viaaadhaar') {
  208.             $scope = ['abha-login''aadhaar-verify'];
  209.             $encryptNumber $aadharcardNumber;
  210.             $otpsystem 'aadhaar';
  211.             $loginhint 'aadhaar';
  212.         } elseif ($auth_mode == 'auth_aadhaar') {
  213.             $scope = ['abha-login''aadhaar-verify'];
  214.             $encryptNumber $abhaNumber;
  215.             $otpsystem 'aadhaar';
  216.             $loginhint 'abha-number';
  217.         } else {
  218.             $scope = ['abha-login''mobile-verify'];
  219.             $encryptNumber $abhaNumber;
  220.             $otpsystem 'abdm';
  221.             $loginhint 'abha-number';
  222.         }
  223.         $encrypted $this->encryptWithPublicKey($encryptNumber);
  224.         $loginId = (base64_encode($encrypted));
  225.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  226.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  227.         try {
  228.             $client HttpClient::create();
  229.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp', [
  230.                 'headers' => [
  231.                     'Authorization: Bearer ' $this->getAccessToken(),
  232.                     'Content-Type: application/json',
  233.                     'REQUEST-ID: ' $this->GUID(),
  234.                     'TIMESTAMP: ' $isoTimestamp
  235.                 ],
  236.                 'json' => [
  237.                     'scope' => $scope,
  238.                     'loginHint' => $loginhint,
  239.                     'loginId' => $loginId,
  240.                     'otpSystem' => $otpsystem
  241.                 ]
  242.             ]);
  243.             $decodedPayload $response->toArray();
  244.             return $this->json([
  245.                 'txn_id' => $decodedPayload['txnId'],
  246.                 'message' => $decodedPayload['message'],
  247.                 'authMode' => $auth_mode,
  248.                 'loginHint' => $loginhint,
  249.                 'loginId' => $loginId,
  250.                 'otpSystem' => $otpsystem,
  251.                 'mobileNumber' => $mobileNumber,
  252.                 'abhaNumber' => $abhaNumber,
  253.                 'aadharcardNumber' => $aadharcardNumber
  254.             ]);
  255.         } catch (\Exception) {
  256.             return $this->json([
  257.                 'txn_id' => $txn_id,
  258.                 'message' => '',
  259.                 'authMode' => $auth_mode,
  260.                 'loginHint' => $loginhint,
  261.                 'loginId' => $loginId,
  262.                 'otpSystem' => $otpsystem,
  263.                 'mobileNumber' => $mobileNumber,
  264.                 'abhaNumber' => $abhaNumber,
  265.                 'aadharcardNumber' => $aadharcardNumber
  266.             ]);
  267.         }
  268.     }
  269.     #[Route(path'/abha-number-otp-verify'name'verify_abhanumber_otp'methods: ['GET''POST'])]
  270.     public function abhaNumberOtpVerify(Request $request): Response
  271.     {
  272.         $otp $request->request->get('otp');
  273.         $timer $request->request->get('timer');
  274.         $auth_mode $request->request->get('auth_mode');
  275.         $txnId $request->request->get('txn_id');
  276.         $aadharcardNumber $request->request->get('aadharcardNumber');
  277.         $abhaNumber $request->request->get('abhaNumber');
  278.         $mobileNumber $request->request->get('mobileNumber');
  279.         $otpsystem $request->request->get('otpSystem');
  280.         $loginhint $request->request->get('loginHint');
  281.         $loginId $request->request->get('loginId');
  282.         $scope = match ($auth_mode) {
  283.             'auth_mobile' => ['abha-login''mobile-verify'],
  284.             'auth_aadhaar' => ['abha-login''aadhaar-verify'],
  285.             'auth_viaaadhaar' => ['abha-login''aadhaar-verify'],
  286.             default => ['abha-login''mobile-verify'],
  287.         };
  288.         $encrypted $this->encryptWithPublicKey($otp);
  289.         $otpencoded = (base64_encode($encrypted));
  290.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  291.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  292.         try {
  293.             $client HttpClient::create();
  294.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify', [
  295.                 'headers' => [
  296.                     'Authorization: Bearer ' $this->getAccessToken(),
  297.                     'Content-Type: application/json',
  298.                     'REQUEST-ID: ' $this->GUID(),
  299.                     'TIMESTAMP: ' $isoTimestamp
  300.                 ],
  301.                 'json' => [
  302.                     'scope' => $scope,
  303.                     'authData' => [
  304.                         'authMethods' => [
  305.                             'otp'
  306.                         ],
  307.                         'otp' => [
  308.                             'txnId' => $txnId,
  309.                             'otpValue' => $otpencoded,
  310.                         ]
  311.                     ]
  312.                 ]
  313.             ]);
  314.             $decodedPayload $response->toArray();
  315.             if($decodedPayload['authResult'] == 'success') {
  316.                 $this->addFlash(
  317.                     'success',
  318.                     $decodedPayload['message']
  319.                 );
  320.                 if (isset($decodedPayload['accounts']) && is_array($decodedPayload['accounts'])) {
  321.                     foreach ($decodedPayload['accounts'] as $account) {
  322.                         $base64Image $account['profilePhoto'];
  323.                         $imageUrl 'data:image/jpeg;base64,' $base64Image;
  324.                         $accounts[] = ['name' => $account['name'], 'profilePhoto' => $imageUrl'ABHANumber' => $account['ABHANumber'], 'preferredAbhaAddress' => $account['preferredAbhaAddress']];
  325.                     }
  326.                 } else {
  327.                     throw new \Exception('No account found.');
  328.                 }
  329.     
  330.                 if ($auth_mode == 'auth_mobile') {
  331.                     return $this->render('abha/verify3.html.twig', [
  332.                         'txnId' => $decodedPayload['txnId'],
  333.                         'message' => $decodedPayload['message'],
  334.                         'token' => $decodedPayload['token'],
  335.                         'accounts' => $accounts,
  336.                         'authMode' => $auth_mode
  337.                     ]);
  338.                 } else {
  339.                     return $this->redirectToRoute('abha_num_verify_account', ['tokens' => $this->encryptor->encrypt($decodedPayload['token']), 'txnId' => $this->encryptor->encrypt($txnId)]);
  340.                 }
  341.          } else {
  342.                 $this->addFlash(
  343.                     'error',
  344.                     $decodedPayload['message']
  345.                 );
  346.               }
  347.             $accounts = [];
  348.             return $this->render('abha/verify2.html.twig', [
  349.                 'txn_id' => $txnId,
  350.                 'message' => '',
  351.                 'timer' => $timer,
  352.                 'authMode' => $auth_mode,
  353.                 'loginHint' => $loginhint,
  354.                 'loginId' => $loginId,
  355.                 'otpSystem' => $otpsystem,
  356.                 'mobileNumber' => $mobileNumber,
  357.                 'abhaNumber' => $abhaNumber,
  358.                 'aadharcardNumber' => $aadharcardNumber
  359.             ]);
  360.             
  361.         } catch (\Exception) {
  362.             return $this->render('abha/verify2.html.twig', [
  363.                 'txn_id' => $txnId,
  364.                 'message' => '',
  365.                 'timer' => $timer,
  366.                 'authMode' => $auth_mode,
  367.                 'loginHint' => $loginhint,
  368.                 'loginId' => $loginId,
  369.                 'otpSystem' => $otpsystem,
  370.                 'mobileNumber' => $mobileNumber,
  371.                 'abhaNumber' => $abhaNumber,
  372.                 'aadharcardNumber' => $aadharcardNumber
  373.             ]);
  374.         }
  375.     }
  376.     #[Route('/abha-number-user-verify'name'mobile_abhanumber_mode'methods: ['GET''POST'])]
  377.     public function mobileAbhaNumberMode(Request $request): Response
  378.     {
  379.         $token $request->request->get('token');
  380.         $fetch_mode $request->request->get('fetch_mode');
  381.         $txnId $request->request->get('txnId');
  382.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  383.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  384.         $client HttpClient::create();
  385.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify/user', [
  386.             'headers' => [
  387.                 'Authorization: Bearer ' $this->getAccessToken(),
  388.                 'T-token: Bearer ' $token,
  389.                 'Content-Type: application/json',
  390.                 'REQUEST-ID: ' $this->GUID(),
  391.                 'TIMESTAMP: ' $isoTimestamp
  392.             ],
  393.             'json' => [
  394.                 'ABHANumber' => $fetch_mode,
  395.                 'txnId' => $txnId
  396.             ]
  397.         ]);
  398.         $decodedPayload $response->toArray();
  399.         return $this->redirectToRoute('abha_num_verify_account', ['tokens' => $this->encryptor->encrypt($decodedPayload['token']), 'txnId' => $this->encryptor->encrypt($txnId)]);
  400.     }
  401.     #[Route(path'/abha-number-verify-account/{tokens}/{txnId}'name'abha_num_verify_account'methods: ['GET''POST'])]
  402.     #[ParamDecryptor(["tokens","txnId"])]
  403.     public function abhaNumberVerifyAccount(string $tokensstring $txnId): Response
  404.     {
  405.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  406.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  407.         $client HttpClient::create();
  408.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
  409.             'headers' => [
  410.                 'Authorization: Bearer ' $this->getAccessToken(),
  411.                 'X-token: Bearer ' $tokens,
  412.                 'Content-Type: application/json',
  413.                 'REQUEST-ID: ' $this->GUID(),
  414.                 'TIMESTAMP: ' $isoTimestamp
  415.             ],
  416.             'json' => []
  417.         ]);
  418.         $decodedPayload $response->toArray();
  419.         if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
  420.             $data['dob'] = $decodedPayload['dayOfBirth'] . '-' $decodedPayload['monthOfBirth'] . '-' $decodedPayload['yearOfBirth'];
  421.         }
  422.         return $this->render('abha/abhaverification.html.twig', [
  423.             'tokens' => $tokens,
  424.             'type' => '',
  425.             'verify_flow' => 'true',
  426.             'txnId' => $txnId,
  427.             'message' => '',
  428.             'firstName' => $decodedPayload['firstName'],
  429.             'middleName' => $decodedPayload['middleName'],
  430.             'lastName' => $decodedPayload['lastName'],
  431.             'dob' => $data['dob'],
  432.             'gender' => $decodedPayload['gender'],
  433.             'profilePhoto' => $decodedPayload['profilePhoto'],
  434.             'mobile' => $decodedPayload['mobile'],
  435.             'preferredAbhaAddress' => $decodedPayload['preferredAbhaAddress'],
  436.             'address' => $decodedPayload['address'],
  437.             'pincode' => $decodedPayload['pincode'],
  438.             'ABHANumber' => $decodedPayload['ABHANumber']
  439.         ]);
  440.     }
  441.     #[Route(path'/abha-card'name'abha_card'methods: ['GET''POST'])]
  442.     public function abhaCard(Request $request): Response
  443.     {
  444.         if ($request->request->has('type') || $request->get('data')) {
  445.             $type $request->request->get('type');
  446.         } else {
  447.             $type $this->encryptor->decrypt($request->query->get('type'));
  448.         }
  449.         $caseId $request->request->get('case_id');
  450.         if (!empty($caseId)) {
  451.             $session $request->getSession();
  452.             $session->set('case_id'$caseId);
  453.         }
  454.         return $this->render('abha/step1.html.twig', [
  455.             'aadhar_number' => '',
  456.             'type' => $type,
  457.         ]);
  458.     }
  459.     #[Route(path'/generate-otp'name'generate_otp'methods: ['GET''POST'])]
  460.     public function generateOtp(Request $request): Response
  461.     {
  462.         $type $request->request->get('type');
  463.         $aadharNumber $request->request->get('aadhar_number');
  464.         $encrypted $this->encryptWithPublicKey($aadharNumber);
  465.         $loginId base64_encode($encrypted);
  466.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  467.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  468.         $client HttpClient::create();
  469.         try {
  470.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
  471.                 'headers' => [
  472.                     'Authorization: Bearer ' $this->getAccessToken(),
  473.                     'Content-Type: application/json',
  474.                     'REQUEST-ID: ' $this->GUID(),
  475.                     'TIMESTAMP: ' $isoTimestamp
  476.                 ],
  477.                 'json' => [
  478.                     'txnId' => '',
  479.                     'scope' => ['abha-enrol'],
  480.                     'loginHint' => 'aadhaar',
  481.                     'loginId' => $loginId,
  482.                     'otpSystem' => 'aadhaar'
  483.                 ]
  484.             ]);
  485.             $session $request->getSession();
  486.             $session->set('session_txnId'0);
  487.             $decodedPayload $response->toArray();
  488.         } catch (\Exception) {
  489.             $this->addFlash(
  490.                 'danger',
  491.                 'Please enter valid Aadharcard Number.'
  492.             );
  493.             return $this->redirectToRoute('abha_card');
  494.         }
  495.         return $this->render('abha/step2.html.twig', [
  496.             'txnId' => $decodedPayload['txnId'],
  497.             'message' => $decodedPayload['message'],
  498.             'aadharNumber' => $aadharNumber,
  499.             'type' => $type,
  500.             'timer' => '0'
  501.         ]);
  502.     }
  503.     #[Route('/verify-otp'name'verify_otp'methods: ['GET''POST'])]
  504.     public function verifyOtp(Request $request): Response
  505.     {
  506.         $session $request->getSession();
  507.         // dd($request->request->get('timer'));
  508.         if ($request->getMethod() == 'POST') {
  509.             $type $request->request->get('type');
  510.             $message $request->request->get('message');
  511.             $aadharNumber $request->request->get('aadharNumber');
  512.             $otp $request->request->get('otp');
  513.             $mobile_number $request->request->get('mobile_number');
  514.             $txnId $request->request->get('txn_id');
  515.             $timer $request->request->get('timer');  
  516.             // dd($message,$txnId,$aadharNumber,$otp,$mobile_number,$type);
  517.         } else {
  518.             $type $session->get('type');
  519.             $otp $session->get('otp');
  520.             $mobile_number $session->get('mobile_number');
  521.             $txnId $session->get('txnId');
  522.             $timer $request->request->get('timer');
  523.         }
  524.         if (empty($type) || empty($otp) || empty($mobile_number) || empty($txnId) || empty($message) || empty($aadharNumber) || empty($timer)) {
  525.             throw $this->createNotFoundException('Invalid request parameters.');
  526.         }
  527.         $encrypted $this->encryptWithPublicKey($otp);
  528.         $otpValue base64_encode($encrypted);
  529.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  530.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  531.         $client HttpClient::create();
  532.         try {
  533.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar', [
  534.                 'headers' => [
  535.                     'Authorization: Bearer ' $this->getAccessToken(),
  536.                     'Content-Type: application/json',
  537.                     'REQUEST-ID: ' $this->GUID(),
  538.                     'TIMESTAMP: ' $isoTimestamp
  539.                 ],
  540.                 'json' => [
  541.                     'authData' => [
  542.                         'authMethods' => [
  543.                             'otp'
  544.                         ],
  545.                         'otp' => [
  546.                             'timeStamp' => $isoTimestamp,
  547.                             'txnId' => $txnId,
  548.                             'otpValue' => $otpValue,
  549.                             'mobile' => $mobile_number
  550.                         ]
  551.                     ],
  552.                     'consent' => [
  553.                         'code' => 'abha-enrollment',
  554.                         'version' => '1.4'
  555.                     ]
  556.                 ]
  557.             ]);
  558.             $decodedPayload $response->toArray();
  559.             if ($decodedPayload['isNew'] == 'false') {
  560.                 $message $decodedPayload['ABHAProfile']['mobile'];
  561.                 $mobile_numberdigit ".$mobile_number";
  562.                 $extractedDigits substr($message, -4);
  563.                 $extractedDigitsmobile substr($mobile_numberdigit, -4);
  564.                 if ($extractedDigits === $extractedDigitsmobile) {
  565.                     return $this->render('abha/abhalink_step1.html.twig', [
  566.                         'tokens' => $decodedPayload['tokens']['token'],
  567.                         'type' => $type,
  568.                         'verify_flow' => 'false',
  569.                         'txnId' => $decodedPayload['txnId'],
  570.                         'message' => $decodedPayload['message'],
  571.                         'firstName' => $decodedPayload['ABHAProfile']['firstName'],
  572.                         'middleName' => $decodedPayload['ABHAProfile']['middleName'],
  573.                         'lastName' => $decodedPayload['ABHAProfile']['lastName'],
  574.                         'dob' => $decodedPayload['ABHAProfile']['dob'],
  575.                         'gender' => $decodedPayload['ABHAProfile']['gender'],
  576.                         'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
  577.                         'mobile' => $decodedPayload['ABHAProfile']['mobile'],
  578.                         'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
  579.                         'address' => $decodedPayload['ABHAProfile']['address'],
  580.                         'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
  581.                         'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
  582.                     ]);
  583.                 } else {
  584.                     return $this->render('abha/step3.html.twig', [
  585.                         'txnId' => $decodedPayload['txnId'],
  586.                         'type' => $type,
  587.                         'mobile_number' => $mobile_number,
  588.                         'tokens' => $decodedPayload['tokens']['token']
  589.                     ]);
  590.                 }
  591.             } else {
  592.                 return $this->render('abha/abhalink_step1.html.twig', [
  593.                     'tokens' => $decodedPayload['tokens']['token'],
  594.                     'type' => $type,
  595.                     'verify_flow' => 'false',
  596.                     'txnId' => $decodedPayload['txnId'],
  597.                     'message' => $decodedPayload['message'],
  598.                     'firstName' => $decodedPayload['ABHAProfile']['firstName'],
  599.                     'middleName' => $decodedPayload['ABHAProfile']['middleName'],
  600.                     'lastName' => $decodedPayload['ABHAProfile']['lastName'],
  601.                     'dob' => $decodedPayload['ABHAProfile']['dob'],
  602.                     'gender' => $decodedPayload['ABHAProfile']['gender'],
  603.                     'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
  604.                     'mobile' => $decodedPayload['ABHAProfile']['mobile'],
  605.                     'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
  606.                     'address' => $decodedPayload['ABHAProfile']['address'],
  607.                     'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
  608.                     'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
  609.                 ]);
  610.             }
  611.         } catch (\Exception) {
  612.             // $session->set('type', );
  613.             // $session->set('otp', $otp);
  614.             // $session->set('mobile_number', $mobile_number);
  615.             // $session->set('txnId', $txnId);
  616.             $this->addFlash('danger''The OTP entered is invalid. Please verify and re-enter the correct OTP.');
  617.             return $this->render('abha/step2.html.twig', [
  618.                 'txnId' => $txnId,
  619.                 'message' => $message,
  620.                 'mobile_number' => $mobile_number,
  621.                 'type' => $type,
  622.                 'aadharNumber' => $aadharNumber,
  623.                 'otp' => $otp,
  624.                 'timer' => $timer
  625.             ]);
  626.             //return $this->redirectToRoute('generate_otp');
  627.         }
  628.     }
  629.     #[Route('/process-verify-otp'name'process_verify_otp'methods: ['GET''POST'])]
  630.     public function processVerifyOtp(Request $request): Response
  631.     {
  632.         $session $request->getSession();
  633.         $type $session->get('type');
  634.         $otp $session->get('otp');
  635.         $mobile_number $session->get('mobile_number');
  636.         $txnId $session->get('txnId');
  637.         if (empty($type) || empty($otp) || empty($mobile_number) || empty($txnId)) {
  638.             throw $this->createNotFoundException('Invalid request parameters.');
  639.         }
  640.         $encrypted $this->encryptWithPublicKey($otp);
  641.         $otpValue base64_encode($encrypted);
  642.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  643.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  644.         $client HttpClient::create();
  645.         try {
  646.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar', [
  647.                 'headers' => [
  648.                     'Authorization: Bearer ' $this->getAccessToken(),
  649.                     'Content-Type: application/json',
  650.                     'REQUEST-ID: ' $this->GUID(),
  651.                     'TIMESTAMP: ' $isoTimestamp
  652.                 ],
  653.                 'json' => [
  654.                     'authData' => [
  655.                         'authMethods' => [
  656.                             'otp'
  657.                         ],
  658.                         'otp' => [
  659.                             'timeStamp' => $isoTimestamp,
  660.                             'txnId' => $txnId,
  661.                             'otpValue' => $otpValue,
  662.                             'mobile' => $mobile_number
  663.                         ]
  664.                     ],
  665.                     'consent' => [
  666.                         'code' => 'abha-enrollment',
  667.                         'version' => '1.4'
  668.                     ]
  669.                 ]
  670.             ]);
  671.             $decodedPayload $response->toArray();
  672.             if ($decodedPayload['isNew'] == true) {
  673.                 $message $decodedPayload['ABHAProfile']['mobile'];
  674.                 $mobile_numberdigit ".$mobile_number";
  675.                 $extractedDigits substr($message, -4);
  676.                 $extractedDigitsmobile substr($mobile_numberdigit, -4);
  677.                 if ($extractedDigits === $extractedDigitsmobile && $decodedPayload['ABHAProfile']['mobile'] === 'null') {
  678.                     $this->addFlash('success'$decodedPayload['message']);
  679.                     return $this->render('abha/abhalink_step1.html.twig', [
  680.                         'tokens' => $decodedPayload['tokens']['token'],
  681.                         'type' => $type,
  682.                         'verify_flow' => 'false',
  683.                         'txnId' => $decodedPayload['txnId'],
  684.                         'message' => $decodedPayload['message'],
  685.                         'firstName' => $decodedPayload['ABHAProfile']['firstName'],
  686.                         'middleName' => $decodedPayload['ABHAProfile']['middleName'],
  687.                         'lastName' => $decodedPayload['ABHAProfile']['lastName'],
  688.                         'dob' => $decodedPayload['ABHAProfile']['dob'],
  689.                         'gender' => $decodedPayload['ABHAProfile']['gender'],
  690.                         'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
  691.                         'mobile' => $decodedPayload['ABHAProfile']['mobile'],
  692.                         'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
  693.                         'address' => $decodedPayload['ABHAProfile']['address'],
  694.                         'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
  695.                         'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
  696.                     ]);
  697.                 } else {
  698.                     return $this->render('abha/step3.html.twig', [
  699.                         'txnId' => $decodedPayload['txnId'],
  700.                         'type' => $type,
  701.                         'mobile_number' => $mobile_number,
  702.                         'tokens' => $decodedPayload['tokens']['token']
  703.                     ]);
  704.                 }
  705.             } else {
  706.                 return $this->render('abha/abhalink_step1.html.twig', [
  707.                     'tokens' => $decodedPayload['tokens']['token'],
  708.                     'type' => $type,
  709.                     'verify_flow' => 'false',
  710.                     'txnId' => $decodedPayload['txnId'],
  711.                     'message' => $decodedPayload['message'],
  712.                     'firstName' => $decodedPayload['ABHAProfile']['firstName'],
  713.                     'middleName' => $decodedPayload['ABHAProfile']['middleName'],
  714.                     'lastName' => $decodedPayload['ABHAProfile']['lastName'],
  715.                     'dob' => $decodedPayload['ABHAProfile']['dob'],
  716.                     'gender' => $decodedPayload['ABHAProfile']['gender'],
  717.                     'profilePhoto' => $decodedPayload['ABHAProfile']['photo'],
  718.                     'mobile' => $decodedPayload['ABHAProfile']['mobile'],
  719.                     'preferredAbhaAddress' => $decodedPayload['ABHAProfile']['phrAddress'][0],
  720.                     'address' => $decodedPayload['ABHAProfile']['address'],
  721.                     'pincode' => $decodedPayload['ABHAProfile']['pinCode'],
  722.                     'ABHANumber' => $decodedPayload['ABHAProfile']['ABHANumber']
  723.                 ]);
  724.             }
  725.         } catch (\Exception $e) {
  726.             throw $this->createNotFoundException($e->getMessage());
  727.         }
  728.     }
  729.     #[Route('/abha-suggestion-new'name'abha_suggestion_new'methods: ['GET''POST'])]
  730.     public function abhaSuggestionNew(Request $request): Response
  731.     {
  732.         $tokens $request->request->get('tokens');
  733.         $txnId $request->request->get('txn_id');
  734.         // dd($tokens,$txnId);
  735.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  736.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  737.         $client HttpClient::create();
  738.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/suggestion', [
  739.             'headers' => [
  740.                 'Authorization: Bearer ' $this->getAccessToken(),
  741.                 'Content-Type: application/json',
  742.                 'REQUEST-ID: ' $this->GUID(),
  743.                 'Transaction_Id: ' $txnId,
  744.                 'TIMESTAMP: ' $isoTimestamp
  745.             ],
  746.             'json' => []
  747.         ]);
  748.         //    dd($response);
  749.         $decodedPayload $response->toArray();
  750.         //  dd($decodedPayload);
  751.         return $this->render('abha/abhalink_step2.html.twig', [
  752.             'tokens' => $tokens,
  753.             'txnId' => $decodedPayload['txnId'],
  754.             'abhaAddressList' => $decodedPayload['abhaAddressList']
  755.         ]);
  756.     }
  757.     #[Route('/abha-address-verify-new'name'abha_addressverify_new'methods: ['GET''POST'])]
  758.     public function abhaAddressVerifyNew(Request $request): Response
  759.     {
  760.         $selectabha $request->request->get('health_id');
  761.         $txnId $request->request->get('txn_id');
  762.         $tokens $request->request->get('tokens');
  763.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  764.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  765.         $client HttpClient::create();
  766.         $client1 HttpClient::create();
  767.         try {
  768.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/abha-address', [
  769.                 'headers' => [
  770.                     'Authorization' => 'Bearer ' $this->getAccessToken(),
  771.                     'Content-Type' => 'application/json',
  772.                     'REQUEST-ID' => $this->GUID(),
  773.                     'TIMESTAMP' => $isoTimestamp,
  774.                 ],
  775.                 'json' => [
  776.                     'txnId' => $txnId,
  777.                     'abhaAddress' => $selectabha,
  778.                     'preferred' => 1,
  779.                 ],
  780.             ]);
  781.             $profileData1 $response->toArray();
  782.             $response2 $client1->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
  783.                 'headers' => [
  784.                     'Authorization' => 'Bearer ' $this->getAccessToken(),
  785.                     'X-Token' => 'Bearer ' $tokens,
  786.                     'Content-Type' => 'application/json',
  787.                     'REQUEST-ID' => $this->GUID(),
  788.                     'TIMESTAMP' => $isoTimestamp,
  789.                 ],
  790.             ]);
  791.             $profileData $response2->toArray();
  792.             if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  793.                 $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  794.             }
  795.         } catch (\Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface $e) {
  796.             return new Response('Error occurred!'Response::HTTP_BAD_REQUEST);
  797.         }
  798.         return $this->render('abha/stepnew10.html.twig', [
  799.             'txnId' => $txnId,
  800.             'message' => '',
  801.             'tokens' => $tokens,
  802.             'firstName' => $profileData['firstName'],
  803.             'middleName' => $profileData['middleName'],
  804.             'lastName' => $profileData['lastName'],
  805.             'dob' => $data['dob'],
  806.             'gender' => $profileData['gender'],
  807.             'profilePhoto' => $profileData['profilePhoto'],
  808.             'mobile' => $profileData['mobile'] ?? '',
  809.             'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
  810.             'address' => $profileData['address'],
  811.             'pincode' => $profileData['pincode'],
  812.             'ABHANumber' => $profileData['ABHANumber']
  813.         ]);
  814.     }
  815.     #[Route('/generate-abha-card-status'name'abhacard_status'methods: ['GET''POST'])]
  816.     public function abhaCardStatus(Request $request): Response
  817.     {
  818.         $tokens $request->request->get('tokens');
  819.         $txnId $request->request->get('txn_id');
  820.         $pincode $request->request->get('pincode');
  821.         $firstName $request->request->get('firstName');
  822.         $middleName $request->request->get('middleName');
  823.         $lastName $request->request->get('lastName');
  824.         $gender $request->request->get('gender');
  825.         $dob $request->request->get('dob');
  826.         $mobile $request->request->get('mobile');
  827.         $preferredAbhaAddress $request->request->get('preferredAbhaAddress');
  828.         $address $request->request->get('address');
  829.         $pincode $request->request->get('pincode');
  830.         $ABHANumber $request->request->get('ABHANumber');
  831.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  832.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  833.         $client HttpClient::create();
  834.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card', [
  835.             'headers' => [
  836.                 'Authorization: Bearer ' $this->getAccessToken(),
  837.                 'X-Token: Bearer ' $tokens,
  838.                 'Content-Type: application/json',
  839.                 'REQUEST-ID: ' $this->GUID(),
  840.                 'TIMESTAMP: ' $isoTimestamp
  841.             ],
  842.         ]);
  843.         $binaryImageData $response->getContent();
  844.         $base64Image base64_encode($binaryImageData);
  845.         $mimeType $response->getHeaders()['content-type'][0];
  846.         $imageUrl 'data:' $mimeType ';base64,' $base64Image;
  847.         $pdfOptions = new Options();
  848.         $pdfOptions->set('defaultFont''Arial');
  849.         $pdfOptions->setIsHtml5ParserEnabled(true);
  850.         $pdfOptions->setDebugPng(false);
  851.         $pdfOptions->setDebugKeepTemp(false);
  852.         $pdfOptions->setIsRemoteEnabled(true);
  853.         $dompdf = new Dompdf($pdfOptions);
  854.         if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  855.             $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  856.         }
  857.         return $this->render('abha/step10.html.twig', [
  858.             'txnId' => $txnId,
  859.             'message' => '',
  860.             'tokens' => $tokens,
  861.             'firstName' => $firstName,
  862.             'middleName' => $middleName,
  863.             'lastName' => $lastName,
  864.             'dob' => $dob,
  865.             'gender' => $gender,
  866.             'profilePhoto' => '',
  867.             'mobile' => $mobile,
  868.             'preferredAbhaAddress' => $preferredAbhaAddress,
  869.             'address' => $address,
  870.             'pincode' => $pincode,
  871.             'ABHANumber' => $ABHANumber,
  872.             'type' => 'test',
  873.             'imageUrl' => $imageUrl
  874.         ]);
  875.         $html preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi'''$html);
  876.         $dompdf->loadHtml($html);
  877.         $dompdf->setPaper('A4''portrait');
  878.         $dompdf->render();
  879.         return new Response($dompdf->output(), 200, [
  880.             'Content-Type' => 'application/pdf',
  881.             'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
  882.             'Cache-Control' => 'no-cache, private',
  883.             'Pragma' => 'no-cache'
  884.         ]);
  885.     }
  886.     #[Route('/generate-abha-card-status-verification'name'abhacard_status_verification'methods: ['GET''POST'])]
  887.     public function abhaCardStatusverification(Request $request): Response
  888.     {
  889.         $tokens $request->request->get('tokens');
  890.         $txnId $request->request->get('txn_id');
  891.         $pincode $request->request->get('pincode');
  892.         $firstName $request->request->get('firstName');
  893.         $middleName $request->request->get('middleName');
  894.         $lastName $request->request->get('lastName');
  895.         $gender $request->request->get('gender');
  896.         $dob $request->request->get('dob');
  897.         $mobile $request->request->get('mobile');
  898.         $preferredAbhaAddress $request->request->get('preferredAbhaAddress');
  899.         $address $request->request->get('address');
  900.         $pincode $request->request->get('pincode');
  901.         $ABHANumber $request->request->get('ABHANumber');
  902.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  903.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  904.         $client HttpClient::create();
  905.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card', [
  906.             'headers' => [
  907.                 'Authorization: Bearer ' $this->getAccessToken(),
  908.                 'X-Token: Bearer ' $tokens,
  909.                 'Content-Type: application/json',
  910.                 'REQUEST-ID: ' $this->GUID(),
  911.                 'TIMESTAMP: ' $isoTimestamp
  912.             ],
  913.         ]);
  914.         $binaryImageData $response->getContent();
  915.         $base64Image base64_encode($binaryImageData);
  916.         $mimeType $response->getHeaders()['content-type'][0];
  917.         $imageUrl 'data:' $mimeType ';base64,' $base64Image;
  918.         $pdfOptions = new Options();
  919.         $pdfOptions->set('defaultFont''Arial');
  920.         $pdfOptions->setIsHtml5ParserEnabled(true);
  921.         $pdfOptions->setDebugPng(false);
  922.         $pdfOptions->setDebugKeepTemp(false);
  923.         $pdfOptions->setIsRemoteEnabled(true);
  924.         $dompdf = new Dompdf($pdfOptions);
  925.         if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  926.             $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  927.         }
  928.         return $this->render('abha/abhaverificationview.html.twig', [
  929.             'txnId' => $txnId,
  930.             'message' => '',
  931.             'tokens' => $tokens,
  932.             'firstName' => $firstName,
  933.             'middleName' => $middleName,
  934.             'lastName' => $lastName,
  935.             'dob' => $dob,
  936.             'gender' => $gender,
  937.             'profilePhoto' => '',
  938.             'mobile' => $mobile,
  939.             'preferredAbhaAddress' => $preferredAbhaAddress,
  940.             'address' => $address,
  941.             'pincode' => $pincode,
  942.             'ABHANumber' => $ABHANumber,
  943.             'type' => 'test',
  944.             'imageUrl' => $imageUrl
  945.         ]);
  946.         $html preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi'''$html);
  947.         $dompdf->loadHtml($html);
  948.         $dompdf->setPaper('A4''portrait');
  949.         $dompdf->render();
  950.         return new Response($dompdf->output(), 200, [
  951.             'Content-Type' => 'application/pdf',
  952.             'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
  953.             'Cache-Control' => 'no-cache, private',
  954.             'Pragma' => 'no-cache'
  955.         ]);
  956.     }
  957.     #[Route('/generate-abha-card-address-status'name'abhacard_address_status'methods: ['GET''POST'])]
  958.     public function abhaCardAddressStatus(Request $request): Response
  959.     {
  960.         $tokens $request->request->get('tokens');
  961.         $txnId $request->request->get('txn_id');
  962.         $pincode $request->request->get('pincode');
  963.         $firstName $request->request->get('firstName');
  964.         $middleName $request->request->get('middleName');
  965.         $lastName $request->request->get('lastName');
  966.         $gender $request->request->get('gender');
  967.         $dob $request->request->get('dob');
  968.         $mobile $request->request->get('mobile');
  969.         $preferredAbhaAddress $request->request->get('preferredAbhaAddress');
  970.         $address $request->request->get('address');
  971.         $pincode $request->request->get('pincode');
  972.         $ABHANumber $request->request->get('ABHANumber');
  973.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  974.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  975.         $client HttpClient::create();
  976.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha/phr-card', [
  977.             'headers' => [
  978.                 'Authorization: Bearer ' $this->getAccessToken(),
  979.                 'X-Token: Bearer ' $tokens,
  980.                 'Content-Type: application/json',
  981.                 'REQUEST-ID: ' $this->GUID(),
  982.                 'TIMESTAMP: ' $isoTimestamp
  983.             ],
  984.         ]);
  985.         $binaryImageData $response->getContent();
  986.         $base64Image base64_encode($binaryImageData);
  987.         $mimeType $response->getHeaders()['content-type'][0];
  988.         $imageUrl 'data:' $mimeType ';base64,' $base64Image;
  989.         $pdfOptions = new Options();
  990.         $pdfOptions->set('defaultFont''Arial');
  991.         $pdfOptions->setIsHtml5ParserEnabled(true);
  992.         $pdfOptions->setDebugPng(false);
  993.         $pdfOptions->setDebugKeepTemp(false);
  994.         $pdfOptions->setIsRemoteEnabled(true);
  995.         $dompdf = new Dompdf($pdfOptions);
  996.         if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  997.             $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  998.         }
  999.         return $this->render('abha/addressdownload.html.twig', [
  1000.             'txnId' => $txnId,
  1001.             'message' => '',
  1002.             'tokens' => $tokens,
  1003.             'firstName' => $firstName,
  1004.             'middleName' => $middleName,
  1005.             'lastName' => $lastName,
  1006.             'dob' => $dob,
  1007.             'gender' => $gender,
  1008.             'profilePhoto' => '',
  1009.             'mobile' => $mobile,
  1010.             'preferredAbhaAddress' => $preferredAbhaAddress,
  1011.             'address' => $address,
  1012.             'pincode' => $pincode,
  1013.             'ABHANumber' => $ABHANumber,
  1014.             'type' => 'test',
  1015.             'imageUrl' => $imageUrl
  1016.         ]);
  1017.         $html preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi'''$html);
  1018.         $dompdf->loadHtml($html);
  1019.         $dompdf->setPaper('A4''portrait');
  1020.         $dompdf->render();
  1021.         return new Response($dompdf->output(), 200, [
  1022.             'Content-Type' => 'application/pdf',
  1023.             'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
  1024.             'Cache-Control' => 'no-cache, private',
  1025.             'Pragma' => 'no-cache'
  1026.         ]);
  1027.     }
  1028.     #[Route('/generate-abhacard-address'name'generate_address_abhacard'methods: ['GET''POST'])]
  1029.     public function generateAbhaCardAddress(Request $request): Response
  1030.     {
  1031.         $tokens $request->request->get('tokens');
  1032.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1033.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1034.         $client HttpClient::create();
  1035.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha/phr-card', [
  1036.             'headers' => [
  1037.                 'Authorization: Bearer ' $this->getAccessToken(),
  1038.                 'X-Token: Bearer ' $tokens,
  1039.                 'Content-Type: application/json',
  1040.                 'REQUEST-ID: ' $this->GUID(),
  1041.                 'TIMESTAMP: ' $isoTimestamp
  1042.             ],
  1043.         ]);
  1044.         $binaryImageData $response->getContent();
  1045.         $base64Image base64_encode($binaryImageData);
  1046.         // Determine the image mime type (for example, 'image/png' or 'image/jpeg')
  1047.         $mimeType $response->getHeaders()['content-type'][0];
  1048.         $imageUrl 'data:' $mimeType ';base64,' $base64Image;
  1049.         $pdfOptions = new Options();
  1050.         $pdfOptions->set('defaultFont''Arial');
  1051.         $pdfOptions->setIsHtml5ParserEnabled(true);
  1052.         $pdfOptions->setDebugPng(false);
  1053.         $pdfOptions->setDebugKeepTemp(false);
  1054.         $pdfOptions->setIsRemoteEnabled(true);
  1055.         $dompdf = new Dompdf($pdfOptions);
  1056.         $html $this->renderView('abha/step6.html.twig', [
  1057.             'imageUrl' => $imageUrl
  1058.         ]);
  1059.         $html preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi'''$html);
  1060.         $dompdf->loadHtml($html);
  1061.         $dompdf->setPaper('A4''portrait');
  1062.         $dompdf->render();
  1063.         return new Response($dompdf->output(), 200, [
  1064.             'Content-Type' => 'application/pdf',
  1065.             'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
  1066.             'Cache-Control' => 'no-cache, private',
  1067.             'Pragma' => 'no-cache'
  1068.         ]);
  1069.     }
  1070.     #[Route('/generate-abha-card'name'generate_abhacard'methods: ['GET''POST'])]
  1071.     public function generateAbhaCard(Request $request): Response
  1072.     {
  1073.         $tokens $request->request->get('tokens');
  1074.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1075.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1076.         $client HttpClient::create();
  1077.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card', [
  1078.             'headers' => [
  1079.                 'Authorization: Bearer ' $this->getAccessToken(),
  1080.                 'X-Token: Bearer ' $tokens,
  1081.                 'Content-Type: application/json',
  1082.                 'REQUEST-ID: ' $this->GUID(),
  1083.                 'TIMESTAMP: ' $isoTimestamp
  1084.             ],
  1085.         ]);
  1086.         $binaryImageData $response->getContent();
  1087.         $base64Image base64_encode($binaryImageData);
  1088.         // Determine the image mime type (for example, 'image/png' or 'image/jpeg')
  1089.         $mimeType $response->getHeaders()['content-type'][0];
  1090.         $imageUrl 'data:' $mimeType ';base64,' $base64Image;
  1091.         $pdfOptions = new Options();
  1092.         $pdfOptions->set('defaultFont''Arial');
  1093.         $pdfOptions->setIsHtml5ParserEnabled(true);
  1094.         $pdfOptions->setDebugPng(false);
  1095.         $pdfOptions->setDebugKeepTemp(false);
  1096.         $pdfOptions->setIsRemoteEnabled(true);
  1097.         $dompdf = new Dompdf($pdfOptions);
  1098.         $html $this->renderView('abha/step6.html.twig', [
  1099.             'imageUrl' => $imageUrl
  1100.         ]);
  1101.         $html preg_replace('/^HTTP\/[0-9\.]+\s+\d+\s+.*$/mi'''$html);
  1102.         $dompdf->loadHtml($html);
  1103.         $dompdf->setPaper('A4''portrait');
  1104.         $dompdf->render();
  1105.         return new Response($dompdf->output(), 200, [
  1106.             'Content-Type' => 'application/pdf',
  1107.             'Content-Disposition' => 'attachment; filename="ABHA_Card.pdf"',
  1108.             'Cache-Control' => 'no-cache, private',
  1109.             'Pragma' => 'no-cache'
  1110.         ]);
  1111.     }
  1112.     #[Route('/generate-mobile-otp-update'name'generate_mobile_otp_update'methods: ['GET''POST'])]
  1113.     public function generateMobileOtpupdate(Request $request): Response
  1114.     {
  1115.         $tokens $request->request->get('tokens');
  1116.         $txnId $request->request->get('txn_id');
  1117.         $mobileNumber $request->request->get('mobilenumber');
  1118.         $type $request->request->get('type');
  1119.         $timer $request->request->get('timer');
  1120.         $encrypted $this->encryptWithPublicKey($mobileNumber);
  1121.         $mobileEncoded base64_encode($encrypted);
  1122.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1123.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1124.         //dd($tokens,$txnId,$mobileNumber,$type,$mobileEncoded,$isoTimestamp);
  1125.         try {
  1126.             $client HttpClient::create();
  1127.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
  1128.                 'headers' => [
  1129.                     'Authorization: Bearer ' $this->getAccessToken(),
  1130.                     'Content-Type: application/json',
  1131.                     'REQUEST-ID: ' $this->GUID(),
  1132.                     'TIMESTAMP: ' $isoTimestamp
  1133.                 ],
  1134.                 'json' => [
  1135.                     'txnId' => $txnId,
  1136.                     'scope' => ['abha-enrol''mobile-verify'],
  1137.                     'loginHint' => 'mobile',
  1138.                     'loginId' => $mobileEncoded,
  1139.                     'otpSystem' => 'abdm'
  1140.                 ]
  1141.             ]);
  1142.             $decodedPayload $response->toArray();
  1143.             //  dd($decodedPayload);
  1144.             return $this->render('abha/mobileupdate.html.twig', [
  1145.                 'txnId' => $decodedPayload['txnId'],
  1146.                 'message' => $decodedPayload['message'],
  1147.                 'mobile_number' => $mobileNumber,
  1148.                 'type' => $type,
  1149.                 'tokens' => $tokens,
  1150.                 'timer' => $timer
  1151.             ]);
  1152.         } catch (\Exception $e) {
  1153.             //  dd($e->getMessage());
  1154.             return $this->render('abha/mobileupdate.html.twig', [
  1155.                 'txnId' => $txnId,
  1156.                 'message' => '',
  1157.                 'mobile_number' => $mobileNumber,
  1158.                 'type' => $type,
  1159.                 'tokens' => $tokens,
  1160.                 'timer' => $timer
  1161.             ]);
  1162.         }
  1163.     }
  1164.     #[Route('/generate-mobile-otp-update-verification'name'generate_mobile_otp_update_verification'methods: ['GET''POST'])]
  1165.     public function generateMobileOtpupdateverification(Request $request): Response
  1166.     {
  1167.         $tokens $request->request->get('tokens');
  1168.         $txnId $request->request->get('txn_id');
  1169.         $mobileNumber $request->request->get('mobilenumber');
  1170.         $type $request->request->get('type');
  1171.         $timer $request->request->get('timer');
  1172.         $encrypted $this->encryptWithPublicKey($mobileNumber);
  1173.         $mobileEncoded base64_encode($encrypted);
  1174.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1175.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1176.         // dd($tokens,$txnId,$mobileNumber,$type,$mobileEncoded,$isoTimestamp);
  1177.         try {
  1178.             $client HttpClient::create();
  1179.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/request/otp', [
  1180.                 'headers' => [
  1181.                     'Authorization: Bearer ' $this->getAccessToken(),
  1182.                     'X-token: Bearer ' $tokens,
  1183.                     'Content-Type: application/json',
  1184.                     'REQUEST-ID: ' $this->GUID(),
  1185.                     'TIMESTAMP: ' $isoTimestamp
  1186.                 ],
  1187.                 'json' => [
  1188.                     'txnId' => $txnId,
  1189.                     'scope' => ['abha-profile''mobile-verify'],
  1190.                     'loginHint' => 'mobile',
  1191.                     'loginId' => $mobileEncoded,
  1192.                     'otpSystem' => 'abdm'
  1193.                 ]
  1194.             ]);
  1195.             $decodedPayload $response->toArray();
  1196.              // dd($decodedPayload);
  1197.             return $this->render('abha/mobileupdateverification.html.twig', [
  1198.                 'txnId' => $decodedPayload['txnId'],
  1199.                 'message' => $decodedPayload['message'],
  1200.                 'mobile_number' => $mobileNumber,
  1201.                 'type' => $type,
  1202.                 'tokens' => $tokens,
  1203.                 'timer' => $timer,
  1204.             ]); 
  1205.         } catch (\Exception $e) {
  1206.              // dd($e->getMessage());
  1207.             return $this->render('abha/mobileupdateverification.html.twig', [
  1208.                 'txnId' => $txnId,
  1209.                 'message' => '',
  1210.                 'mobile_number' => $mobileNumber,
  1211.                 'type' => $type,
  1212.                 'tokens' => $tokens,
  1213.                 'timer' => $timer,
  1214.             ]);
  1215.         }
  1216.     }
  1217.     #[Route('/generate-mobile-otp'name'generate_mobile_otp'methods: ['GET''POST'])]
  1218.     public function generateMobileOtp(Request $request): Response
  1219.     {
  1220.         $tokens $request->request->get('tokens');
  1221.         $type $request->request->get('type');
  1222.         $txnId $request->request->get('txn_id');
  1223.         $mobileNumber $request->request->get('mobile_number');
  1224.         $timer $request->request->get('timer');
  1225.         $encrypted $this->encryptWithPublicKey($mobileNumber);
  1226.         $mobileEncoded base64_encode($encrypted);
  1227.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1228.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1229.         try {
  1230.             $client HttpClient::create();
  1231.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
  1232.                 'headers' => [
  1233.                     'Authorization: Bearer ' $this->getAccessToken(),
  1234.                     'Content-Type: application/json',
  1235.                     'REQUEST-ID: ' $this->GUID(),
  1236.                     'TIMESTAMP: ' $isoTimestamp
  1237.                 ],
  1238.                 'json' => [
  1239.                     'txnId' => $txnId,
  1240.                     'scope' => ['abha-enrol''mobile-verify'],
  1241.                     'loginHint' => 'mobile',
  1242.                     'loginId' => $mobileEncoded,
  1243.                     'otpSystem' => 'abdm'
  1244.                 ]
  1245.             ]);
  1246.             $decodedPayload $response->toArray();
  1247.             return $this->render('abha/step4.html.twig', [
  1248.                 'txnId' => $decodedPayload['txnId'],
  1249.                 'message' => $decodedPayload['message'],
  1250.                 'mobile_number' => $mobileNumber,
  1251.                 'type' => $type,
  1252.                 'tokens' => $tokens,
  1253.                 'timer' => $timer,
  1254.             ]);
  1255.         } catch (\Exception $e) {
  1256.             return $this->render('abha/step4.html.twig', [
  1257.                 'txnId' => $txnId,
  1258.                 'message' => '',
  1259.                 'mobile_number' => $mobileNumber,
  1260.                 'type' => $type,
  1261.                 'tokens' => $tokens,
  1262.                 'timer' => $timer,
  1263.             ]);
  1264.         }
  1265.     }
  1266.     #[Route('/verify-mobile-otp-update'name'verify_mobile_otp_update'methods: ['GET''POST'])]
  1267.     public function verifyMobileOtpUpdate(Request $request): Response
  1268.     {
  1269.         $tokens $request->request->get('tokens');
  1270.         $txnId $request->request->get('txn_id');
  1271.         $otp $request->request->get('otp');
  1272.         $mobileNumber $request->request->get('mobile_number');
  1273.         $timer $request->request->get('timer');
  1274.         $encrypted $this->encryptWithPublicKey($otp);
  1275.         $otpencoded base64_encode($encrypted);
  1276.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1277.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1278.         //    dd($tokens,$txnId,$otp,$mobileNumber,$otpencoded,$isoTimestamp);
  1279.         try {
  1280.             $client HttpClient::create();
  1281.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/auth/byAbdm', [
  1282.                 'headers' => [
  1283.                     'Authorization: Bearer ' $this->getAccessToken(),
  1284.                     'Content-Type: application/json',
  1285.                     'REQUEST-ID: ' $this->GUID(),
  1286.                     'TIMESTAMP: ' $isoTimestamp
  1287.                 ],
  1288.                 'json' => [
  1289.                     'scope' => [
  1290.                         'abha-enrol',
  1291.                         'mobile-verify'
  1292.                     ],
  1293.                     'authData' => [
  1294.                         'authMethods' => [
  1295.                             'otp'
  1296.                         ],
  1297.                         'otp' => [
  1298.                             'timeStamp' => $isoTimestamp,
  1299.                             'txnId' => $txnId,
  1300.                             'otpValue' => $otpencoded
  1301.                         ]
  1302.                     ]
  1303.                 ]
  1304.             ]);
  1305.             $decodedPayload $response->toArray();
  1306.             //   dd($decodedPayload);
  1307.             if ($decodedPayload['authResult'] == 'success') {
  1308.                 $client1 HttpClient::create();
  1309.                 $response2 $client1->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
  1310.                     'headers' => [
  1311.                         'Authorization' => 'Bearer ' $this->getAccessToken(),
  1312.                         'X-Token' => 'Bearer ' $tokens,
  1313.                         'Content-Type' => 'application/json',
  1314.                         'REQUEST-ID' => $this->GUID(),
  1315.                         'TIMESTAMP' => $isoTimestamp,
  1316.                     ],
  1317.                 ]);
  1318.                 $profileData $response2->toArray();
  1319.                 // dd($profileData);
  1320.                 if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  1321.                     $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  1322.                 }
  1323.             
  1324.                 return $this->render('abha/mobileupdatestep.html.twig', [
  1325.                     'txnId' => $txnId,
  1326.                     'message' => '',
  1327.                     'tokens' => $tokens,
  1328.                     'firstName' => $profileData['firstName'],
  1329.                     'middleName' => $profileData['middleName'],
  1330.                     'lastName' => $profileData['lastName'],
  1331.                     'dob' => $data['dob'],
  1332.                     'gender' => $profileData['gender'],
  1333.                     'profilePhoto' => $profileData['profilePhoto'],
  1334.                     'mobile' => $profileData['mobile'],
  1335.                     'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
  1336.                     'address' => $profileData['address'],
  1337.                     'pincode' => $profileData['pincode'],
  1338.                     'ABHANumber' => $profileData['ABHANumber']
  1339.                 ]);
  1340.             } else {
  1341.                 return $this->render('abha/mobileupdate.html.twig', [
  1342.                     'txnId' => $txnId,
  1343.                     'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
  1344.                     'mobile_number' => $mobileNumber,
  1345.                     'type' => '',
  1346.                     'tokens' => $tokens,
  1347.                     'timer' => $timer
  1348.                 ]);
  1349.             }
  1350.         } catch (\Exception $e) {
  1351.             //    dd($e->getMessage());
  1352.             return $this->render('abha/mobileupdate.html.twig', [
  1353.                 'txnId' => $txnId,
  1354.                 'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
  1355.                 'mobile_number' => $mobileNumber,
  1356.                 'type' => '',
  1357.                 'tokens' => $tokens,
  1358.                 'timer' => $timer
  1359.             ]);
  1360.         }
  1361.     }
  1362.     #[Route('/verify-mobile-otp-update-verification'name'verify_mobile_otp_update_verification'methods: ['GET''POST'])]
  1363.     public function verifyMobileOtpUpdateverification(Request $request): Response
  1364.     {
  1365.         $tokens $request->request->get('tokens');
  1366.         $txnId $request->request->get('txn_id');
  1367.         $otp $request->request->get('otp');
  1368.         $mobileNumber $request->request->get('mobile_number');
  1369.         $timer $request->request->get('timer');
  1370.         $encrypted $this->encryptWithPublicKey($otp);
  1371.         $otpencoded base64_encode($encrypted);
  1372.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1373.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1374.         //    dd($tokens,$txnId,$otp,$mobileNumber,$otpencoded,$isoTimestamp);
  1375.         try {
  1376.             $client HttpClient::create();
  1377.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/verify', [
  1378.                 'headers' => [
  1379.                     'Authorization: Bearer ' $this->getAccessToken(),
  1380.                     'X-token: Bearer ' $tokens,
  1381.                     'Content-Type: application/json',
  1382.                     'REQUEST-ID: ' $this->GUID(),
  1383.                     'TIMESTAMP: ' $isoTimestamp
  1384.                 ],
  1385.                 'json' => [
  1386.                     'scope' => [
  1387.                         'abha-profile',
  1388.                         'mobile-verify'
  1389.                     ],
  1390.                     'authData' => [
  1391.                         'authMethods' => [
  1392.                             'otp'
  1393.                         ],
  1394.                         'otp' => [
  1395.                             'timeStamp' => $isoTimestamp,
  1396.                             'txnId' => $txnId,
  1397.                             'otpValue' => $otpencoded
  1398.                         ]
  1399.                     ]
  1400.                 ]
  1401.             ]);
  1402.             $decodedPayload $response->toArray();
  1403.             //   dd($decodedPayload);
  1404.             if ($decodedPayload['authResult'] == 'success') {
  1405.                 $client1 HttpClient::create();
  1406.                 $response2 $client1->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
  1407.                     'headers' => [
  1408.                         'Authorization' => 'Bearer ' $this->getAccessToken(),
  1409.                         'X-Token' => 'Bearer ' $tokens,
  1410.                         'Content-Type' => 'application/json',
  1411.                         'REQUEST-ID' => $this->GUID(),
  1412.                         'TIMESTAMP' => $isoTimestamp,
  1413.                     ],
  1414.                 ]);
  1415.                 $profileData $response2->toArray();
  1416.                 // dd($profileData);
  1417.                 if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  1418.                     $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  1419.                 }
  1420.             
  1421.                 return $this->render('abha/mobileupdatestepverification.html.twig', [
  1422.                     'txnId' => $txnId,
  1423.                     'message' => '',
  1424.                     'tokens' => $tokens,
  1425.                     'firstName' => $profileData['firstName'],
  1426.                     'middleName' => $profileData['middleName'],
  1427.                     'lastName' => $profileData['lastName'],
  1428.                     'dob' => $data['dob'],
  1429.                     'gender' => $profileData['gender'],
  1430.                     'profilePhoto' => $profileData['profilePhoto'],
  1431.                     'mobile' => $profileData['mobile'],
  1432.                     'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
  1433.                     'address' => $profileData['address'],
  1434.                     'pincode' => $profileData['pincode'],
  1435.                     'ABHANumber' => $profileData['ABHANumber']
  1436.                 ]);
  1437.             } else {
  1438.                 return $this->render('abha/mobileupdateverification.html.twig', [
  1439.                     'txnId' => $txnId,
  1440.                     'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
  1441.                     'mobile_number' => $mobileNumber,
  1442.                     'type' => '',
  1443.                     'tokens' => $tokens,
  1444.                     'timer' => $timer
  1445.                 ]);
  1446.             }
  1447.         } catch (\Exception $e) {
  1448.             //    dd($e->getMessage());
  1449.             return $this->render('abha/mobileupdateverification.html.twig', [
  1450.                 'txnId' => $txnId,
  1451.                 'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
  1452.                 'mobile_number' => $mobileNumber,
  1453.                 'type' => '',
  1454.                 'tokens' => $tokens,
  1455.                 'timer' => $timer
  1456.             ]);
  1457.         }
  1458.     }
  1459.     #[Route('/verify-mobile-otp'name'verify_mobile_otp'methods: ['GET''POST'])]
  1460.     public function verifyMobileOtp(Request $request): Response
  1461.     {
  1462.         $tokens $request->request->get('tokens');
  1463.         $txnId $request->request->get('txn_id');
  1464.         $otp $request->request->get('otp');
  1465.         $mobileNumber $request->request->get('mobile_number');
  1466.         $timer $request->request->get('timer');
  1467.         $encrypted $this->encryptWithPublicKey($otp);
  1468.         $otpencoded = (base64_encode($encrypted));
  1469.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1470.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1471.         //dd($tokens,$txnId,$otp,$mobileNumber,$otpencoded,$isoTimestamp);
  1472.         try {
  1473.             $client HttpClient::create();
  1474.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/auth/byAbdm', [
  1475.                 'headers' => [
  1476.                     'Authorization: Bearer ' $this->getAccessToken(),
  1477.                     'Content-Type: application/json',
  1478.                     'REQUEST-ID: ' $this->GUID(),
  1479.                     'TIMESTAMP: ' $isoTimestamp
  1480.                 ],
  1481.                 'json' => [
  1482.                     'scope' => [
  1483.                         'abha-enrol',
  1484.                         'mobile-verify'
  1485.                     ],
  1486.                     'authData' => [
  1487.                         'authMethods' => [
  1488.                             'otp'
  1489.                         ],
  1490.                         'otp' => [
  1491.                             'timeStamp' => $isoTimestamp,
  1492.                             'txnId' => $txnId,
  1493.                             'otpValue' => $otpencoded
  1494.                         ]
  1495.                     ]
  1496.                 ]
  1497.             ]);
  1498.             $decodedPayload $response->toArray();
  1499.             // dd($decodedPayload);
  1500.             if ($decodedPayload['authResult'] == 'success') {  // if api success, get tnx id
  1501.                 return $this->redirectToRoute('abha_suggestion', ['txnId' => $this->encryptor->encrypt($decodedPayload['txnId']), 'tokens' => $this->encryptor->encrypt($tokens), 'message' => $this->encryptor->encrypt($decodedPayload['message'])]);
  1502.             } else {
  1503.                 $this->addFlash(
  1504.                     'danger',
  1505.                     'The OTP entered is invalid. Please verify and re-enter the correct OTP',
  1506.                 );
  1507.                 return $this->render('abha/step4.html.twig', [
  1508.                     'txnId' => $txnId,
  1509.                     'message' => '',
  1510.                     'mobile_number' => $mobileNumber,
  1511.                     'type' => '',
  1512.                     'tokens' => $tokens,
  1513.                     'timer' => $timer
  1514.                 ]);
  1515.             }
  1516.         } catch (\Exception $e) {
  1517.             // dd($e->getMessage());
  1518.             return $this->render('abha/step4.html.twig', [
  1519.                 'txnId' => $txnId,
  1520.                 'message' => '',
  1521.                 'mobile_number' => $mobileNumber,
  1522.                 'type' => '',
  1523.                 'tokens' => $tokens,
  1524.                 'timer' => $timer
  1525.             ]);
  1526.         }
  1527.         // return $this->redirectToRoute('abha_suggestion', ['txnId' => $decodedPayload['txnId'], 'tokens' => $tokens, 'message' => $decodedPayload['message']]);
  1528.     }
  1529.     #[Route('/abha-suggestion/{txnId}/{tokens}/{message}'name'abha_suggestion'methods: ['GET''POST'])]
  1530.     #[ParamDecryptor(["txnId","tokens","message"])]
  1531.     public function abhaSuggestion(string $txnIdstring $tokensstring $message): Response
  1532.     {
  1533.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1534.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1535.         $client HttpClient::create();
  1536.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/suggestion', [
  1537.             'headers' => [
  1538.                 'Authorization: Bearer ' $this->getAccessToken(),
  1539.                 'Content-Type: application/json',
  1540.                 'REQUEST-ID: ' $this->GUID(),
  1541.                 'Transaction_Id: ' $txnId,
  1542.                 'TIMESTAMP: ' $isoTimestamp
  1543.             ],
  1544.             'json' => []
  1545.         ]);
  1546.         $decodedPayload $response->toArray();
  1547.         $this->addFlash(
  1548.             'success',
  1549.             $message
  1550.         );
  1551.         return $this->render('abha/step5.html.twig', [
  1552.             'txnId' => $decodedPayload['txnId'],
  1553.             'message' => $message,
  1554.             'tokens' => $tokens,
  1555.             'abhaAddressList' => $decodedPayload['abhaAddressList']
  1556.         ]);
  1557.     }
  1558.     #[Route('/abha-address-verify'name'abha_addressverify'methods: ['GET''POST'])]
  1559.     public function abhaAddressVerify(Request $request): Response
  1560.     {
  1561.         $selectabha $request->request->get('fetch_mode');
  1562.         $tokens $request->request->get('tokens');
  1563.         $txnId $request->request->get('txn_id');
  1564.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1565.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1566.         // dd($selectabha,$tokens,$txnId,$isoTimestamp);
  1567.         $client HttpClient::create();
  1568.         $client1 HttpClient::create();
  1569.         try {
  1570.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/abha-address', [
  1571.                 'headers' => [
  1572.                     'Authorization: Bearer ' $this->getAccessToken(),
  1573.                     'Content-Type: application/json',
  1574.                     'REQUEST-ID: ' $this->GUID(),
  1575.                     'TIMESTAMP: ' $isoTimestamp
  1576.                 ],
  1577.                 'json' => [
  1578.                     'txnId' => $txnId,
  1579.                     'abhaAddress' => $selectabha,
  1580.                     'preferred' => 1
  1581.                 ]
  1582.             ]);
  1583.             $response2 $client1->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
  1584.                 'headers' => [
  1585.                     'Authorization' => 'Bearer ' $this->getAccessToken(),
  1586.                     'X-Token' => 'Bearer ' $tokens,
  1587.                     'Content-Type' => 'application/json',
  1588.                     'REQUEST-ID' => $this->GUID(),
  1589.                     'TIMESTAMP' => $isoTimestamp,
  1590.                 ],
  1591.             ]);
  1592.             $profileData $response2->toArray();
  1593.             if (isset($profileData['dayOfBirth']) && isset($profileData['monthOfBirth']) && isset($profileData['yearOfBirth'])) {
  1594.                 $data['dob'] = $profileData['dayOfBirth'] . '-' $profileData['monthOfBirth'] . '-' $profileData['yearOfBirth'];
  1595.             }
  1596.         } catch (\Exception $e) {
  1597.             // dd($e->getMessage());
  1598.             return redirect('searchAbha');
  1599.         }
  1600.         return $this->render('abha/stepnew10.html.twig', [
  1601.             'txnId' => $txnId,
  1602.             'message' => '',
  1603.             'tokens' => $tokens,
  1604.             'firstName' => $profileData['firstName'],
  1605.             'middleName' => $profileData['middleName'],
  1606.             'lastName' => $profileData['lastName'],
  1607.             'dob' => $data['dob'],
  1608.             'gender' => $profileData['gender'],
  1609.             'profilePhoto' => $profileData['profilePhoto'],
  1610.             'mobile' => $profileData['mobile'],
  1611.             'preferredAbhaAddress' => $profileData['preferredAbhaAddress'],
  1612.             'address' => $profileData['address'],
  1613.             'pincode' => $profileData['pincode'],
  1614.             'ABHANumber' => $profileData['ABHANumber']
  1615.         ]);
  1616.     }
  1617.     // #[Route('/abha-emaiAddressverify', name: 'abha_emailverify', methods: ['GET', 'POST'])]
  1618.     // public function abhaEmailverify(Request $request ): Response
  1619.     // {
  1620.     //     $text = $this->loadPublicKeyText();
  1621.     //     try {
  1622.     //         $publicKey = PublicKeyLoader::loadPublicKey($text);
  1623.     //     } catch (\phpseclib3\Exception\NoKeyLoadedException $e) {
  1624.     //         throw new \Exception('Error loading key: ' . $e->getMessage());
  1625.     //     }
  1626.     //     $encrypted = $publicKey
  1627.     //         ->withPadding(RSA::ENCRYPTION_OAEP)
  1628.     //         ->withHash('sha1')
  1629.     //         ->withMGFHash('sha1')
  1630.     //         ->encrypt($aadharNumber);
  1631.     //     $aadharcardencoded = (base64_encode($encrypted));
  1632.     //     $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1633.     //     $isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');  // ISO 8601 with milliseconds (v) and Z for UTC
  1634.     //     $requestId = $this->GUID();
  1635.     //     $accessToken = $this->getAccessToken();
  1636.     //     $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1637.     // $isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
  1638.     // $client = HttpClient::create();
  1639.     //     $response = $client->request('POST', 'https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/request/emailVerificationLink', [
  1640.     //         'headers' => [
  1641.     //             'Authorization: Bearer ' . $accessToken,
  1642.     //             'Content-Type: application/json',
  1643.     //             'REQUEST-ID: ' . $requestId,
  1644.     //             'TIMESTAMP: ' . $isoTimestamp
  1645.     //         ],
  1646.     //         'json' => [
  1647.     //             'txnId' => '',
  1648.     //             'scope' => ['abha-enrol'],
  1649.     //             'loginHint' => 'aadhaar',
  1650.     //             'loginId' => $aadharcardencoded,
  1651.     //             'otpSystem' => 'aadhaar'
  1652.     //         ]
  1653.     //     ]);
  1654.     //     $decodedPayload = $response->toArray();
  1655.     // }
  1656.     #[Route('/abha-exists'name'abha_exists'methods: ['GET''POST'])]
  1657.     public function abhaExistsCheck(Request $requestPatientRepository $patientRepo): Response
  1658.     {
  1659.         try {
  1660.             $type $request->request->get('type');
  1661.             $healthId $request->request->get('health_id');
  1662.             $txnId $request->request->get('txn_id');
  1663.             if (!$healthId && strlen($healthId) <= 6) {
  1664.                 $this->addFlash(
  1665.                     'danger',
  1666.                     'Please enter valid abha address.'
  1667.                 );
  1668.                 return $this->render('abha/step5.html.twig', [
  1669.                     'txnId' => $txnId,
  1670.                     'type' => $type,
  1671.                     'step' => $request->request->get('step'),
  1672.                 ]);
  1673.             }
  1674.             $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1675.             $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1676.             $client HttpClient::create();
  1677.             $response $client->request('POST''https://healthid.abdm.gov.in/api/v1/registration/aadhaar/createHealthIdWithPreVerified', [
  1678.                 'headers' => [
  1679.                     'Authorization' => $this->getAccessToken(),
  1680.                     'Content-Type' => 'application/json',
  1681.                 ],
  1682.                 'json' => [
  1683.                     'healthId' => $healthId,
  1684.                     'txnId' => $txnId
  1685.                 ]
  1686.             ]);
  1687.             $decodedPayload $response->toArray();
  1688.             $data = [
  1689.                 'token' => $decodedPayload['token'] ?? '',
  1690.                 'firstName' => $decodedPayload['firstName'] ?? '',
  1691.                 'lastName' => $decodedPayload['lastName'] ?? '',
  1692.                 'middleName' => $decodedPayload['middleName'] ?? '',
  1693.                 'stateCode' => $decodedPayload['stateCode'] ?? '',
  1694.                 'mobile' => $decodedPayload['mobile'] ?? '',
  1695.                 'gender' => $decodedPayload['gender'] ?? '',
  1696.                 'healthIdNumber' => $decodedPayload['healthIdNumber'] ?? '',
  1697.                 'dayOfBirth' => $decodedPayload['dayOfBirth'] ?? '',
  1698.                 'monthOfBirth' => $decodedPayload['monthOfBirth'] ?? '',
  1699.                 'yearOfBirth' => $decodedPayload['yearOfBirth'] ?? '',
  1700.                 'districtCode' => $decodedPayload['districtCode'] ?? '',
  1701.                 'stateName' => $decodedPayload['stateName'] ?? '',
  1702.                 'districtName' => $decodedPayload['districtName'] ?? '',
  1703.                 'healthIdAddress' => $decodedPayload['healthId'] ?? '',
  1704.             ];
  1705.             if (empty($data['healthIdAddress']) || empty($data['healthIdNumber'])) {
  1706.                 $getTokenData = (array) json_decode(base64_decode(str_replace('_''/'str_replace('-''+'explode('.'$data['token'])[1]))));
  1707.                 $data['healthIdAddress'] = $getTokenData['healthId'] ?? '';
  1708.                 $data['healthIdNumber'] = $getTokenData['healthIdNumber'] ?? '';
  1709.             }
  1710.             if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
  1711.                 $data['dob'] = $decodedPayload['dayOfBirth'] . '-' $decodedPayload['monthOfBirth'] . '-' $decodedPayload['yearOfBirth'];
  1712.             }
  1713.             if ($type == 'reg') {
  1714.                 return $this->redirectToRoute('patient_new', ['data' => $data]);
  1715.             } else if ($type == 'case_diagnose') {
  1716.                 $session $request->getSession();
  1717.                 if (is_numeric($session->get('case_id'))) {
  1718.                     $caseId $session->get('case_id');
  1719.                 } else {
  1720.                     $caseId $this->encryptor->decrypt($session->get('case_id'));
  1721.                 }
  1722.                 $patientId $patientRepo->getPatientId($caseId);  // get patient id
  1723.                 if (isset($patientId[0]['id'])) {
  1724.                     $patientRepo->updateAbhaDetails($data$patientId[0]['id']);
  1725.                 }
  1726.                 return $this->redirectToRoute('data_link_fetch', ['id' => $this->encryptor->encrypt($caseId)]);
  1727.             } elseif ($type == 'lab_case_index') {  // lab user
  1728.                 return $this->redirectToRoute('lab_case_index');
  1729.             } elseif ($type == 'case_lab_test') {  // lab user
  1730.                 return $this->redirectToRoute('case_lab_test');
  1731.             } elseif ($type == 'ext_samp_index') {  // lab user
  1732.                 return $this->redirectToRoute('ext_samp_index');
  1733.             } elseif ($type == 'oth_hosp_test_index') {  // lab user
  1734.                 return $this->redirectToRoute('oth_hosp_test_index');
  1735.             } elseif ($type == 'case_radiology_completed') {  // radiology user
  1736.                 return $this->redirectToRoute('case_rad_test_completed');
  1737.             } elseif ($type == 'case_radiology_pending') {  // radiology user
  1738.                 return $this->redirectToRoute('case_rad_test');
  1739.             }
  1740.         } catch (\Exception) {
  1741.             $this->addFlash(
  1742.                 'danger',
  1743.                 'Something went wrong, please try again.'
  1744.             );
  1745.             return $this->render('abha/step5.html.twig', [
  1746.                 'txnId' => $txnId,
  1747.                 'type' => $type,
  1748.                 'step' => $request->request->get('step'),
  1749.             ]);
  1750.         }
  1751.     }
  1752.     #[Route('/is-abha-exists'name'is_abha_exists'methods: ['GET''POST'])]
  1753.     public function isAbhaExists(Request $request): Response
  1754.     {
  1755.         // $healthId = $request->request->get('health_id');
  1756.         $healthId $request->request->get('health_id') ? $request->request->get('health_id') : '';
  1757.        
  1758.         if ($_ENV['ABHA_ENV'] == 'sandbox') {
  1759.             $abhaSuffix $_ENV['ABHA_SBX_SUFFIX'];
  1760.         } else {
  1761.             $abhaSuffix $_ENV['ABHA_PROD_SUFFIX'];
  1762.         }
  1763.         
  1764.         // Check if the last 4 characters of $healthId match $abhaSuffix
  1765.         if ($healthId) {
  1766.             if (substr($healthId, -strlen($abhaSuffix)) !== $abhaSuffix) {
  1767.                 // Append suffix if it doesn't match
  1768.                 $healthId .= $abhaSuffix;
  1769.             }
  1770.         } else {
  1771.             "";
  1772.         }
  1773.          try {
  1774.             $accessToken $this->getAccessToken();
  1775.             $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1776.             $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1777.             $client HttpClient::create();
  1778.             // dd($accessToken,$isoTimestamp,$healthId);
  1779.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/search', [
  1780.                 'headers' => [
  1781.                     'Authorization' => $accessToken,
  1782.                     'Content-Type' => 'application/json',
  1783.                     'REQUEST-ID: ' $this->GUID(),
  1784.                     'TIMESTAMP: ' $isoTimestamp
  1785.                 ],
  1786.                 'json' => [
  1787.                     'abhaAddress' => $healthId
  1788.                 ]
  1789.             ]);
  1790.             
  1791.             $decodedPayload $response->toArray();
  1792.             
  1793.             if($decodedPayload['status'] == 'ACTIVE'){
  1794.                 return $this->json('invalid');
  1795.             }else{
  1796.                 return $this->json('valid');
  1797.             }
  1798.        
  1799.          } catch (\Exception $e) {
  1800.             
  1801.         if($response->getStatusCode() == '400' ){
  1802.             return $this->json('valid');
  1803.         }else{
  1804.             return $this->json('invalid');
  1805.         }
  1806.          }
  1807.     }
  1808.     // m2 flow start here
  1809.     #[Route('/abha-link'name'abha_link'methods: ['GET''POST'])]
  1810.     public function abhaLink(Request $request): Response
  1811.     {
  1812.         $type $request->request->get('type');
  1813.         $patient_id $request->request->get('patient_id');
  1814.         // check patient id is available
  1815.         if ($patient_id) {
  1816.             $session $request->getSession();  // get session variable from request
  1817.             $session->set('patient_id'$patient_id);  // patient id store in session
  1818.         }
  1819.         // abha address get
  1820.         $abhaDetail $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
  1821.         $readOnly '';
  1822.         if ($abhaDetail != '') {  // abha address is available then readonly mode
  1823.             $readOnly 'readonly';
  1824.         }
  1825.         return $this->render('abha/link_step1.html.twig', [
  1826.             'type' => $type,
  1827.             'readOnly' => $readOnly,
  1828.             'abhaDetail' => $abhaDetail
  1829.         ]);
  1830.     }
  1831.     #[Route('/fetch-mode'name'fetch_mode'methods: ['GET''POST'])]
  1832.     public function fetchMode(Request $request): Response
  1833.     {
  1834.         $abhaAddress $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
  1835.         $type $request->request->get('type') ? $request->request->get('type') : '';
  1836.         // $auth_mode = $request->request->get('auth_mode') ? $request->request->get('auth_mode') : '';
  1837.         if ($_ENV['ABHA_ENV'] == 'sandbox') {
  1838.             $abhaSuffix $_ENV['ABHA_SBX_SUFFIX'];
  1839.         } else {
  1840.             $abhaSuffix $_ENV['ABHA_PROD_SUFFIX'];
  1841.         }
  1842.         
  1843.         // Check if the last 4 characters of $abhaAddress match $abhaSuffix
  1844.         if ($abhaAddress) {
  1845.             if (substr($abhaAddress, -strlen($abhaSuffix)) !== $abhaSuffix) {
  1846.                 // Append suffix if it doesn't match
  1847.                 $abhaAddress .= $abhaSuffix;
  1848.             }
  1849.         } else {
  1850.             "";
  1851.         }
  1852.         
  1853.         
  1854.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1855.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1856.         $client HttpClient::create();
  1857.         try {
  1858.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/search', [
  1859.                 'headers' => [
  1860.                     'Authorization: Bearer ' $this->getAccessToken(),
  1861.                     'Content-Type: application/json',
  1862.                     'REQUEST-ID: ' $this->GUID(),
  1863.                     'TIMESTAMP: ' $isoTimestamp
  1864.                 ],
  1865.                 'json' => [
  1866.                     'abhaAddress' => $abhaAddress
  1867.                 ]
  1868.             ]);
  1869.             $decodedPayload $response->toArray();
  1870.         } catch (\Exception) {
  1871.             $this->addFlash(
  1872.                 'danger',
  1873.                 'Please enter a valid ABHA address.'
  1874.             );
  1875.             return $this->redirectToRoute('abha_link');
  1876.         }
  1877.         $this->addFlash(
  1878.             'success',
  1879.             'ABHA address verified successfully.'
  1880.         );
  1881.         return $this->render('abha/fetch_modes.html.twig', [
  1882.             'abha_details' => $abhaAddress,
  1883.             'type' => $type,
  1884.             'modesArr' => $decodedPayload['authMethods']
  1885.         ]);
  1886.     }
  1887.     #[Route('/post-fetch-mode'name'post_fetch_modes'methods: ['GET''POST'])]
  1888.     public function postFetchMode(Request $request): Response
  1889.     {
  1890.         $fetchMode $request->request->get('fetch_mode');
  1891.         $abhaDetails $request->request->get('abha_details');
  1892.         $type $request->request->get('type');
  1893.         $timer $request->request->get('timer');
  1894.         try {
  1895.             if ($fetchMode == 'MOBILE_OTP') {
  1896.                 $scope = ['abha-address-login''mobile-verify'];
  1897.                 $otpsystem 'abdm';
  1898.             } else {
  1899.                 $scope = ['abha-address-login''aadhaar-verify'];
  1900.                 $otpsystem 'aadhaar';
  1901.             }
  1902.             $encrypted $this->encryptWithPublicKey($abhaDetails);
  1903.             $loginId base64_encode($encrypted);
  1904.             $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1905.             $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1906.             $client HttpClient::create();
  1907.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/request/otp', [
  1908.                 'headers' => [
  1909.                     'Authorization: Bearer ' $this->getAccessToken(),
  1910.                     'Content-Type: application/json',
  1911.                     'REQUEST-ID: ' $this->GUID(),
  1912.                     'TIMESTAMP: ' $isoTimestamp
  1913.                 ],
  1914.                 'json' => [
  1915.                     'txnId' => '',
  1916.                     'scope' => $scope,
  1917.                     'loginHint' => 'abha-address',
  1918.                     'loginId' => $loginId,
  1919.                     'otpSystem' => $otpsystem
  1920.                 ]
  1921.             ]);
  1922.             $decodedPayload $response->toArray();
  1923.             return $this->render('abha/link_step2.html.twig', [
  1924.                 'modes' => $fetchMode,
  1925.                 'type' => $type,
  1926.                 'txn_id' => $decodedPayload['txnId'],
  1927.                 'message' => $decodedPayload['message'],
  1928.                 'abha_details' => $abhaDetails,
  1929.                 'timer' => $timer
  1930.             ]);
  1931.         } catch (\Exception) {
  1932.             // $session->set('type', );
  1933.             // $session->set('otp', $otp);
  1934.             // $session->set('mobile_number', $mobile_number);
  1935.             // $session->set('txnId', $txnId);
  1936.             // $this->addFlash('danger', 'An error occurred while processing your request.');
  1937.             // dd($fetchMode,$type,$abhaDetails);
  1938.             return $this->render('abha/link_step2.html.twig', [
  1939.                 'modes' => $fetchMode,
  1940.                 'timer' => $timer,
  1941.                 'type' => $type,
  1942.                 'txn_id' => '',
  1943.                 'message' => '',
  1944.                 'abha_details' => $abhaDetails,
  1945.             ]);
  1946.             //return $this->redirectToRoute('generate_otp');
  1947.         }
  1948.     }
  1949.     #[Route('/post-fetch-mode-resend'name'post_fetch_modes_resend_otp'methods: ['GET''POST'])]
  1950.     public function postFetchModeResendOtp(Request $request): Response
  1951.     {
  1952.         $fetchMode $request->request->get('modes');
  1953.         $abhaDetails $request->request->get('abha_details');
  1954.         $type $request->request->get('type');
  1955.         if ($fetchMode == 'MOBILE_OTP') {
  1956.             $scope = ['abha-address-login''mobile-verify'];
  1957.             $otpsystem 'abdm';
  1958.         } else {
  1959.             $scope = ['abha-address-login''aadhaar-verify'];
  1960.             $otpsystem 'aadhaar';
  1961.         }
  1962.         $encrypted $this->encryptWithPublicKey($abhaDetails);
  1963.         $loginId = (base64_encode($encrypted));
  1964.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1965.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1966.         $client HttpClient::create();
  1967.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/request/otp', [
  1968.             'headers' => [
  1969.                 'Authorization: Bearer ' $this->getAccessToken(),
  1970.                 'Content-Type: application/json',
  1971.                 'REQUEST-ID: ' $this->GUID(),
  1972.                 'TIMESTAMP: ' $isoTimestamp
  1973.             ],
  1974.             'json' => [
  1975.                 'txnId' => '',
  1976.                 'scope' => $scope,
  1977.                 'loginHint' => 'abha-address',
  1978.                 'loginId' => $loginId,
  1979.                 'otpSystem' => $otpsystem
  1980.             ]
  1981.         ]);
  1982.         $decodedPayload $response->toArray();
  1983.         // dd($fetchMode,$decodedPayload['txnId']);
  1984.         return $this->json([
  1985.             'modes' => $fetchMode,
  1986.             'type' => $type,
  1987.             'txn_id' => $decodedPayload['txnId'],
  1988.             'abha_details' => $abhaDetails,
  1989.         ]);
  1990.     }
  1991.     #[Route(path'/link-verify-otp'name'link_verify_otp'methods: ['GET''POST'])]
  1992.     public function linkVerifyOtp(Request $request): Response
  1993.     {
  1994.         $modes $request->request->get('modes');
  1995.         $abha_details $request->request->get('abha_details');
  1996.         $type $request->request->get('type');
  1997.         $txnId $request->request->get('txn_id');
  1998.         $auth_code $request->request->get('otp');
  1999.         $timer $request->request->get('timer');
  2000.         try {
  2001.             if ($modes == 'MOBILE_OTP') {
  2002.                 $scope = ['abha-address-login''mobile-verify'];
  2003.             } else {
  2004.                 $scope = ['abha-address-login''aadhaar-verify'];
  2005.             }
  2006.             $encrypted $this->encryptWithPublicKey($auth_code);
  2007.             $otpencoded base64_encode($encrypted);
  2008.             $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2009.             $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2010.             $client HttpClient::create();
  2011.             $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/verify', [
  2012.                 'headers' => [
  2013.                     'Authorization: Bearer ' $this->getAccessToken(),
  2014.                     'Content-Type: application/json',
  2015.                     'REQUEST-ID: ' $this->GUID(),
  2016.                     'TIMESTAMP: ' $isoTimestamp
  2017.                 ],
  2018.                 'json' => [
  2019.                     'scope' => $scope,
  2020.                     'authData' => [
  2021.                         'authMethods' => [
  2022.                             'otp'
  2023.                         ],
  2024.                         'otp' => [
  2025.                             'txnId' => $txnId,
  2026.                             'otpValue' => $otpencoded,
  2027.                         ]
  2028.                     ]
  2029.                 ]
  2030.             ]);
  2031.             $decodedPayload $response->toArray();
  2032.             if ($decodedPayload['authResult'] == 'success') {
  2033.                 $this->addFlash(
  2034.                     'success',
  2035.                     $decodedPayload['message']
  2036.                 );
  2037.                 return $this->redirectToRoute('link_abha_profile', ['tokens' => $this->encryptor->encrypt($decodedPayload['tokens']['token']), 'txnId' => $this->encryptor->encrypt($txnId)]);
  2038.             } else {
  2039.                 return $this->render('abha/link_step2.html.twig', [
  2040.                     'modes' => $modes,
  2041.                     'type' => $type,
  2042.                     'txn_id' => $txnId,
  2043.                     'message' => 'The OTP entered is invalid. Please verify and re-enter the correct OTP',
  2044.                     'abha_details' => $abha_details,
  2045.                     'otp' => $auth_code,
  2046.                     'timer' => $timer
  2047.                 ]);
  2048.             }
  2049.         } catch (\Exception) {
  2050.             return $this->render('abha/link_step2.html.twig', [
  2051.                 'modes' => $modes,
  2052.                 'type' => $type,
  2053.                 'txn_id' => $txnId,
  2054.                 'message' => '',
  2055.                 'abha_details' => $abha_details,
  2056.                 'otp' => $auth_code,
  2057.                 'timer' => $timer
  2058.             ]);
  2059.         }
  2060.     }
  2061.     #[Route(path'/link-abha-profile/{tokens}/{txnId}'name'link_abha_profile'methods: ['GET''POST'])]
  2062.     #[ParamDecryptor(["tokens","txnId"])]
  2063.     public function linkAbhaProfile(string $tokensstring $txnId): Response
  2064.     {
  2065.         //dd($tokens,$txnId);
  2066.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2067.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2068.         $client HttpClient::create();
  2069.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha-profile', [
  2070.             'headers' => [
  2071.                 'Authorization: Bearer ' $this->getAccessToken(),
  2072.                 'X-token: Bearer ' $tokens,
  2073.                 'Content-Type: application/json',
  2074.                 'REQUEST-ID: ' $this->GUID(),
  2075.                 'TIMESTAMP: ' $isoTimestamp
  2076.             ],
  2077.             'json' => []
  2078.         ]);
  2079.         $decodedPayload $response->toArray();
  2080.         return $this->render('abha/addressview.html.twig', [
  2081.             'txnId' => $txnId,
  2082.             'type' => '',
  2083.             'message' => '',
  2084.             'tokens' => $tokens,
  2085.             'firstName' => $decodedPayload['firstName'],
  2086.             'middleName' => $decodedPayload['middleName'],
  2087.             'lastName' => $decodedPayload['lastName'],
  2088.             'dob' => $decodedPayload['dateOfBirth'],
  2089.             'gender' => $decodedPayload['gender'],
  2090.             'profilePhoto' => $decodedPayload['profilePhoto'],
  2091.             'mobile' => $decodedPayload['mobile'],
  2092.             'preferredAbhaAddress' => $decodedPayload['abhaAddress'],
  2093.             'address' => $decodedPayload['address'],
  2094.             'pincode' => $decodedPayload['pinCode'],
  2095.             'ABHANumber' => $decodedPayload['abhaNumber'] ?? ''
  2096.         ]);
  2097.     }
  2098.     #[Route(path'/link-abha-profile-new'name'link_abha_profile_new'methods: ['GET''POST'])]
  2099.     public function linkAbhaProfilenew(Request $request): Response
  2100.     {
  2101.         $tokens $request->request->get('tokens');
  2102.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2103.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2104.         $client HttpClient::create();
  2105.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account', [
  2106.             'headers' => [
  2107.                 'Authorization: Bearer ' $this->getAccessToken(),
  2108.                 'X-token: Bearer ' $tokens,
  2109.                 'Content-Type: application/json',
  2110.                 'REQUEST-ID: ' $this->GUID(),
  2111.                 'TIMESTAMP: ' $isoTimestamp
  2112.             ],
  2113.             'json' => []
  2114.         ]);
  2115.         $decodedPayload $response->toArray();
  2116.         $base64Image $decodedPayload['profilePhoto'];
  2117.         $imageUrl 'data:image/jpeg;base64,' $base64Image;
  2118.         $data = [
  2119.             'token' => $decodedPayload['token'] ?? '',
  2120.             'firstName' => $decodedPayload['firstName'] ?? '',
  2121.             'lastName' => $decodedPayload['lastName'] ?? '',
  2122.             'middleName' => $decodedPayload['middleName'] ?? '',
  2123.             'stateCode' => $decodedPayload['stateCode'] ?? '',
  2124.             'mobile' => $decodedPayload['mobile'] ?? '',
  2125.             'gender' => $decodedPayload['gender'] ?? '',
  2126.             'healthIdNumber' => $decodedPayload['ABHANumber'] ?? '',
  2127.             'dayOfBirth' => $decodedPayload['dayOfBirth'] ?? '',
  2128.             'monthOfBirth' => $decodedPayload['monthOfBirth'] ?? '',
  2129.             'yearOfBirth' => $decodedPayload['yearOfBirth'] ?? '',
  2130.             'districtCode' => $decodedPayload['districtCode'] ?? '',
  2131.             'profilePhoto' => $imageUrl ?? '',
  2132.             'address' => $decodedPayload['address'] ?? '',
  2133.             'pincode' => $decodedPayload['pincode'] ?? '',
  2134.             'stateName' => $decodedPayload['stateName'] ?? '',
  2135.             'districtName' => $decodedPayload['districtName'] ?? '',
  2136.             'healthIdAddress' => $decodedPayload['preferredAbhaAddress'] ?? '',
  2137.         ];
  2138.         if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
  2139.             $data['dob'] = $decodedPayload['dayOfBirth'] . '-' $decodedPayload['monthOfBirth'] . '-' $decodedPayload['yearOfBirth'];
  2140.         }
  2141.         $request->getSession()->set('v3data'$data);
  2142.         return $this->redirectToRoute('patient_new');
  2143.     }
  2144.     #[Route(path'/link-abha-profile-address'name'link_abha_profile_address'methods: ['GET''POST'])]
  2145.     public function linkAbhaProfileaddress(Request $request): Response
  2146.     {
  2147.         $tokens $request->request->get('tokens');
  2148.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2149.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2150.         $client HttpClient::create();
  2151.         $response $client->request('GET''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/profile/abha-profile', [
  2152.             'headers' => [
  2153.                 'Authorization: Bearer ' $this->getAccessToken(),
  2154.                 'X-token: Bearer ' $tokens,
  2155.                 'Content-Type: application/json',
  2156.                 'REQUEST-ID: ' $this->GUID(),
  2157.                 'TIMESTAMP: ' $isoTimestamp
  2158.             ],
  2159.             'json' => []
  2160.         ]);
  2161.         $decodedPayload $response->toArray();
  2162.         //    dd($decodedPayload);
  2163.         $base64Image $decodedPayload['profilePhoto'];
  2164.         $imageUrl 'data:image/jpeg;base64,' $base64Image;
  2165.         $data = [
  2166.             'token' => $decodedPayload['token'] ?? '',
  2167.             'firstName' => $decodedPayload['firstName'] ?? '',
  2168.             'lastName' => $decodedPayload['lastName'] ?? '',
  2169.             'middleName' => $decodedPayload['middleName'] ?? '',
  2170.             'stateCode' => $decodedPayload['stateCode'] ?? '',
  2171.             'mobile' => $decodedPayload['mobile'] ?? '',
  2172.             'gender' => $decodedPayload['gender'] ?? '',
  2173.             'healthIdNumber' => $decodedPayload['abhaNumber'] ?? '',
  2174.             'dayOfBirth' => $decodedPayload['dayOfBirth'] ?? '',
  2175.             'monthOfBirth' => $decodedPayload['monthOfBirth'] ?? '',
  2176.             'yearOfBirth' => $decodedPayload['yearOfBirth'] ?? '',
  2177.             'districtCode' => $decodedPayload['districtCode'] ?? '',
  2178.             'profilePhoto' => $imageUrl ?? '',
  2179.             'address' => $decodedPayload['address'] ?? '',
  2180.             'pincode' => $decodedPayload['pinCode'] ?? '',
  2181.             'stateName' =>  '',
  2182.             'districtName' =>  '',
  2183.             'healthIdAddress' => $decodedPayload['abhaAddress'] ?? '',
  2184.         ];
  2185.         if (isset($decodedPayload['dayOfBirth']) && isset($decodedPayload['monthOfBirth']) && isset($decodedPayload['yearOfBirth'])) {
  2186.             $data['dob'] = $decodedPayload['dayOfBirth'] . '-' $decodedPayload['monthOfBirth'] . '-' $decodedPayload['yearOfBirth'];
  2187.         }
  2188.         $request->getSession()->set('v3data'$data);
  2189.         return $this->redirectToRoute('patient_new');
  2190.     }
  2191.     public function getAccessToken()
  2192.     {
  2193.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2194.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2195.         $client HttpClient::create();
  2196.         $response $client->request('POST''https://dev.abdm.gov.in/api/hiecm/gateway/v3/sessions', [
  2197.             'headers' => [
  2198.                 'Content-Type' => 'application/json',
  2199.                 'REQUEST-ID' => $this->GUID(),
  2200.                 'TIMESTAMP' => $isoTimestamp,
  2201.                 'X-CM-ID' => 'sbx',
  2202.             ],
  2203.             'json' => [
  2204.                 'clientId' => $_ENV['CLIENT_ID'],
  2205.                 'clientSecret' => $_ENV['CLIENT_SECRET'],
  2206.                 'grantType' => 'client_credentials'
  2207.             ]
  2208.         ]);
  2209.         $decodedPayload $response->toArray();
  2210.         return 'Bearer ' $decodedPayload['accessToken'];
  2211.     }
  2212.     private function GUID()
  2213.     {
  2214.         return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X'mt_rand(065535), mt_rand(065535), mt_rand(065535), mt_rand(1638420479), mt_rand(3276849151), mt_rand(065535), mt_rand(065535), mt_rand(065535));
  2215.     }
  2216.     private function verifyGoogleRecaptcha($token)
  2217.     {
  2218.         $ip2020 '';
  2219.         if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  2220.             $ip2020 $_SERVER['HTTP_CLIENT_IP'];
  2221.         } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  2222.             $ip2020 $_SERVER['HTTP_X_FORWARDED_FOR'];
  2223.         } else {
  2224.             $ip2020 $_SERVER['REMOTE_ADDR'];
  2225.         }
  2226.         $endpoint 'https://www.google.com/recaptcha/api/siteverify';
  2227.         $secretKey $_ENV['GOOGLE_RECAPTCHA_SECRET_KEY'];
  2228.         $arrParams "secret=$secretKey"&response=$token"&remoteip=$ip2020";
  2229.         $ch = @curl_init();
  2230.         @curl_setopt($chCURLOPT_POSTtrue);
  2231.         @curl_setopt($chCURLOPT_POSTFIELDS$arrParams);
  2232.         @curl_setopt($chCURLOPT_URL$endpoint);
  2233.         @curl_setopt($chCURLOPT_HTTPHEADER, array(
  2234.             'Content-Type: application/x-www-form-urlencoded'
  2235.         ));
  2236.         @curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  2237.         $response = @curl_exec($ch);  // Log the response from HubSpot as needed.
  2238.         @curl_close($ch);
  2239.         return json_decode($responsetrue);
  2240.     }
  2241.     #[Route(path'/resend-otp'name'resend_otp'methods: ['GET''POST'])]
  2242.     public function aadhaarResendOtp(Request $request)
  2243.     {
  2244.         $counter 0;
  2245.         $txnIdSession $request->getSession();
  2246.         $txtId $request->request->get('txnId');
  2247.         $aadharNumber $request->request->get('aadharNumber');
  2248.         // if (!$txtId) {
  2249.         //     return $this->json('invalid');
  2250.         // }
  2251.         $counter $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
  2252.         $dataCounter $txnIdSession->get('session_txnId');
  2253.         if ($dataCounter >= 500) {
  2254.             return throw $this->createNotFoundException('Limit is over');
  2255.         } else {
  2256.             $counter++;
  2257.             $txnIdSession->set('session_txnId'$counter);
  2258.         }
  2259.         $encrypted $this->encryptWithPublicKey($aadharNumber);
  2260.         $loginId = (base64_encode($encrypted));
  2261.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2262.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2263.         $client HttpClient::create();
  2264.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
  2265.             'headers' => [
  2266.                 'Authorization: Bearer ' $this->getAccessToken(),
  2267.                 'Content-Type: application/json',
  2268.                 'REQUEST-ID: ' $this->GUID(),
  2269.                 'TIMESTAMP: ' $isoTimestamp
  2270.             ],
  2271.             'json' => [
  2272.                 'txnId' => '',
  2273.                 'scope' => ['abha-enrol'],
  2274.                 'loginHint' => 'aadhaar',
  2275.                 'loginId' => $loginId,
  2276.                 'otpSystem' => 'aadhaar'
  2277.             ]
  2278.         ]);
  2279.         $txnIdSession->set('session_txnId'0);
  2280.         $decodedPayload $response->toArray();
  2281.         return $this->json($decodedPayload['txnId']);
  2282.     }
  2283.     #[Route(path'/mobile-otp-update'name'mobileOTPupdate'methods: ['GET''POST'])]
  2284.     public function mobileOtpUpdate(Request $request)
  2285.     {
  2286.         $counter 0;
  2287.         $txnIdSession $request->getSession();
  2288.         $txtId $request->request->get('txn_id');
  2289.         $mobileNumber $request->request->get('mobile_number');
  2290.         // if (!$txtId) {
  2291.         //     return $this->json(['txtId' => '', 'type' => 'invalid']);
  2292.         // }
  2293.         $counter $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
  2294.         $dataCounter $txnIdSession->get('session_txnId');
  2295.         if ($dataCounter >= 500) {
  2296.             return throw $this->createNotFoundException('Limit is over');
  2297.         } else {
  2298.             $counter++;
  2299.             $txnIdSession->set('session_txnId'$counter);
  2300.         }
  2301.         $encrypted $this->encryptWithPublicKey($mobileNumber);
  2302.         $mobileEncoded base64_encode($encrypted);
  2303.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2304.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2305.         $client HttpClient::create();
  2306.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
  2307.             'headers' => [
  2308.                 'Authorization: Bearer ' $this->getAccessToken(),
  2309.                 'Content-Type: application/json',
  2310.                 'REQUEST-ID: ' $this->GUID(),
  2311.                 'TIMESTAMP: ' $isoTimestamp
  2312.             ],
  2313.             'json' => [
  2314.                 'txnId' => $txtId,
  2315.                 'scope' => ['abha-enrol''mobile-verify'],
  2316.                 'loginHint' => 'mobile',
  2317.                 'loginId' => $mobileEncoded,
  2318.                 'otpSystem' => 'abdm'
  2319.             ]
  2320.         ]);
  2321.         $decodedPayload $response->toArray();
  2322.         return $this->json(['txn_id' => $decodedPayload['txnId'], 'type' => 'success''mobile_number' => $mobileNumber]);
  2323.     }
  2324.     #[Route(path'/mobile-otp-update-verification'name'mobileOTPupdateverification'methods: ['GET''POST'])]
  2325.     public function mobileOtpUpdateverification(Request $request)
  2326.     {
  2327.         $counter 0;
  2328.         $txnIdSession $request->getSession();
  2329.         $txtId $request->request->get('txn_id');
  2330.         $mobileNumber $request->request->get('mobile_number');
  2331.         $tokens $request->request->get('tokens');
  2332.         // if (!$txtId) {
  2333.         //     return $this->json(['txtId' => '', 'type' => 'invalid']);
  2334.         // }
  2335.         $counter $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
  2336.         $dataCounter $txnIdSession->get('session_txnId');
  2337.         if ($dataCounter >= 500) {
  2338.             return throw $this->createNotFoundException('Limit is over');
  2339.         } else {
  2340.             $counter++;
  2341.             $txnIdSession->set('session_txnId'$counter);
  2342.         }
  2343.         $encrypted $this->encryptWithPublicKey($mobileNumber);
  2344.         $mobileEncoded base64_encode($encrypted);
  2345.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2346.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2347.         $client HttpClient::create();
  2348.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/request/otp', [
  2349.             'headers' => [
  2350.                 'Authorization: Bearer ' $this->getAccessToken(),
  2351.                 'X-token: Bearer ' $tokens,
  2352.                 'Content-Type: application/json',
  2353.                 'REQUEST-ID: ' $this->GUID(),
  2354.                 'TIMESTAMP: ' $isoTimestamp
  2355.             ],
  2356.             'json' => [
  2357.                 'txnId' => $txtId,
  2358.                 'scope' => ['abha-profile''mobile-verify'],
  2359.                 'loginHint' => 'mobile',
  2360.                 'loginId' => $mobileEncoded,
  2361.                 'otpSystem' => 'abdm'
  2362.             ]
  2363.         ]);
  2364.         $decodedPayload $response->toArray();
  2365.         return $this->json(['txn_id' => $decodedPayload['txnId'], 'type' => 'success''mobile_number' => $mobileNumber,
  2366.         'tokens' => $tokens]);
  2367.     }
  2368.     #[Route(path'/generate-mobile-otp-resend'name'mobileOTP'methods: ['GET''POST'])]
  2369.     public function mobileOtp(Request $request)
  2370.     {
  2371.         $counter 0;
  2372.         $txnIdSession $request->getSession();
  2373.         $txtId $request->request->get('txnId');
  2374.         $mobileNumber $request->request->get('mobile_number');
  2375.         // if (!$txtId) {
  2376.         //     return $this->json(['txtId' => '', 'type' => 'invalid']);
  2377.         // }
  2378.         $counter $txnIdSession->has('session_txnId') ? (int) $txnIdSession->get('session_txnId') : 0;
  2379.         $dataCounter $txnIdSession->get('session_txnId');
  2380.         if ($dataCounter >= 500) {
  2381.             return throw $this->createNotFoundException('Limit is over');
  2382.         } else {
  2383.             $counter++;
  2384.             $txnIdSession->set('session_txnId'$counter);
  2385.         }
  2386.         $encrypted $this->encryptWithPublicKey($mobileNumber);
  2387.         $mobileEncoded base64_encode($encrypted);
  2388.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2389.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2390.         $client HttpClient::create();
  2391.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [
  2392.             'headers' => [
  2393.                 'Authorization: Bearer ' $this->getAccessToken(),
  2394.                 'Content-Type: application/json',
  2395.                 'REQUEST-ID: ' $this->GUID(),
  2396.                 'TIMESTAMP: ' $isoTimestamp
  2397.             ],
  2398.             'json' => [
  2399.                 'txnId' => $txtId,
  2400.                 'scope' => ['abha-enrol''mobile-verify'],
  2401.                 'loginHint' => 'mobile',
  2402.                 'loginId' => $mobileEncoded,
  2403.                 'otpSystem' => 'abdm'
  2404.             ]
  2405.         ]);
  2406.         $decodedPayload $response->toArray();
  2407.         return $this->json(['txtId' => $decodedPayload['txnId'], 'type' => 'success''mobile_number' => $mobileNumber]);
  2408.     }
  2409.     #[Route(path'/known-mode'name'known_mode'methods: ['GET''POST'])]
  2410.     public function knownMode(Request $request)
  2411.     {
  2412.         $type $request->request->get('type');
  2413.         $authMode $request->request->get('auth_type');
  2414.         $abhaDetail $request->request->get('abha_details');
  2415.         if ($_ENV['ABHA_ENV'] == 'sandbox') {
  2416.             $abhaSuffix $_ENV['ABHA_SBX_SUFFIX'];
  2417.         } else {
  2418.             $abhaSuffix $_ENV['ABHA_PROD_SUFFIX'];
  2419.         }
  2420.         $abhaAddress $abhaDetail $abhaSuffix;
  2421.         if ($authMode == 'auth_mobile') {
  2422.             $authMode 'MOBILE_OTP';
  2423.         } else {
  2424.             $authMode 'AADHAAR_OTP';
  2425.         }
  2426.         $encrypted $this->encryptWithPublicKey($abhaAddress);
  2427.         $loginId base64_encode($encrypted);
  2428.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2429.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2430.         $client HttpClient::create();
  2431.         $response $client->request('POST''https://abhasbx.abdm.gov.in/abha/api/v3/phr/web/login/abha/request/otp', [
  2432.             'headers' => [
  2433.                 'Authorization: Bearer ' $this->getAccessToken(),
  2434.                 'Content-Type: application/json',
  2435.                 'REQUEST-ID: ' $this->GUID(),
  2436.                 'TIMESTAMP: ' $isoTimestamp
  2437.             ],
  2438.             'json' => [
  2439.                 'txnId' => '',
  2440.                 'scope' => ['abha-address-login''mobile-verify'],
  2441.                 'loginHint' => 'abha-address',
  2442.                 'loginId' => $loginId,
  2443.                 'otpSystem' => 'abdm'
  2444.             ]
  2445.         ]);
  2446.         $statusCode $response->getStatusCode();
  2447.         $content json_decode($response->getContent(), true);
  2448.         $txnId '';
  2449.         if ($statusCode == '200') {  // if api success, get tnx id
  2450.             if (isset($content['message'])) {
  2451.                 $this->addFlash(
  2452.                     'danger',
  2453.                     $content['message']
  2454.                 );
  2455.                 return $this->render('abha/link_step1.html.twig', [
  2456.                     'type' => $type,
  2457.                     'readOnly' => '',
  2458.                     'abhaDetail' => $abhaDetail,
  2459.                 ]);
  2460.             } else {
  2461.                 $txnId = isset($content['txn_id']) ? $content['txn_id'] : '';
  2462.                 return $this->render('abha/otp.html.twig', [
  2463.                     'auth_type' => $authMode == 'MOBILE_OTP' 'Mobile OTP' 'Aadhaar OTP',
  2464.                     'auth_method' => $authMode,
  2465.                     'type' => $type,
  2466.                     'txn_id' => $txnId,
  2467.                     'abha_detail' => $abhaDetail
  2468.                 ]);
  2469.             }
  2470.         } elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '403' || $statusCode == '404' || $statusCode == '422' || $statusCode == '500') {  // if api get error
  2471.             $content $content['message'];
  2472.             if ($statusCode == '422') {
  2473.                 $content = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  2474.             }
  2475.             $this->addFlash(
  2476.                 'danger',
  2477.                 $content
  2478.             );
  2479.             return $this->render('abha/link_step1.html.twig', [
  2480.                 'type' => $type,
  2481.                 'readOnly' => '',
  2482.                 'abhaDetail' => $abhaDetail,
  2483.             ]);
  2484.         }
  2485.         return $this->render('abha/link_step1.html.twig', [
  2486.             'type' => $type,
  2487.             'readOnly' => '',
  2488.             'abhaDetail' => $abhaDetail,
  2489.         ]);
  2490.     }
  2491.     #[Route(path'/known-mode-otp'name'known_mode_otp'methods: ['GET''POST'])]
  2492.     public function knownModeOTP(Request $requestPatientRepository $patientRepoAbha $abha)
  2493.     {
  2494.         $type $request->request->get('type');
  2495.         $txn_id $request->request->get('txn_id');
  2496.         $auth_method $request->request->get('auth_method');
  2497.         $abha_detail $request->request->get('abha_details');
  2498.         $otp $request->request->get('otp');
  2499.         if (!$txn_id || !$type || !$auth_method || !$abha_detail || !$otp) {
  2500.             $this->addFlash(
  2501.                 'danger',
  2502.                 'Please enter valid abha address.'
  2503.             );
  2504.             return $this->render('abha/link_step1.html.twig', [
  2505.                 'type' => $type,
  2506.                 'readOnly' => '',
  2507.                 'abhaDetail' => $abha_detail,
  2508.             ]);
  2509.         }
  2510.         $payload = [
  2511.             'otp' => $otp,
  2512.             'transaction_id' => $txn_id,
  2513.             'auth_method' => $auth_method
  2514.         ];
  2515.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2516.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2517.         $client HttpClient::create();
  2518.         $response $client->request('POST'$_ENV['ABDM_BASE_URL'] . 'data-link/v1-confirm', [
  2519.             'headers' => [
  2520.                 'Content-Type' => 'application/json'
  2521.             ],
  2522.             'json' => $payload
  2523.         ]);
  2524.         $statusCode $response->getStatusCode();
  2525.         $content json_decode($response->getContent(), true);
  2526.         if ($statusCode == '200') {  // if api success, get tnx id
  2527.             if (isset($content['message'])) {
  2528.                 $this->addFlash(
  2529.                     'danger',
  2530.                     $content['message']
  2531.                 );
  2532.                 return $this->render('abha/link_step1.html.twig', [
  2533.                     'type' => $type,
  2534.                     'readOnly' => '',
  2535.                     'abhaDetail' => $abha_detail,
  2536.                 ]);
  2537.             } else {
  2538.                 $profilePayload = [
  2539.                     'token' => $content['token']
  2540.                 ];
  2541.                 $profileResponse $client->request('POST'$_ENV['ABDM_BASE_URL'] . 'data-link/get-profile', [
  2542.                     'headers' => [
  2543.                         'Content-Type' => 'application/json'
  2544.                     ],
  2545.                     'json' => $profilePayload
  2546.                 ]);
  2547.                 $profileStatusCode $profileResponse->getStatusCode();
  2548.                 $profileContent json_decode($profileResponse->getContent(), true);
  2549.                 if ($profileStatusCode == '200') {
  2550.                     $session $request->getSession();
  2551.                     $updateData $abha->getUserDetails($content);
  2552.                     if ($request->request->get('type') == 'reg') {
  2553.                         return $this->redirectToRoute('patient_new', ['dataLink' => $updateData]);
  2554.                     } else if ($request->request->get('type') == 'case') {
  2555.                         $patientRepo->updateAbhaDetails($updateData$session->get('patient_id'));
  2556.                         return $this->redirectToRoute('case_new', ['patient_id' => $session->get('patient_id')]);
  2557.                     }
  2558.                 } elseif ($profileStatusCode == '400' || $profileStatusCode == '401' || $profileStatusCode == '403' || $profileStatusCode == '404' || $profileStatusCode == '422' || $profileStatusCode == '500') {
  2559.                     $profileContent $profileContent['message'];
  2560.                     if ($profileStatusCode == '422') {
  2561.                         $profileContent = isset($profileContent['message']) ? $profileContent['message'] : 'Unable to process the current request due to incorrect data entered';
  2562.                     }
  2563.                     $this->addFlash(
  2564.                         'danger',
  2565.                         $profileContent
  2566.                     );
  2567.                     return $this->render('abha/link_step1.html.twig', [
  2568.                         'type' => $type,
  2569.                         'readOnly' => '',
  2570.                         'abhaDetail' => $abha_detail,
  2571.                     ]);
  2572.                 }
  2573.             }
  2574.         } elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '403' || $statusCode == '404' || $statusCode == '422' || $statusCode == '500') {  // if api get error
  2575.             $content $content['message'];
  2576.             if ($statusCode == '422') {
  2577.                 $content = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  2578.             }
  2579.             $this->addFlash(
  2580.                 'danger',
  2581.                 $content
  2582.             );
  2583.             return $this->render('abha/link_step1.html.twig', [
  2584.                 'type' => $type,
  2585.                 'readOnly' => '',
  2586.                 'abhaDetail' => $abha_detail,
  2587.             ]);
  2588.         }
  2589.         return $this->render('abha/link_step1.html.twig', [
  2590.             'type' => $type,
  2591.             'readOnly' => '',
  2592.             'abhaDetail' => $abha_detail,
  2593.         ]);
  2594.         if ($request->request->get('type') == 'case') {
  2595.             return $this->redirectToRoute('case_new');
  2596.         }
  2597.         if ($request->isMethod('POST') && !empty($request->request->get('otp'))) {
  2598.             return $this->redirectToRoute('patient_new');
  2599.         }
  2600.     }
  2601.     #[Route('/abha-init'name'abha_init'methods: ['GET''POST'])]
  2602.     public function abhaInit(Request $requestPatientRepository $patientRepoAbha $abha): Response
  2603.     {
  2604.         $abhaAddress $request->request->get('abha_details');
  2605.         $type $request->request->get('type');
  2606.         $patientId $request->request->get('patientId');
  2607.         $name $request->request->get('name');
  2608.         $gender $request->request->get('gender');
  2609.         $dob $request->request->get('dob');
  2610.         $mobile $request->request->get('mobile');
  2611.         $profileId $request->request->get('profile_shared_id');
  2612.         if ($_ENV['ABHA_ENV'] == 'sandbox') {
  2613.             $abhaSuffix $_ENV['ABHA_SBX_SUFFIX'];
  2614.         } else {
  2615.             $abhaSuffix $_ENV['ABHA_PROD_SUFFIX'];
  2616.         }
  2617.         if (!strpos($abhaAddress$abhaSuffix) !== false) {
  2618.             $abhaAddress $abhaAddress $abhaSuffix;
  2619.         }
  2620.         if ($type != 'case' && $patientId != '0' && $patientId != '') {
  2621.             $this->addFlash(
  2622.                 'danger',
  2623.                 'Currently server is busy, please try after sometime.'
  2624.             );
  2625.             return $this->render('abha/fetch_modes.html.twig', [
  2626.                 'abha_details' => $abhaAddress,
  2627.                 'type' => $type,
  2628.                 'modesArr' => ''
  2629.             ]);
  2630.         }
  2631.         if (!$abhaAddress || !$type) {
  2632.             $this->addFlash(
  2633.                 'danger',
  2634.                 'Please enter valid abha address.'
  2635.             );
  2636.             return $this->render('abha/fetch_modes.html.twig', [
  2637.                 'abha_details' => $abhaAddress,
  2638.                 'type' => $type,
  2639.                 'modesArr' => ''
  2640.             ]);
  2641.         }
  2642.         // define hip code and get hip id from hospital table
  2643.         $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  2644.         // create the payload for fetch mode api
  2645.         $payload = [
  2646.             'id' => $abhaAddress,
  2647.             'hip_id' => $hipCode,
  2648.             'auth_mode' => 'DEMOGRAPHICS',
  2649.         ];
  2650.         // call api for init
  2651.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2652.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2653.         $client HttpClient::create();
  2654.         $header = [
  2655.             'Content-Type' => 'application/json',
  2656.         ];
  2657.         $response $client->request('POST'$_ENV['ABDM_BASE_URL'] . 'data-link/init', [
  2658.             'headers' => $header,
  2659.             'json' => $payload
  2660.         ]);
  2661.         $statusCode $response->getStatusCode();
  2662.         $content json_decode($response->getContent(), true);
  2663.         if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
  2664.             $message $content['message'];
  2665.             if ($statusCode == '422') {
  2666.                 $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  2667.             }
  2668.             $this->addFlash(
  2669.                 'danger',
  2670.                 $message
  2671.             );
  2672.             return $this->redirectToRoute('abha_init');
  2673.         } elseif ($statusCode == '202') {
  2674.             if (isset($content['message'])) {
  2675.                 $this->addFlash(
  2676.                     'danger',
  2677.                     $content['message']
  2678.                 );
  2679.                 return $this->redirectToRoute('abha_init');
  2680.             }
  2681.             if ($request->request->get('gender') == 'Male') {
  2682.                 $gender 'M';
  2683.             } elseif ($request->request->get('gender') == 'Female') {
  2684.                 $gender 'F';
  2685.             } elseif ($request->request->get('gender') == 'Other') {
  2686.                 $gender 'O';
  2687.             }
  2688.             $payload = [
  2689.                 'transaction_id' => $content['txn_id'],
  2690.                 'modes' => 'DEMOGRAPHICS',
  2691.                 'name' => $name,
  2692.                 'gender' => $gender,
  2693.                 'dob' => date('Y-m-d'strtotime($dob)),
  2694.                 'mobile' => $mobile,
  2695.             ];
  2696.             $header = [
  2697.                 'Content-Type' => 'application/json',
  2698.             ];
  2699.             $now = new \DateTime('now', new \DateTimeZone('UTC'));
  2700.             $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  2701.             $client HttpClient::create();
  2702.             $response $client->request('POST'$_ENV['ABDM_BASE_URL'] . 'data-link/confirm', [
  2703.                 'headers' => $header,
  2704.                 'json' => $payload
  2705.             ]);
  2706.             $content json_decode($response->getContent(), true);
  2707.             $contentArr $abha->getUserDetails($content);
  2708.             $conn $this->doctrine->getConnection('cnmgts');
  2709.             $conn->delete('cnmgts_abha_profile_share', ['id' => $profileId]);
  2710.             if ($type == 'reg') {
  2711.                 return $this->redirectToRoute('patient_new', ['dataLink' => $contentArr]);
  2712.             } elseif ($type == 'case') {
  2713.                 if ($patientId) {
  2714.                     $patientRepo->updateAbhaDetails($contentArr$patientId);
  2715.                     return $this->redirectToRoute('case_new', ['patient_id' => $patientId]);
  2716.                 } else {
  2717.                     return $this->redirectToRoute('patient_new', ['dataLink' => $contentArr]);
  2718.                 }
  2719.             }
  2720.         } else {
  2721.             return $this->redirectToRoute('patient_search_with_abha');
  2722.         }
  2723.     }
  2724.     private function loadPublicKeyText(): string
  2725.     {
  2726.         return <<<EOD
  2727.             -----BEGIN PUBLIC KEY-----
  2728.             MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAstWB95C5pHLXiYW59qyO
  2729.             4Xb+59KYVm9Hywbo77qETZVAyc6VIsxU+UWhd/k/YtjZibCznB+HaXWX9TVTFs9N
  2730.             wgv7LRGq5uLczpZQDrU7dnGkl/urRA8p0Jv/f8T0MZdFWQgks91uFffeBmJOb58u
  2731.             68ZRxSYGMPe4hb9XXKDVsgoSJaRNYviH7RgAI2QhTCwLEiMqIaUX3p1SAc178ZlN
  2732.             8qHXSSGXvhDR1GKM+y2DIyJqlzfik7lD14mDY/I4lcbftib8cv7llkybtjX1Aayf
  2733.             Zp4XpmIXKWv8nRM488/jOAF81Bi13paKgpjQUUuwq9tb5Qd/DChytYgBTBTJFe7i
  2734.             rDFCmTIcqPr8+IMB7tXA3YXPp3z605Z6cGoYxezUm2Nz2o6oUmarDUntDhq/PnkN
  2735.             ergmSeSvS8gD9DHBuJkJWZweG3xOPXiKQAUBr92mdFhJGm6fitO5jsBxgpmulxpG
  2736.             0oKDy9lAOLWSqK92JMcbMNHn4wRikdI9HSiXrrI7fLhJYTbyU3I4v5ESdEsayHXu
  2737.             iwO/1C8y56egzKSw44GAtEpbAkTNEEfK5H5R0QnVBIXOvfeF4tzGvmkfOO6nNXU3
  2738.             o/WAdOyV3xSQ9dqLY5MEL4sJCGY1iJBIAQ452s8v0ynJG5Yq+8hNhsCVnklCzAls
  2739.             IzQpnSVDUVEzv17grVAw078CAwEAAQ==
  2740.             -----END PUBLIC KEY-----
  2741.             EOD;
  2742.     }
  2743.     private function encryptWithPublicKey(string $str): string
  2744.     {
  2745.         $text $this->loadPublicKeyText();
  2746.         try {
  2747.             $publicKey PublicKeyLoader::loadPublicKey($text);
  2748.         } catch (\phpseclib3\Exception\NoKeyLoadedException $e) {
  2749.             throw new \Exception('Error loading key!');
  2750.         }
  2751.         $encrypted $publicKey
  2752.             ->withPadding(RSA::ENCRYPTION_OAEP)
  2753.             ->withHash('sha1')
  2754.             ->withMGFHash('sha1')
  2755.             ->encrypt($str);
  2756.         return $encrypted;
  2757.     }
  2758.     private function currentIsoTimestamp(): string
  2759.     {
  2760.         //return (new \DateTime())->format('Y-m-d\TH:i:s.u\Z');
  2761.         return (new \DateTime('now', new \DateTimeZone('UTC')))->format('Y-m-d\TH:i:s.u\Z');
  2762.     }
  2763. }