HEX
Server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips PHP/5.6.40
System: Linux ip-172-31-40-18 4.14.146-93.123.amzn1.x86_64 #1 SMP Tue Sep 24 00:45:23 UTC 2019 x86_64
User: apache (48)
PHP: 5.6.40
Disabled: NONE
Upload Files
File: /var/www/html/nt/application/controllers/frontend/Application.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

require_once APPPATH . "third_party/razorpay-php/Razorpay.php";

use Razorpay\Api\Api;
use Razorpay\Api\Errors\SignatureVerificationError;

class Application extends CI_Controller
{

	public function __construct()
	{
		parent::__construct();
		//if ($this->session->userdata('logged_in') && $this->session->userdata('user_type') == 'frontend') {
			$this->load->model(array('mcommon', 'frontend/query', 'frontend/mapplication'));
			$this->load->helper(array('otp', 'sms', 'email', 'crypto'));
		/*} else {
			redirect(base_url());
		}*/
	}
	
	public function submitApplication()
	{
		$data = array();
		$insertData = array();
		
		if($this->input->post()){
			$this->form_validation->set_rules('entity_name','Name of Entity','trim|required');
			$this->form_validation->set_rules('entity_phone','Phone Number','trim|required|numeric|min_length[10]|max_length[10]');
			$this->form_validation->set_rules('entity_email','Email','trim|required|valid_email');
			$this->form_validation->set_rules('unit_within_industrial_park', 'Is the occupied unit within Industrial park', 'trim|required|in_list[Yes,No]');
			$this->form_validation->set_rules('memo_reference_no','Memo/Reference Number','trim|required');
			$this->form_validation->set_rules('memo_date','Date','trim|required');
			$this->form_validation->set_rules('amount', 'Amount', 'trim|required|numeric');
			$this->form_validation->set_rules('termsCheck', 'Terms', 'trim|required');
			
			if ($this->form_validation->run() == FALSE) {
				
				$errors = array(
					'entity_name' => form_error('entity_name', '<p class="mt-3 text-danger">', '</p>'),
					'unit_within_industrial_park' => form_error('unit_within_industrial_park', '<p class="mt-3 text-danger">', '</p>'),
					'memo_reference_no' => form_error('memo_reference_no', '<p class="mt-3 text-danger">', '</p>'),
					'memo_date' => form_error('memo_date', '<p class="mt-3 text-danger">', '</p>'),
					'amount' => form_error('amount', '<p class="mt-3 text-danger">', '</p>'),
					'termsCheck' => form_error('termsCheck', '<p class="mt-3 text-danger">', '</p>')
				);
				
				$this->session->set_flashdata('error_msg', validation_errors());
				redirect(base_url());

			}
			else{
				if($this->input->post('amount') > 0){
					$insertData['application_date'] = date('Y-m-d H:i:s');
					$insertData['entity_name'] = $this->input->post('entity_name');
					$insertData['entity_phone'] = $this->input->post('entity_phone');
					$insertData['entity_email'] = $this->input->post('entity_email');
					$insertData['unit_within_industrial_park'] = $this->input->post('unit_within_industrial_park');
					//$insertData['industrial_park_id'] = $this->input->post('industrial_park_id');
					$insertData['industrial_park'] = $this->input->post('industrial_park');
					$insertData['unit_without_ind_park_detail'] = $this->input->post('unit_without_ind_park_detail');
					$insertData['memo_reference_no'] = $this->input->post('memo_reference_no');
					$insertData['memo_date'] = date('Y-m-d', strtotime($this->input->post('memo_date')));
					$insertData['amount'] = $this->input->post('amount');
					$insertData['created_at'] = date('Y-m-d H:i:s');
					
					$result = $this->mcommon->insert('application', $insertData);
					if($result){
						$application_no = 'WBIDC-'.str_pad($result,5,"0",STR_PAD_LEFT);
					
						$update = $this->mcommon->update('application', array('application_id' => $result), array('application_no' => $application_no));
						
						redirect("frontend/application/payment_initiate/".base64_encode($this->encryption->encrypt(serialize(array('application_id' => $result)))));
					} else {
						$this->session->set_flashdata('error_msg', 'Something is Wrong. Try Again.');
						redirect(base_url());
					}
				}
				else {
					$this->session->set_flashdata('error_msg', 'Please enter a valid amount & try again.');
					redirect(base_url());
				}
			}
		}
		
    }
	
