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');
}
}
}