Opencart Payment gateway error after opencart 2.0 upgrade

847 views Asked by At

We have a payment gateway called atom for our opencart store. Recently we have upgraded Opencart from 1.5.6.4 to 2.0.1.0 version. Due to this payment method stopped working. I have gone through this post to understand the changes in opencart 2.0

Below is my updated code

//catalog/controller/payment/atompay.php
<?php

class ControllerPaymentAtompay extends Controller {
    protected function index() {
        $this->language->load('payment/atompay');

        $data['button_confirm'] = $this->language->get('button_confirm');       
        $data['url2'] = $this->url->link('payment/atompay/dopayment');  
        $this->session->data['order_id'];       



        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/atompay.tpl')) {
            return $this->load->view($this->config->get('config_template') . '/template/payment/atompay.tpl', $data);
        } else {
            return $this->load->view('default/template/payment/atompay.tpl', $data);
        }




        //$this->render();      
    }
    public function dopayment() {

        $vendor = $this->config->get('atompay_vendor');
        $password = $this->config->get('atompay_password');     
        $data['action'] = $this->config->get('atompay_url');        

        $this->load->model('checkout/order');

        $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
        $datenow        = date("d/m/Y");
        $data['BillingCity']           = $order_info['payment_city'];
        $data['BillingPostCode']       = $order_info['payment_postcode'];   
        $data['BillingCountry']      = $order_info['payment_iso_code_2'];

        $data['login']         = $this->config->get('atompay_vendor');
        $data['pass']              = $this->config->get('atompay_password');
        $data['ttype']         = 'NBFundTransfer';
        $data['action']        = $this->config->get('atompay_url');
        $data['prodid']        = $this->config->get('atompay_prodid');
        $data['amt']               = $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false);
        $data['txnid']         = $this->session->data['order_id'];
        $data['txndate']           = $datenow;
        $data['CustomerName']    = html_entity_decode($order_info['payment_firstname'] . ' ' . $order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
        $data['CustomerEMail']   = $order_info['email'];
        $data['BillingPhone']    = $order_info['telephone'];
        $data['BillingAddress1'] = $order_info['payment_address_1']."|".$data['BillingCity']."|".$data['BillingCountry'];
        $data['ru']            = $this->url->link('payment/atompay/success');

        $postFields  = "";
        $postFields .= "&login=".$data['login'];
        $postFields .= "&pass=".$data['pass'];
        $postFields .= "&ttype=".$data['ttype'];
        $postFields .= "&prodid=".$data['prodid'];
        $postFields .= "&amt=".$data['amt'];
        $postFields .= "&txncurr=INR";
        $postFields .= "&txnscamt=0";
        $postFields .= "&clientcode=".urlencode(base64_encode('123'));
        $postFields .= "&txnid=".$data['txnid'];
        $postFields .= "&date=".$datenow;
        $postFields .= "&custacc=123456789012";
        $postFields .= "&udf1=".$data['CustomerName'];
        $postFields .= "&udf2=".$data['CustomerEMail'];
        $postFields .= "&udf3=".$data['BillingPhone'];
        $postFields .= "&udf4=".$data['BillingAddress1'];
        $postFields .= "&ru=".$data['ru'];


        $sendUrl = $data['action']."?".substr($postFields,1);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$data['action']);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_PORT , 80); 
        curl_setopt($ch, CURLOPT_SSLVERSION,3);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
        $returnData = curl_exec($ch); 

        $parser = xml_parser_create('');
        xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); 
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, trim($returnData), $xml_values);
        xml_parser_free($parser);

        if(isset($xml_values[3]['value'])=='' || isset($xml_values[4]['value'])=='' || isset($xml_values[5]['value'])=='')
            {
                $this->redirect($this->url->link('checkout/atomfailure&msg=1'));
            }

        $returnArray['url']         = $xml_values[3]['value'];
        $returnArray['ttype']       = $xml_values[4]['value'];
        $returnArray['tempTxnId']   = $xml_values[5]['value'];
        $returnArray['token']       = $xml_values[6]['value'];      

        $url =$returnArray['url'] ;
        $postFields  = "";
        $postFields .= "&ttype=".$returnArray['ttype'] ;
        $postFields .= "&tempTxnId=".$returnArray['tempTxnId'];
        $postFields .= "&token=".$returnArray['token'] ;
        $postFields .= "&txnStage=1";
        $url = $url."?".$postFields;

        if($returnArray['tempTxnId']=='')
            {
                $this->redirect($this->url->link('checkout/atomfailure&msg=1'));
            }
        else
            {
                header("Location: ".$url);  
            }
    }
    public function success() {
        if ($this->request->post['f_code'] =='Ok') {
            $this->load->model('checkout/order');
            $this->model_checkout_order->confirm($this->request->post['mer_txn'], $this->config->get('config_order_status_id'),"Payment Pending");
            $this->model_checkout_order->update($this->request->post['mer_txn'], $this->config->get('atompay_order_status_id'), "Payment Received", false);     
            $this->redirect($this->url->link('checkout/success'));      
        }
        else
            {
            $message = "Payment failed";
            $this->load->model('checkout/order');
            $this->model_checkout_order->confirm($this->request->post['mer_txn'], $this->config->get('config_order_status_id'),"Payment Pending");
            $this->model_checkout_order->update($this->request->post['mer_txn'], $this->config->get('config_order_status_id'), $message, false);
            //$this->error['warning'] = "Transaction Denied. Payment failed.";
            $this->redirect($this->url->link('checkout/atomfailure'));
        }
    }   
}
?>

And

//catalog/model/payment/atompay.php
<?php 
class ModelPaymentAtomPay extends Model {
    public function getMethod($address, $total) {
        $this->load->language('payment/atompay');

        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('atompay_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");

        if ($this->config->get('atompay_total') > $total) {
            $status = false;
        } elseif (!$this->config->get('atompay_geo_zone_id')) {
            $status = true;
        } elseif ($query->num_rows) {
            $status = true;
        } else {
            $status = false;
        }   

        $method_data = array();

        if ($status) {  
            $method_data = array( 
                'code'       => 'atompay',
                'title'      => $this->language->get('text_title'),
                'terms'      => '',
                'sort_order' => $this->config->get('atompay_sort_order')
            );
        }

        return $method_data;
    }
}
?>

When i try to make an order confirm order is disabled and there are no error logs found. Am i missing something?

1

There are 1 answers

0
Vidhyut Pandya On BEST ANSWER

Your index() method is defined with protected access. So you are unable to call it from outside its scope. So you should change it to public function index().