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->billing_address_1
更改为$order->get_billing_address_1()
所以你最终会得到这样的结果:
$Address1 = $this->stripGWInvalidChars($order->get_billing_address_1());
我不会全部都做,但你大概明白了:)
你可以找到WooCommerce bible here,你会在这里找到所有你需要的:)
【讨论】:
以上是关于Paymentsense / woocommerce卡在结帐时[重复]的主要内容,如果未能解决你的问题,请参考以下文章
php [wpo woocommerce] optimizacion woocommerce #woocommerce #wordpress
woocommerce 预订状态更改 woocommerce 订单状态
WooCommerce 钩子 – woocommerce_update_order 问题
WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行