	public function payment_initiate($param1)
	{
		$post_fields = array();
		$det_arr = unserialize($this->encryption->decrypt(base64_decode($param1)));
		$application_detail = $this->mcommon->getRow('application', array('application_id' => $det_arr['application_id']));
		
		//echo '<pre>'; print_r($ticket_detail); die;
		
		$payable_amount = $application_detail['amount'];
		
		$post_fields['entity_name'] = $application_detail['entity_name'];
		$post_fields['email'] = $application_detail['entity_email'];
		$post_fields['phone'] = $application_detail['entity_phone'];
		$post_fields['amount'] = $payable_amount;
		$post_fields['currency'] = "INR";
		$post_fields['receipt_id'] = substr(hash('sha256', rand_string(6) . microtime()), 0, 20);
		$post_fields['callback_url'] 	= base_url('frontend/application/paymentSuccess');
		$post_fields['cancel_url'] 	= base_url('frontend/application/paymentFailure');
		$post_fields['checkout_url'] 	= RAZORPAY_CHECKOUT_URL;
		$post_fields['key_id'] = RAZORPAY_KEY;
		
		
		$params1 = array();
		$params1['amount'] = $payable_amount;
		$params1['currency'] = $post_fields['currency'];
		$params1['receipt_id'] = $post_fields['receipt_id'];
		$params1['user_name'] = ucwords($application_detail['entity_name']);
		$params1['email'] = $application_detail['entity_email'];
		$params1['phone'] = $application_detail['entity_phone'];
		
		$razorpay_returnvalue = $this->genRazorpayPayment($params1);
		$razorpay_order_id = $razorpay_returnvalue["order_id"];
		
		$post_fields['order_id'] = $razorpay_returnvalue["order_id"];
		
		//echo $razorpay_order_id; die;
		
		if($razorpay_order_id != ''){
			$this->db->trans_start();
	
			$payment_data = array(
				'application_id' => $application_detail['application_id'],
				'payment_date' => date('Y-m-d H:i:s'),
				'txnid' => $post_fields['receipt_id'],
				'order_id' => $razorpay_order_id,
				'razorpay_payment_id' => NULL,
				'amount' => $payable_amount,
				'payment_mode' => '',
				'remarks' => '',
				'status' => 'PENDING',
				'created_ts' => date('Y-m-d H:i:s'),
			);
			$payment_id = $this->mcommon->insert('payment_info', $payment_data);
	
			$txn_data = $this->mcommon->update('application', array('application.application_id' => $application_detail['application_id']), array('application.txnid' => $post_fields['receipt_id'], 'application.order_id' => $razorpay_order_id));
	
			$this->db->trans_complete();
			
			$data['razorpaydata'] = $post_fields;
			$data['content'] = 'frontend/payment/application_payment';
			$this->load->view('frontend/layouts/index', $data);
		}

	}
	
	public function genRazorpayPayment($option)
	{
		$keyId = RAZORPAY_KEY;
		$keySecret = RAZORPAY_KEY_SECRET;

		$api = new Api($keyId, $keySecret);

		$recipt_id = $option['receipt_id'];
		$order_currencey = $option['currency'];
		$amount = $option['amount'];
		$user = $option['user_name'];

		$orderData = array(
			'receipt'         => $recipt_id,
			'amount'          => $amount * 100, // rupees in paise
			'currency'        => $order_currencey,
			'payment_capture' => 1 // auto capture
		);
		$razorpayOrder = $api->order->create($orderData);
		$razorpayOrderId = $razorpayOrder['id'];
		
		//echo "<pre>"; print_r($razorpayOrder); die;

		$payable_amount = $orderData['amount'];
		$data = array(
			"key"               => $keyId,
			"amount"            => $payable_amount,
			"image"             => base_url()."public/frontend_assets/assets/images/wbidc-logo.png",
			"prefill"           => array(
				"name"              => $user,
				"email"             => $option['email'],
				"contact"           => $option['phone'],
			),

			"theme"             => array(
				"color"             => "#F37254"
			),
			"order_id"          => $razorpayOrderId,
		);

		return $data;

	}
	
