Paymentsense / woocommerce卡在结帐时[重复]

Posted

技术标签:

【中文标题】Paymentsense / woocommerce卡在结帐时[重复]【英文标题】:paymentsense / woocommerce stuck on checkout [duplicate] 【发布时间】:2018-03-24 03:28:57 【问题描述】:

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

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, ".+");
                                        $cros-s-ref   = $szCrossReference;
                                        $url = $this->GetXMLValue("ACSURL", $ret, ".+");
                                        $woocommerce->session->paymentsense = array('pareq' => $pareq, 'cros-s-ref' => $cros-s-ref, '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;
            

【问题讨论】:

更新您的 WooCommerce 依赖插件,以便它们使用新的 3.0 功能。 WC 3.0 迫使每个人以自己的方式使用 getter/setter 方法。好的 ol' $order->ID 不再起作用了。您必须查看迁移说明,访问对象有多种不同的方式github.com/woocommerce/woocommerce/wiki/… 【参考方案1】:

除了我对你的问题的评论之外,这就是如何做到这一点:

您必须更改所有直接访问您的 $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-&gt;billing_address_1 更改为$order-&gt;get_billing_address_1()

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

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

我不会全部都做,但你大概明白了:)

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

【讨论】:

以上是关于Paymentsense / woocommerce卡在结帐时[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何开发一个woocommerce插件

php [wpo woocommerce] optimizacion woocommerce #woocommerce #wordpress

woocommerce 预订状态更改 woocommerce 订单状态

woocommerce网站主题添加代码

WooCommerce 钩子 – woocommerce_update_order 问题

WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行