支付感 / 未能成功结算 WooCommerce

22 浏览
0 Comments

支付感 / 未能成功结算 WooCommerce

这个问题已经在这里有了答案:

如何获取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 = '
                        
                            
                                
                                    
                                        
                                        
                                            
                                            '.$OrderID .'
                                            '. $OrderDescription . '
                                            
                                                TRUE
                                                TRUE
                                                TRUE
                                                TRUE
                                                20
                                                
                                                    
                                                
                                            
                                        
                                        
                                            '. $CardName .'
                                            '. $CardNumber .'
                                            
                                            
                                            '. $CV2 .'
                                            '. $IssueNumber .'
                                        
                                        
                                            
                                                '. $Address1 .'
                                                '. $Address2 .'
                                                '. $Address3 .'
                                                '. $Address4 .'
                                                '. $City .'
                                                '. $State .'
                                                '. $Postcode .'
                                                '. $CountryCode .'
                                            
                                            '. $EmailAddress .'
                                            '. $PhoneNumber .'
                                            '. $IPAddress .'
                                        
                                        Some data to be passed out
                                    
                                
                            
                        ';
                $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('#(.+)#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.'
',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 .
', 'woocommerce' ), strtolower( $szMessage ) ));
                    wc_add_notice(__('Payment Failed due to: ', 'woothemes') . $szMessage. '
 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 ''. $szMessage . '';
                exit;
            }
            exit;
            }

admin 更改状态以发布 2023年5月21日
0
0 Comments

除了在你问题下的评论之外,这里是详细做法:

你需要改变所有直接访问 $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圣经,你可以在这里找到你需要的所有内容 🙂

0