	public function paymentSuccess(){
		$success = false;
		$razorpay_posted_data = $this->input->post();
		$razorpay_posted_data['keyId'] = RAZORPAY_KEY;
		$razorpay_posted_data['keySecret'] = RAZORPAY_KEY_SECRET;
		
		//echo "<pre>"; print_r($razorpay_posted_data); die;
		
		$api = new Api($razorpay_posted_data['keyId'], $razorpay_posted_data['keySecret']);
		
		$applicationData = $this->mcommon->getRow('application', array('order_id' => $razorpay_posted_data['razorpay_order_id']));
		
		if(!empty($applicationData)){
			
			if($razorpay_posted_data['razorpay_payment_id'] != '' && $razorpay_posted_data['razorpay_order_id'] != ''){
			
				$generated_signature = hash_hmac('sha256', $applicationData['order_id'] ."|". $razorpay_posted_data['razorpay_payment_id'], $razorpay_posted_data['keySecret']);
				
				if($generated_signature == $razorpay_posted_data['razorpay_signature']){
					try {
						// Please note that the razorpay order ID must
						// come from a trusted source (session here, but
						// could be database or something else)
						$attributes = array(
							'razorpay_order_id' => $razorpay_posted_data['razorpay_order_id'],
							'razorpay_payment_id' => $razorpay_posted_data['razorpay_payment_id'],
							'razorpay_signature' => $razorpay_posted_data['razorpay_signature']
						);
						
						//print_r($attributes); die;
			
						$api->utility->verifyPaymentSignature($attributes);
						$success = true;
					} catch (SignatureVerificationError $e) {
						$success = false;
						$error = 'Razorpay Error : ' . $e->getMessage();
					}
				}
				
				if ($success === true) {
					$this->mcommon->update('payment_info', array('payment_info.order_id' => $razorpay_posted_data['razorpay_order_id']), array('payment_info.razorpay_payment_id' => $razorpay_posted_data['razorpay_payment_id'], 'razorpay_signature' => $razorpay_posted_data['razorpay_signature']));
					
					$param = array();
					$param['payment_id'] = $razorpay_posted_data['razorpay_payment_id'];
					$param['order_id'] = $razorpay_posted_data['razorpay_order_id'];
					$check_payment_status = $this->application_payment_verify($param);
					
					//echo "<pre>"; print_r($check_payment_status); die;
					
					if($check_payment_status['rtn'] === true){
						$data['redirect'] = base_url('frontend/application/application_payment_complete/' . base64_encode($this->encryption->encrypt(serialize(array('status' => 'SUCCESS', 'payment_status' => $check_payment_status['status'], 'order_id' => $razorpay_posted_data['razorpay_order_id'])))));
						$data['content'] = 'frontend/payment/application_payment_confirmation';
						$this->load->view('frontend/layouts/index', $data);
					}
					else{
						$data['redirect'] = base_url('frontend/application/application_payment_complete/' . base64_encode($this->encryption->encrypt(serialize(array('status' => 'FAILURE', 'payment_status' => $check_payment_status['status'], 'order_id' => $razorpay_posted_data['razorpay_order_id'])))));
						$data['content'] = 'frontend/payment/application_payment_confirmation';
						$this->load->view('frontend/layouts/index', $data);
					}
				} else {
					$data['redirect'] = base_url('frontend/application/application_payment_complete/' . base64_encode($this->encryption->encrypt(serialize(array('status' => 'FAILURE', 'payment_status' => $check_payment_status['status'], 'order_id' => $razorpay_posted_data['razorpay_order_id'])))));
					$data['content'] = 'frontend/payment/application_payment_confirmation';
					$this->load->view('frontend/layouts/index', $data);
				}
			
			}
			else {
				//echo "<pre>"; print_r($razorpay_posted_data['error']); die;
				$responseMetadata = json_decode($razorpay_posted_data['error']['metadata'], true);
				//echo $responseMetadata['payment_id']; die;
				$this->mcommon->update('payment_info', array('order_id' => $responseMetadata['order_id']), array('razorpay_payment_id' => $responseMetadata['payment_id']));
				
				$data['redirect'] = base_url('frontend/application/application_payment_complete/' . base64_encode($this->encryption->encrypt(serialize(array('status' => 'FAILURE', 'payment_status' => $check_payment_status['status'], 'order_id' => $responseMetadata['order_id'])))));
				$data['content'] = 'frontend/payment/application_payment_confirmation';
				$this->load->view('frontend/layouts/index', $data);
			}
		}
		else {
			//echo "<pre>"; print_r($razorpay_posted_data['error']); die;
			$responseMetadata = json_decode($razorpay_posted_data['error']['metadata'], true);
			//echo $responseMetadata['payment_id']; die;
			$this->mcommon->update('payment_info', array('order_id' => $responseMetadata['order_id']), array('razorpay_payment_id' => $responseMetadata['payment_id']));
				
			$data['redirect'] = base_url('frontend/application/application_payment_complete/' . base64_encode($this->encryption->encrypt(serialize(array('status' => 'FAILURE', 'payment_status' => $check_payment_status['status'], 'order_id' => $responseMetadata['order_id'])))));
			$data['content'] = 'frontend/payment/application_payment_confirmation';
			$this->load->view('frontend/layouts/index', $data);
		}
	}
	
