2017-10-12 90 views
0

我得到這個錯誤在我的開發者控制檯後,我結賬時,頁面只是卡住在加載動畫,paymentsense/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; 
      } 
+0

更新您的WooCommerce依賴插件,以便它們使用新的3.0函數。 –

+0

3.0中的WC迫使每個人都以自己的方式使用getters/setters方法。良好的'$ order-> ID不能正常工作。您必須簽出遷移說明,有多種不同的訪問方式https://github.com/woocommerce/woocommerce/wiki/2.6.x-to-3.0.0-Developer-Migration-Notes – db306

回答

0

超出了我的評論,在這裏正是如何做到這一點:

你必須改變直接訪問你的$ 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,你會發現這裏所有你需要的:)