0

I'm getting this error in my developer console after i checkout, the page just gets stuck on a loading animation,

Uncaught TypeError: Cannot read property 'reload' of null
    at Object.success (checkout.min.js?ver=3.2.0:1)
    at i (jquery.js:2)
    at Object.fireWith [as resolveWith] (jquery.js:2)
    at y (jquery.js:4)
    at XMLHttpRequest.c (jquery.js:4)

Here are the PHP Errors

[12-Oct-2017 09:02:12 UTC] order_total was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_address_1 was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_address_2 was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_city was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_state was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_postcode was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_country was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_email was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.
[12-Oct-2017 09:02:12 UTC] billing_phone was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_Paymentsense_Direct->process_payment, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.

How do I go about converting this to WC 3.0

function process_payment($order_id)
        {

            global $woocommerce;
            $order = new WC_Order( $order_id );
            $suppcurr = array(
                    'USD' => '840',
                    'EUR' => '978',
                    'GBP' => '826'
            );

            if(!empty($suppcurr[get_option('woocommerce_currency')]))
            {
                $currency = $suppcurr[get_option('woocommerce_currency')];
            }
            else
            {
                $currency = '826';
            }

            try
            {
                $headers = array(
                    'SOAPAction:https://www.thepaymentgateway.net/CardDetailsTransaction',
                    'Content-Type: text/xml; charset = utf-8',
                    'Connection: close'
                );


                $MerchantID = $this->merchant_id;
                $Password = $this->password;
                $Amount = $order->order_total * 100; //Amount must be passed as an integer in pence
                $CurrencyCode = $currency; //826 = GBP

                $OrderID = $order_id;
                $OrderDescription = $this->order_prefix . " " . (string)$order_id; //Order Description for this new transaction

                $CardName = $this->stripGWInvalidChars($this->get_request('psense_ccname'));
                //die($Amount);
                $CardNumber = $this->get_request('psense_ccnum');
                $ExpMonth = $this->get_request('psense_expmonth');
                $ExpYear = $this->get_request('psense_expyear');
                $CV2 = $this->get_request('psense_cv2');
                $IssueNumber = $this->get_request('psense_issueno');

                $Address1 = $this->stripGWInvalidChars($order->billing_address_1);
                $Address2 = $this->stripGWInvalidChars($order->billing_address_2);
                $Address3 = '';
                $Address4 = '';
                $City = $this->stripGWInvalidChars($order->billing_city);
                $State = $this->stripGWInvalidChars($order->billing_state);
                $Postcode = $this->stripGWInvalidChars($order->billing_postcode);
                $Country = $this->stripGWInvalidChars($order->billing_country);
                $EmailAddress = $this->stripGWInvalidChars($order->billing_email);
                $PhoneNumber = $this->stripGWInvalidChars($order->billing_phone);
                $CountryCode = 826;
                $IPAddress = $_SERVER['REMOTE_ADDR'];


                $xml = '<?xml version="1.0" encoding="utf-8"?>
                        <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                            <soap:Body>
                                <CardDetailsTransaction xmlns="https://www.thepaymentgateway.net/">
                                    <PaymentMessage>
                                        <MerchantAuthentication MerchantID="'. $MerchantID .'" Password="'. $Password .'" />
                                        <TransactionDetails Amount="'. $Amount .'" CurrencyCode="'. $CurrencyCode .'">
                                            <MessageDetails TransactionType="SALE" />
                                            <OrderID>'.$OrderID .'</OrderID>
                                            <OrderDescription>'. $OrderDescription . '</OrderDescription>
                                            <TransactionControl>
                                                <EchoCardType>TRUE</EchoCardType>
                                                <EchoAVSCheckResult>TRUE</EchoAVSCheckResult>
                                                <EchoCV2CheckResult>TRUE</EchoCV2CheckResult>
                                                <EchoAmountReceived>TRUE</EchoAmountReceived>
                                                <DuplicateDelay>20</DuplicateDelay>
                                                <CustomVariables>
                                                    <GenericVariable Name="MyInputVariable" Value="Ping" />
                                                </CustomVariables>
                                            </TransactionControl>
                                        </TransactionDetails>
                                        <CardDetails>
                                            <CardName>'. $CardName .'</CardName>
                                            <CardNumber>'. $CardNumber .'</CardNumber>
                                            <StartDate Month="" Year="" />
                                            <ExpiryDate Month="'. $ExpMonth .'" Year="'. $ExpYear .'" />
                                            <CV2>'. $CV2 .'</CV2>
                                            <IssueNumber>'. $IssueNumber .'</IssueNumber>
                                        </CardDetails>
                                        <CustomerDetails>
                                            <BillingAddress>
                                                <Address1>'. $Address1 .'</Address1>
                                                <Address2>'. $Address2 .'</Address2>
                                                <Address3>'. $Address3 .'</Address3>
                                                <Address4>'. $Address4 .'</Address4>
                                                <City>'. $City .'</City>
                                                <State>'. $State .'</State>
                                                <PostCode>'. $Postcode .'</PostCode>
                                                <CountryCode>'. $CountryCode .'</CountryCode>
                                            </BillingAddress>
                                            <EmailAddress>'. $EmailAddress .'</EmailAddress>
                                            <PhoneNumber>'. $PhoneNumber .'</PhoneNumber>
                                            <CustomerIPAddress>'. $IPAddress .'</CustomerIPAddress>
                                        </CustomerDetails>
                                        <PassOutData>Some data to be passed out</PassOutData>
                                    </PaymentMessage>
                                </CardDetailsTransaction>
                            </soap:Body>
                        </soap:Envelope>';

                $gwId = 1;
                $domain = "paymentsensegateway.com";
                $port = "4430";
                $transattempt = 1;
                $soapSuccess = false;

                while(!$soapSuccess && $gwId <= 3 && $transattempt <= 3)
                {
                    $url = 'https://gw'.$gwId.'.'.$domain.':'.$port.'/';

                    //initialise cURL
                    $curl = curl_init();

                    //set the options
                    curl_setopt($curl, CURLOPT_HEADER, false);
                    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
                    curl_setopt($curl, CURLOPT_POST, true);
                    curl_setopt($curl, CURLOPT_URL, $url);
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
                    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($curl, CURLOPT_ENCODING, 'UTF-8');
                    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

                    //Execute cURL request
                    //$ret = returned XML
                    $ret = curl_exec($curl);
                    //$err = returned error number
                    $err = curl_errno($curl);
                    //retHead = returned XML header
                    $retHead = curl_getinfo($curl);
                    //die($ret);
                    //close cURL connection
                    curl_close($curl);
                    $curl = null;
                    //die($ret);
                    if($err == 0)
                    {
                        $StatusCode = $this->GetXMLValue("StatusCode", $ret, "[0-9]+");

                        if(is_numeric($StatusCode)) {
                            //request was processed correctly

                            if( $StatusCode != 30 ) {
                                //set success flag so it will not run the request again.
                                $soapSuccess = true;

                                //grab some of the most commonly used information from the response
                                $szMessage = $this->GetXMLValue("Message", $ret, ".+");
                                $szAuthCode = $this->GetXMLValue("AuthCode", $ret, ".+");
                                $szCrossReference = $this->GetCrossReference($ret);
                                $szAddressNumericCheckResult = $this->GetXMLValue("AddressNumericCheckResult", $ret, ".+");
                                $szPostCodeCheckResult = $this->GetXMLValue("PostCodeCheckResult", $ret, ".+");
                                $szCV2CheckResult = $this->GetXMLValue("CV2CheckResult", $ret, ".+");
                                $szThreeDSecureAuthenticationCheckResult = $this->GetXMLValue("ThreeDSecureAuthenticationCheckResult", $ret, ".+");

                                switch ($StatusCode) {
                                    case 0:
                                        // transaction authorised
                                        $transaction_status = 'success';
                                        break;
                                    case 3:
                                        //3D Secure Auth required
                                        //Gather required variables
                                        if ('yes'==$this->debug)
                                        {
                                            $this->log->add( 'paymentsense_direct', '3D Secure authentication required');
                                        }

                                        $pareq = $this->GetXMLValue("PaREQ", $ret, ".+");
                                        $crossref   = $szCrossReference;
                                        $url = $this->GetXMLValue("ACSURL", $ret, ".+");
                                        $woocommerce->session->paymentsense = array('pareq' => $pareq, 'crossref' => $crossref, 'url' => $url);
                                        return array(
                                            'result'    => 'success',
                                            'redirect'  => add_query_arg('key', $order->order_key, add_query_arg('order', $order_id, get_permalink(woocommerce_get_page_id('pay'))))
                                        );
                                        break;
                                    case 4:
                                        //Card Referred - treat as a decline
                                        $transaction_status = 'failed';
                                        break;
                                    case 5:
                                        //Card declined

                                        $transaction_status = 'failed';
                                        break;
                                    case 20:
                                        if (preg_match('#<PreviousTransactionResult>(.+)</PreviousTransactionResult>#iU', $ret, $soapPreviousTransactionResult)) {
                                            $PreviousTransactionResult = $soapPreviousTransactionResult[1];

                                            $PreviousMessage = $this->GetXMLValue("Message", $PreviousTransactionResult, ".+");
                                            $PreviousStatusCode = $this->GetXMLValue("StatusCode", $PreviousTransactionResult, ".+");
                                        }

                                        // need to look at the previous status code to see if the transaction was successful
                                        if ($PreviousStatusCode == 0) 
                                        {
                                            $transaction_status = 'success';
                                        } 
                                        else 
                                        {
                                            $transaction_status = 'failed';
                                        }
                                        break;
                                    default:
                                        $transaction_status = 'failed';
                                        break;
                                }
                            }
                            else 
                            {
                                // status code is 30 - error occured
                                // get the reason from the xml
                                $szMessageDetail = $this->GetXMLValue("Detail", $ret, ".+");

                                //run the function to get the cause of the error
                                $Response = "Error occurred: ";
                                $Response .= $szMessageDetail;
                            }
                        }
                    }
                    if($transattempt <=2) 
                    {
                        $transattempt++;
                    } 
                    else 
                    {
                        //reset transaction attempt to 1 & incremend $gwID (to use next numeric gateway number (eg. use gw2 rather than gw1 now))
                        $transattempt = 1;
                        $gwId++;
                    }
                }

                if($transaction_status == 'success')
                {
                    $order->payment_complete();
                    $order->add_order_note('Payment Successful: '.$szMessage.'<br />',0);
                    return array(
                        'result' => 'success',
                        'redirect' => $this->get_return_url( $order )
                    );
                }
                elseif ($transaction_status == 'failed')
                {
                    //die("123456");
                    $order->get_checkout_payment_url(false);
                    $order->update_status('failed', sprintf( __( 'Payment Failed due to: %s .<br />', 'woocommerce' ), strtolower( $szMessage ) ));
                    wc_add_notice(__('Payment Failed due to: ', 'woothemes') . $szMessage. '<br /> Please check your card details and try again.', 'error');


                    return;
                }
            } 
            catch(Exception $ex)
            {
                if ($this->debug=='yes')
                {
                    $this->log->add( 'paymentsense_direct', "Error: " . $szMessage);
                }
                echo '<div class="woocommerce-error woocommerce_error">'. $szMessage . '</div>';
                exit;
            }
            exit;
            }