	public function paymentFailure(){
		
		$razorpay_posted_data = $this->input->post();
		
		//echo "<pre>"; print_r($razorpay_posted_data['error']); die;
		$responseMetadata = json_decode($razorpay_posted_data['error']['metadata'], true);
		//echo $responseMetadata['payment_id']; die;
		$this->mcommon->update('payment_info', array('order_id' => $responseMetadata['order_id']), array('razorpay_payment_id' => $responseMetadata['payment_id']));
			
		$data['redirect'] = base_url('frontend/application/application_payment_complete/' . base64_encode($this->encryption->encrypt(serialize(array('status' => 'FAILURE', 'payment_status' => $check_payment_status['status'], 'order_id' => $responseMetadata['order_id'])))));
		$data['content'] = 'frontend/payment/application_payment_confirmation';
		$this->load->view('frontend/layouts/index', $data);
	}
	
	public function application_payment_complete($value1)
	{
		if (is_null($value1))
			redirect(base_url());

		$det = unserialize($this->encryption->decrypt(base64_decode($value1)));

		$data['status'] = $det['status'];
		$data['payment_status'] = $det['payment_status'];
		//$data['payment'] = $det['posted_data'];
		$data['application_det'] = $this->mapplication->get_application_payment_info(array('payment_info.order_id' => $det['order_id']));
		
		if(strtolower($data['application_det']['status']) == 'failure'){ 
			//$this->mbooking->move_booking_to_failed($det['booking_id']);
		}

		$data['content'] = 'frontend/payment/application_payment_complete';
		$this->load->view('frontend/layouts/index', $data);
	}
	
