javascript - paymentsense/woocommerce 结帐时卡住

标签 javascript php wordpress woocommerce

结账后,我在开发者控制台中收到此错误,页面卡在加载动画上,

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)

这是 PHP 错误

[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.

如何将其转换为 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;
            }

最佳答案

除了我对你的问题的评论之外,具体的操作方法如下:

您必须更改直接访问 $order 对象的所有行。 这是您展示的大部分代码。

$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);

您需要将 $order->billing_address_1 更改为 $order->get_billing_address_1()

所以你最终会得到这样的结果:

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

我不会全部完成,但你会明白总体思路:)

您可以找到WooCommerce bible here ,您会在这里找到您需要的所有内容:)

关于javascript - paymentsense/woocommerce 结帐时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705437/

相关文章:

javascript - 禁用然后启用 jquery 中的按钮

javascript - 当我尝试通过 jquery 和 ajax 传递 css 代码时,它被删除

javascript - 为什么我的 jQuery UI Spinner 没有正确递增

php - 检测选择了哪个下拉列表并返回其值和 ID

php - 自动生成 PHPUnit 测试的工具?

php - 如何使用 PHP 替换 php 页面中的 js 文件路径?

php - 如何忽略来自 WordPress 插件样式表的特定 CSS 代码?

javascript - 使用 Gutenberg getEntityRecords 获取 woocommerce 产品类别

wordpress - 显示 oEmbed Wordpress 时出错

Javascript 在与 UpdatePanel 一起使用时不起作用