Brad Fletcher
  • 3,547
  • 3
  • 27
  • 42
  • Update your WooCommerce dependent plugins so that they use the new 3.0 functions. – Andrew Schultz Oct 12 '17 at 09:21
  • WC in 3.0 are forcing everyone to use getters/setters methods in their own way. The good ol' $order->ID ain't working no more. You gotta checkout the migration notes, there are multiple and different ways of accessing the objects https://github.com/woocommerce/woocommerce/wiki/2.6.x-to-3.0.0-Developer-Migration-Notes – db306 Oct 12 '17 at 09:41

1 Answers1

1

Beyond my comment under your question, here is exactly how to do it:

You have to change all the lines that are accessing your $order object directly. Here are most of the code you've shown.

$Address1 = $this->stripGWInvalidChars($order->billing_address_1);
$Address2 = $this->stripGWInvalidChars($order->billing_address_2);
$Address3 = '';
$Address4 = '';
$City = $this->stripGWInvalidChars($order->billing_city);
$State = $this->stripGWInvalidChars($order->billing_state);
$Postcode = $this->stripGWInvalidChars($order->billing_postcode);
$Country = $this->stripGWInvalidChars($order->billing_country);
$EmailAddress = $this->stripGWInvalidChars($order->billing_email);
$PhoneNumber = $this->stripGWInvalidChars($order->billing_phone);

You need to change the $order->billing_address_1 to $order->get_billing_address_1()

So you end up with something like this:

$Address1 = $this->stripGWInvalidChars($order->get_billing_address_1());

I won't do them all, but you get the general idea :)

You can find the WooCommerce bible here, you will find all the ones you need here :)

db306
  • 934
  • 11
  • 22