	public function application_payment_verify($option){
		$return  = array();
		$keyId = RAZORPAY_KEY;
		$keySecret = RAZORPAY_KEY_SECRET;

		$api = new Api($keyId, $keySecret);
		
		try {
			// Fetch order details
			$order = $api->order->fetch($option['order_id'])->payments();
			//echo $order->items[0]->id;
			//echo "<pre>"; print_r($order); die;
			// Fetch payment ID from order
			$payment_id = $order->items[0]->id;
			
			// Capture the payment
			$payment = $api->payment->fetch($payment_id);
			$getPaymentData = $this->mcommon->getRow('payment_info', array('order_id' => $option['order_id']));
			$capturedAmount = ($payment->amount / 100);
			//echo "<pre>"; print_r($payment); die;
			//$payJson = json_encode(serialize($payment));
			//$payObject = unserialize(json_decode($payJson));
		
			/*echo "Payment ID: " . $payment->id . "\n";
			echo "Amount Captured: " . $payment->amount . "\n";
			echo "Status: " . $payment->status . "\n";
			echo "Captured: " . $payment->captured . "\n";
			echo "method: " . $payment->method . "\n";
			echo "email: " . $payment->email . "\n";
			echo "contact: " . $payment->contact . "\n";
			echo "created_at: " . date('m/d/Y H:i:s', $payment->created_at) . "\n";
			echo "auth_code: " . $payment->acquirer_data->auth_code . "\n";*/
			
			if(!empty($payment)){
				if(($payment->status == 'captured' && $payment->captured == 1) && ($payment->order_id != '') && ($getPaymentData['amount'] == $capturedAmount)){ //Success Payment
					$payment_data = array(
						'payment_date' => date('Y-m-d H:i:s', $payment->created_at),
						'razorpay_payment_id' => $payment->id,
						'payment_mode' => $payment->method,
						'payee_email' => $payment->email,
						'payee_contact' => $payment->contact,
						'remarks' => 'Payment Successful',
						'status' => ucwords($payment->status),
						'updated_ts' => date('Y-m-d H:i:s'),
					);
					
					if($option['type'] == 'Cron'){
						$payment_data['cronjob_data'] = json_encode(serialize($payment));
						$payment_data['cronjob_status'] = 'COMPLETED';
						$payment_data['cronjob_end_time'] = date('Y-m-d H:i:s');
					} else{
						$payment_data['response_txt'] = json_encode(serialize($payment));
					}
					
					$update = $this->mcommon->update('payment_info', array('order_id' => $payment->order_id), $payment_data);
					if($update){
						$return['status'] = $payment->status;
						$return['rtn'] = true;
						return $return;
					}
				}
				else{ //Failed Payment
					$payment_data = array(
						'payment_date' => date('Y-m-d H:i:s', $payment->created_at),
						'razorpay_payment_id' => $payment->id,
						'response_txt' => json_encode(serialize($payment)),
						'remarks' => 'Payment Failed',
						'status' => ucwords($payment->status),
						'updated_ts' => date('Y-m-d H:i:s'),
					);
					
					$update = $this->mcommon->update('payment_info', array('order_id' => $payment->order_id), $payment_data);
					if($update){
						if($option['type'] == 'Cron'){
							if($getPaymentData['payment_mode'] == 'NEFT'){//for NEFT mode
								$start_date = strtotime($payment->created_ts);
								$end_date = strtotime("+8 day", $start_date);
								$last_date = date('Y-m-d', $end_date);
										
								if((date('Y-m-d') > $last_date) && ($payment->status != 'captured')){
									$application_failed_det = $this->mapplication->update_application_to_failed($payment->order_id);
								}
							}
							else{//for others mode
								
								if (((strtotime(date('Y-m-d H:i:s')) - strtotime($getPaymentData['created_ts'])) > 1020) && ($payment->status != 'captured')) {
									$application_failed_det = $this->mapplication->update_application_to_failed($payment->order_id);
								}
							}
						}
						
						$return['status'] = $payment->status;
						return $return;
					}
				}
			}
			else{
				
				if($option['type'] == 'Cron'){
					if($getPaymentData['payment_mode'] == 'NEFT'){//for NEFT mode
						$start_date = strtotime($getPaymentData['created_ts']);
						$end_date = strtotime("+8 day", $start_date);
						$last_date = date('Y-m-d', $end_date);
								
						if(date('Y-m-d') > $last_date){
							$application_failed_det = $this->mapplication->update_application_to_failed($option['order_id']);
						}
					}
					else{//for others mode
						
						if (((strtotime(date('Y-m-d H:i:s')) - strtotime($getPaymentData['created_ts'])) > 1020)) {
							$application_failed_det = $this->mapplication->update_application_to_failed($option['order_id']);
						}
					}
				}
				
				$return['status'] = 'Payment Not Found';
				$return['rtn'] = false;
				return $return;
			}
			
		} catch (Exception $e) {
			if($option['type'] == 'Cron'){
				if($getPaymentData['payment_mode'] == 'NEFT'){//for NEFT mode
					$start_date = strtotime($getPaymentData['created_ts']);
					$end_date = strtotime("+8 day", $start_date);
					$last_date = date('Y-m-d', $end_date);
							
					if(date('Y-m-d') > $last_date){
						$application_failed_det = $this->mapplication->update_application_to_failed($option['order_id']);
					}
				}
				else{//for others mode
					
					if (((strtotime(date('Y-m-d H:i:s')) - strtotime($getPaymentData['created_ts'])) > 1020)) {
						$application_failed_det = $this->mapplication->update_application_to_failed($option['order_id']);
					}
				}
			}
			
			// Handle any exceptions that occur during the capture process
			$error = "Error capturing payment: " . $e->getMessage();
			$return['status'] = $error;
			$return['rtn'] = false;
			return $return;
		}
	
	}
	
	public function applicationPaymentVerifyCron(){
		$param = array();
		$payments = $this->mcommon->getDetails('payment_info', array("status IN ('PENDING','NOT-FOUND','FAILURE', 'Failure', 'FAILED','AWAITED','INITIATED','UNSUCCESSFUL','Aborted', 'TIMEOUT', 'Failed', 'Created')" => NULL));
		//$payments = $this->mcommon->getDetails('payment_info', array('payment_id' => 46));
		if(!empty($payments)){
			foreach($payments as $payment){
				if($payment['order_id'] != ''){
					$cron_det = $this->mcommon->update('payment_info', array('order_id' => $payment['order_id']), array('cronjob_start_time' => date('Y-m-d H:i:s')));
					$param['payment_id'] = $payment['razorpay_payment_id'];
					$param['order_id'] = $payment['order_id'];
					$param['type'] = 'Cron';
					$check_app_payment_status = $this->application_payment_verify($param);
					if($check_app_payment_status){
						$cron_status = "Update Successful for ORDER ID: " . $payment['order_id'];
					}
				}
				else{
					$cron_status = "No Payment ID found";
				}
				
				$add_data = $this->mcommon->insert('activity_log', array('log_datetime' => date('Y-m-d H:i:s'), 'process_name' => 'application-payment-verify-cron', 'log_desc' => $cron_status));
				echo $cron_status . "<br>";
			}
		}else{
			$cron_status .= " No Pending transactions found.";
			$add_data = $this->mcommon->insert('activity_log', array('log_datetime' => date('Y-m-d H:i:s'), 'process_name' => 'application-payment-verify-cron', 'log_desc' => $cron_status));
			echo $cron_status . "<br>";
		}
	
	}
	
	public function generateMoneyReceipt($encoded_application_id){
		$data = array();
		
		$application_id = decode_url($encoded_application_id);
		if($application_id > 0){
			$data['application_details'] = $this->mapplication->get_application_payment_info(array('payment_info.application_id' => $application_id));
		}
		
		//echo "<pre>"; print_r($data['application_details']); die;
		if(!empty($data['application_details'])){
			$this->load->view('frontend/application/payment_ack_receipt', $data);
		}
		else{
			redirect(base_url() . 'unauthorised_access');
		}
	}
	
	public function downloadMoneyReceipt($encoded_application_id)
	{
		$this->load->library('pdf');
		$data = array();
		
		$application_id = decode_url($encoded_application_id);
		
		if($application_id > 0){
			$data['application_details'] = $this->mapplication->get_application_payment_info(array('payment_info.application_id' => $application_id));
		}
		
		if(!empty($data['application_details'])){
			$filename = 'Money Receipt-' . time(); 
			$html = $this->load->view('frontend/application/download_money_receipt', $data, true);
			// $this->pdf->create($html, $filename);
			// echo $html;die;
	
			$this->pdf->loadHtml($html);
			$this->pdf->set_paper("a4", "landscape");
			$this->pdf->render();
	
			$this->pdf->stream("" . $filename . ".pdf", array("Attachment" => 0));
		}
		else{
			redirect(base_url() . 'unauthorised_access');
		}
	}
	
}