首頁  >  文章  >  後端開發  >  php 修改zen-cart下單和付款流程以防止漏單

php 修改zen-cart下單和付款流程以防止漏單

高洛峰
高洛峰原創
2017-01-05 11:26:081658瀏覽

用過zen-cart的人都知道,zen-cart中下單步驟是下面這樣的(其中[]中的表示不是必須的):

   1. 購物車(shopping cart) 

  2. [   2. [   2. [   2.貨運方式(delivery method)]

   3. 付款方式(payment method)

   4. 訂單確認(confirmation)

  比較重要,因為會在這裡將購物車中的信息寫入訂單

   7. 下單成功(checkout success)

   這樣的流程在正常情況下是沒有任何問題的。但是,從第5步到第6部的過程中,用戶可能以為付款成功就直接關閉掉網頁了,或者由於網絡原因造成不能正常跳到checkout_process頁面,這樣造成的後果是很嚴重的,因為訂單不能被正常的創建。


   基於上述的分析, 我們希望稍微改變一下流程,即在支付之前訂單已經創建好了,這樣就算在支付時不能從第三方支付網站跳轉回來,我們也不會存在用戶付款成功卻在後台沒有訂單的情況了。經過修改後的藍圖基本上是下面這樣的:


   1. 在checkour_confirmation頁面確認訂單後,都會直接proccess,並且進入checkour_success頁面,可以在這裡進入付款頁面。如下圖:

php 修改zen-cart下单和付款流程以防止漏单   2. 如果當時顧客沒能付款,也可進入自己的後台對歷史訂單進行付款。如下圖:

php 修改zen-cart下单和付款流程以防止漏单   下面我們就來看看如何一步一步來實現上述的功能。

  1. 首先我們需要對現有的支付模組進行一個改造。需要為付款方式的class增加一個欄位paynow_action_url,用來表示進行付款的頁面url,另外還需要增加一個函數,paynow_button($order_id),來取得支付表單的參數隱藏域代碼。

要增加paynow_action_url字段,請在類別payment的建構子中最後加上下面的程式碼: 

if ( (zen_not_null($module)) && (in_array($module.'.php', $this->modules)) && (isset($GLOBALS[$module]->paynow_action_url)) ) { 
$this->paynow_action_url = $GLOBALS[$module]->paynow_action_url; 
}

要增加paynow_button($order_id)函數,請在payment類別的最後一個函數之後加上如下的程式碼: 

function paynow_button($order_id){ 
if (is_array($this->modules)) { 
if (is_object($GLOBALS[$this->selected_module])) { 
return $GLOBALS[$this->selected_module]->paynow_button($order_id); 
} 
} 
}

2. 以paypal支付方式為例子,說明如何具體實現。為了不破壞paypal原有的程式碼,我們將paypal.php文件拷貝一份副本出來,並命名為paypalsimple.php,並對裡面的程式碼做適當的修改。程式碼如下所示,可以看到,這裡去掉了對form_action_url的指定,並給定了paynow_action_url,因為我們希望用戶點擊「確認訂單」後直接進入checkout_process,所以如果不指定form_action_url,那麼確認訂單的表單就會直接提交到checkout_process頁面了,而paynow_action_url就是以前的form_action_url的值。 paynow_button函數的實作也很簡單,這裡只是將原先的process_button()函數的內容剪下過來而已,只不過我們沒有使用全域的$order變量,而是用$order = new order($order_id),來重新建構的一個對象,這樣做是為在歷史訂單中顯示pay now按鈕做準備的。 

paypalsimple.php 

<?php 
/** 
* @package paypalsimple payment module 
* @copyright Copyright 2003-2006 Zen Cart Development Team 
* @copyright Portions Copyright 2003 osCommerce 
* @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0 
* @version $Id: paypalsimple.php 4960 2009-12-29 11:46:46Z gary $ 
*/ 
// ensure dependencies are loaded 
include_once((IS_ADMIN_FLAG === true ? DIR_FS_CATALOG_MODULES : DIR_WS_MODULES) . &#39;payment/paypal/paypal_functions.php&#39;); 
class paypalsimple { 
var $code, $title, $description, $enabled; 
// class constructor 
function paypalsimple() { 
global $order; 
$this->code = &#39;paypalsimple&#39;; 
$this->title = MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_TITLE; 
if(IS_ADMIN_FLAG === true){ 
$this->title = MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_ADMIN_TITLE; 
} 
$this->description = MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_DESCRIPTION; 
$this->sort_order = MODULE_PAYMENT_PAYPAL_SIMPLE_SORT_ORDER; 
$this->enabled = ((MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS == &#39;True&#39;) ? true : false); 
if ((int)MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID > 0) { 
$this->order_status = MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID; 
} 
$this->paynow_action_url = &#39;https://&#39; . MODULE_PAYMENT_PAYPAL_SIMPLE_HANDLER; 
if (is_object($order)) $this->update_status(); 
} 
// class methods 
function update_status() { 
global $order, $db; 
if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE > 0) ) { 
$check_flag = false; 
$check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = &#39;" . MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE . "&#39; and zone_country_id = &#39;" . $order->billing[&#39;country&#39;][&#39;id&#39;] . "&#39; order by zone_id"); 
while (!$check->EOF) { 
if ($check->fields[&#39;zone_id&#39;] < 1) { 
$check_flag = true; 
break; 
} elseif ($check->fields[&#39;zone_id&#39;] == $order->billing[&#39;zone_id&#39;]) { 
$check_flag = true; 
break; 
} 
$check->MoveNext(); 
} 
if ($check_flag == false) { 
$this->enabled = false; 
} 
} 
} 
function javascript_validation() { 
return false; 
} 
function selection() { 
$text = MODULE_PAYMENT_SIMPLE_PAYPAL_TEXT_CATALOG_LOGO.&#39;  &#39;.MODULE_PAYMENT_PAYPAL_SIMPLE_TEXT_TITLE . &#39;<br/><br/>    <span class="smallText">&#39; . MODULE_PAYMENT_PAYPAL_SIMPLE_ACCEPTANCE_MARK_TEXT . &#39;</span><br/><br/>&#39;; 
return array(&#39;id&#39; => $this->code, 
&#39;module&#39; => $text 
); 
} 
function pre_confirmation_check() { 
return false; 
} 
function confirmation() { 
return false; 
} 
function process_button() { 
return false; 
} 
function before_process() { 
return false; 
} 
function after_process() { 
return false; 
} 
function get_error() { 
return false; 
} 
function check() { 
global $db; 
if (!isset($this->_check)) { 
$check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS&#39;"); 
$this->_check = $check_query->RecordCount(); 
} 
return $this->_check; 
} 
function install() { 
global $db; 
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values (&#39;Enable PayPal-Simple Module&#39;, &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS&#39;, &#39;True&#39;, &#39;Do you want to accept PayPal-Simple payments?&#39;, &#39;6&#39;, &#39;0&#39;, &#39;zen_cfg_select_option(array(\&#39;True\&#39;, \&#39;False\&#39;), &#39;, now())"); 
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values (&#39;Sort order of display.&#39;, &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_SORT_ORDER&#39;, &#39;0&#39;, &#39;Sort order of display. Lowest is displayed first.&#39;, &#39;6&#39;, &#39;8&#39;, now())"); 
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values (&#39;Payment Zone&#39;, &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE&#39;, &#39;0&#39;, &#39;If a zone is selected, only enable this payment method for that zone.&#39;, &#39;6&#39;, &#39;2&#39;, &#39;zen_get_zone_class_title&#39;, &#39;zen_cfg_pull_down_zone_classes(&#39;, now())"); 
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values (&#39;Set Order Status&#39;, &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID&#39;, &#39;0&#39;, &#39;Set the status of orders made with this payment module to this value&#39;, &#39;6&#39;, &#39;0&#39;, &#39;zen_cfg_pull_down_order_statuses(&#39;, &#39;zen_get_order_status_name&#39;, now())"); 
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values (&#39;Mode for PayPal web services<br /><br />Default:<br /><code>www.paypal.com/cgi-bin/webscr</code><br />or<br /><code>www.paypal.com/us/cgi-bin/webscr</code><br />or for the UK,<br /><code>www.paypal.com/uk/cgi-bin/webscr</code>&#39;, &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_HANDLER&#39;, &#39;www.paypal.com/cgi-bin/webscr&#39;, &#39;Choose the URL for PayPal live processing&#39;, &#39;6&#39;, &#39;73&#39;, &#39;&#39;, now())"); 
} 
function remove() { 
global $db; 
$db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in (&#39;" . implode("&#39;, &#39;", $this->keys()) . "&#39;)"); 
} 
function keys() { 
return array(&#39;MODULE_PAYMENT_PAYPAL_SIMPLE_STATUS&#39;,&#39;MODULE_PAYMENT_PAYPAL_SIMPLE_SORT_ORDER&#39;,&#39;MODULE_PAYMENT_PAYPAL_SIMPLE_ZONE&#39;,&#39;MODULE_PAYMENT_PAYPAL_SIMPLE_ORDER_STATUS_ID&#39;, &#39;MODULE_PAYMENT_PAYPAL_SIMPLE_HANDLER&#39;); 
} 
function paynow_button($order_id){ 
global $db, $order, $currencies, $currency; 
require_once(DIR_WS_CLASSES . &#39;order.php&#39;); 
$order = new order($order_id); 
$options = array(); 
$optionsCore = array(); 
$optionsPhone = array(); 
$optionsShip = array(); 
$optionsLineItems = array(); 
$optionsAggregate = array(); 
$optionsTrans = array(); 
$buttonArray = array(); 
$this->totalsum = $order->info[&#39;total&#39;]; 
// save the session stuff permanently in case paypal loses the session 
$_SESSION[&#39;ppipn_key_to_remove&#39;] = session_id(); 
$db->Execute("delete from " . TABLE_PAYPAL_SESSION . " where session_id = &#39;" . zen_db_input($_SESSION[&#39;ppipn_key_to_remove&#39;]) . "&#39;"); 
$sql = "insert into " . TABLE_PAYPAL_SESSION . " (session_id, saved_session, expiry) values ( 
&#39;" . zen_db_input($_SESSION[&#39;ppipn_key_to_remove&#39;]) . "&#39;, 
&#39;" . base64_encode(serialize($_SESSION)) . "&#39;, 
&#39;" . (time() + (1*60*60*24*2)) . "&#39;)"; 
$db->Execute($sql); 
$my_currency = select_pp_currency(); 
$this->transaction_currency = $my_currency; 
$this->transaction_amount = ($this->totalsum * $currencies->get_value($my_currency)); 
$telephone = preg_replace(&#39;/\D/&#39;, &#39;&#39;, $order->customer[&#39;telephone&#39;]); 
if ($telephone != &#39;&#39;) { 
$optionsPhone[&#39;H_PhoneNumber&#39;] = $telephone; 
if (in_array($order->customer[&#39;country&#39;][&#39;iso_code_2&#39;], array(&#39;US&#39;,&#39;CA&#39;))) { 
$optionsPhone[&#39;night_phone_a&#39;] = substr($telephone,0,3); 
$optionsPhone[&#39;night_phone_b&#39;] = substr($telephone,3,3); 
$optionsPhone[&#39;night_phone_c&#39;] = substr($telephone,6,4); 
$optionsPhone[&#39;day_phone_a&#39;] = substr($telephone,0,3); 
$optionsPhone[&#39;day_phone_b&#39;] = substr($telephone,3,3); 
$optionsPhone[&#39;day_phone_c&#39;] = substr($telephone,6,4); 
} else { 
$optionsPhone[&#39;night_phone_b&#39;] = $telephone; 
$optionsPhone[&#39;day_phone_b&#39;] = $telephone; 
} 
} 
$optionsCore = array( 
&#39;charset&#39; => CHARSET, 
&#39;lc&#39; => $order->customer[&#39;country&#39;][&#39;iso_code_2&#39;], 
&#39;page_style&#39; => MODULE_PAYMENT_PAYPAL_PAGE_STYLE, 
&#39;custom&#39; => zen_session_name() . &#39;=&#39; . zen_session_id(), 
&#39;business&#39; => MODULE_PAYMENT_PAYPAL_BUSINESS_ID, 
&#39;return&#39; => zen_href_link(FILENAME_PAY_SUCCESS, &#39;referer=paypal&#39;, &#39;SSL&#39;), 
&#39;cancel_return&#39; => zen_href_link(FILENAME_PAY_FAILED, &#39;&#39;, &#39;SSL&#39;), 
&#39;shopping_url&#39; => zen_href_link(FILENAME_SHOPPING_CART, &#39;&#39;, &#39;SSL&#39;), 
&#39;notify_url&#39; => zen_href_link(&#39;ipn_main_handler.php&#39;, &#39;&#39;, &#39;SSL&#39;,false,false,true), 
&#39;redirect_cmd&#39; => &#39;_xclick&#39;, 
&#39;rm&#39; => 2, 
&#39;bn&#39; => &#39;zencart&#39;, 
&#39;mrb&#39; => &#39;R-6C7952342H795591R&#39;, 
&#39;pal&#39; => &#39;9E82WJBKKGPLQ&#39;, 
); 
$optionsCust = array( 
&#39;first_name&#39; => replace_accents($order->customer[&#39;firstname&#39;]), 
&#39;last_name&#39; => replace_accents($order->customer[&#39;lastname&#39;]), 
&#39;address1&#39; => replace_accents($order->customer[&#39;street_address&#39;]), 
&#39;city&#39; => replace_accents($order->customer[&#39;city&#39;]), 
&#39;state&#39; => zen_get_zone_code($order->customer[&#39;country&#39;][&#39;id&#39;], $order->customer[&#39;zone_id&#39;], $order->customer[&#39;zone_id&#39;]), 
&#39;zip&#39; => $order->customer[&#39;postcode&#39;], 
&#39;country&#39; => $order->customer[&#39;country&#39;][&#39;iso_code_2&#39;], 
&#39;email&#39; => $order->customer[&#39;email_address&#39;], 
); 
if ($order->customer[&#39;suburb&#39;] != &#39;&#39;) $optionsCust[&#39;address2&#39;] = $order->customer[&#39;suburb&#39;]; 
if (MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED == 2) $optionsCust = array( 
&#39;address_name&#39; => replace_accents($order->customer[&#39;firstname&#39;] . &#39; &#39; . $order->customer[&#39;lastname&#39;]), 
&#39;address_street&#39; => replace_accents($order->customer[&#39;street_address&#39;]), 
&#39;address_city&#39; => replace_accents($order->customer[&#39;city&#39;]), 
&#39;address_state&#39; => zen_get_zone_code($order->customer[&#39;country&#39;][&#39;id&#39;], $order->customer[&#39;zone_id&#39;], $order->customer[&#39;zone_id&#39;]), 
&#39;address_zip&#39; => $order->customer[&#39;postcode&#39;], 
&#39;address_country&#39; => $order->customer[&#39;country&#39;][&#39;title&#39;], 
&#39;address_country_code&#39; => $order->customer[&#39;country&#39;][&#39;iso_code_2&#39;], 
&#39;payer_email&#39; => $order->customer[&#39;email_address&#39;], 
); 
$optionsShip = array( 
//&#39;address_override&#39; => MODULE_PAYMENT_PAYPAL_ADDRESS_OVERRIDE, 
&#39;no_shipping&#39; => MODULE_PAYMENT_PAYPAL_ADDRESS_REQUIRED, 
); 
if (MODULE_PAYMENT_PAYPAL_DETAILED_CART == &#39;Yes&#39;) $optionsLineItems = ipn_getLineItemDetails(); 
if (sizeof($optionsLineItems) > 0) { 
$optionsLineItems[&#39;cmd&#39;] = &#39;_cart&#39;; 
// $optionsLineItems[&#39;num_cart_items&#39;] = sizeof($order->products); 
if (isset($optionsLineItems[&#39;shipping&#39;])) { 
$optionsLineItems[&#39;shipping_1&#39;] = $optionsLineItems[&#39;shipping&#39;]; 
unset($optionsLineItems[&#39;shipping&#39;]); 
} 
if (isset($optionsLineItems[&#39;handling&#39;])) { 
$optionsLineItems[&#39;handling_1&#39;] = $optionsLineItems[&#39;handling&#39;]; 
unset($optionsLineItems[&#39;handling&#39;]); 
} 
unset($optionsLineItems[&#39;subtotal&#39;]); 
// if line-item details couldn&#39;t be kept due to calculation mismatches or discounts etc, default to aggregate mode 
if (!isset($optionsLineItems[&#39;item_name_1&#39;])) $optionsLineItems = array(); 
//if ($optionsLineItems[&#39;amount&#39;] != $this->transaction_amount) $optionsLineItems = array(); 
ipn_debug_email(&#39;Line Item Details (if blank, this means there was a data mismatch, and thus bypassed): &#39; . "\n" . print_r($optionsLineItems, true)); 
} 
$products_name_display = ""; 
/* 
for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { 
if(i > 0) { 
$products_name_display.= &#39;, &#39;; 
} 
$products_name_display.= $order->products[$i][&#39;name&#39;]. &#39;(&#39;. $order->products[$i][&#39;qty&#39;] .&#39;,&#39;.$order->products[$i][&#39;dhisys_web_order_number&#39;].&#39;)&#39;; 
}*/ 
$optionsAggregate = array( 
&#39;cmd&#39; => &#39;_ext-enter&#39;, 
&#39;item_name&#39; => $products_name_display, 
&#39;item_number&#39; => $order_id, 
&#39;num_cart_items&#39; => sizeof($order->products), 
&#39;amount&#39; => number_format($this->transaction_amount, $currencies->get_decimal_places($my_currency)), 
&#39;shipping&#39; => &#39;0.00&#39;, 
); 
if (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == &#39;true&#39;) $optionsAggregate[&#39;tax&#39;] = &#39;0.00&#39;; 
if (MODULE_PAYMENT_PAYPAL_TAX_OVERRIDE == &#39;true&#39;) $optionsAggregate[&#39;tax_cart&#39;] = &#39;0.00&#39;; 
$optionsTrans = array( 
&#39;upload&#39; => (int)(sizeof($order->products) > 0), 
&#39;currency_code&#39; => $my_currency, 
// &#39;paypal_order_id&#39; => $paypal_order_id, 
//&#39;no_note&#39; => &#39;1&#39;, 
//&#39;invoice&#39; => &#39;&#39;, 
); 
// if line-item info is invalid, use aggregate: 
if (sizeof($optionsLineItems) > 0) $optionsAggregate = $optionsLineItems; 
// prepare submission 
$options = array_merge($optionsCore, $optionsCust, $optionsPhone, $optionsShip, $optionsTrans, $optionsAggregate); 
ipn_debug_email(&#39;Keys for submission: &#39; . print_r($options, true)); 
if(sizeof($order->products) > 0){ 
$options[&#39;cmd&#39;] = &#39;_cart&#39;; 
for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { 
$options[&#39;item_name_&#39;. (string)($i+1)] = $order->products[$i][&#39;name&#39;]; 
$options[&#39;item_number_&#39;. (string)($i+1)] = $order->products[$i][&#39;dhisys_web_order_number&#39;]; 
$options[&#39;amount_&#39;. (string)($i+1)] = number_format((float)$order->products[$i][&#39;final_price&#39;],2); 
$options[&#39;quantity_&#39;. (string)($i+1)] = $order->products[$i][&#39;qty&#39;]; 
} 
} 
// build the button fields 
foreach ($options as $name => $value) { 
// remove quotation marks 
$value = str_replace(&#39;"&#39;, &#39;&#39;, $value); 
// check for invalid chars 
if (preg_match(&#39;/[^a-zA-Z_0-9]/&#39;, $name)) { 
ipn_debug_email(&#39;datacheck - ABORTING - preg_match found invalid submission key: &#39; . $name . &#39; (&#39; . $value . &#39;)&#39;); 
break; 
} 
// do we need special handling for & and = symbols? 
//if (strpos($value, &#39;&&#39;) !== false || strpos($value, &#39;=&#39;) !== false) $value = urlencode($value); 
$buttonArray[] = zen_draw_hidden_field($name, $value); 
} 
$_SESSION[&#39;paypal_transaction_info&#39;] = array($this->transaction_amount, $this->transaction_currency); 
$process_button_string = implode("\n", $buttonArray) . "\n"; 
return $process_button_string; 
} 
} 
?>

3. 在checkout_success頁顯示pay now按鈕。開啟檔案"includes/modules/pages/checkout_success/header.php",在檔案的結尾加入下面的程式碼(如果你已經掌握zen-cart中的通知者/觀察者模式,並且又不想破壞zen-cart核心程式碼的話,也可以建立一個觀察類別來監聽NOTIFY_HEADER_END_CHECKOUT_SUCCESS來實作)。

require_once(DIR_WS_CLASSES . &#39;order.php&#39;); 
require_once(DIR_WS_CLASSES . &#39;payment.php&#39;); 
$payment_modules = new payment($orders->fields[&#39;payment_module_code&#39;]);

開啟檔案"includes/modules/templates/template_default/templates/tpl_checkout_success_default.php",並在適當的位置加上如下的程式碼,這裡對訂單的狀態進行了一個判斷,當只有訂單的狀態在未付款狀態,才顯示該按鈕, 

<div id="pay_now"> 
<?php 
//&& $orders->fields[&#39;orders_status&#39;] == &#39;1&#39; 
if(isset($payment_modules->paynow_action_url) && $payment_modules->paynow_action_url != &#39;&#39;&& $orders->fields[&#39;orders_status&#39;] == &#39;1&#39;){ 
echo(&#39;<fieldset id="csNotifications">&#39;); 
echo(&#39;<legend>&#39;.TEXT_PAYNOW.&#39;</legend>&#39;); 
echo zen_draw_form(&#39;checkout_paynow&#39;, $payment_modules->paynow_action_url, &#39;post&#39;, &#39;id="checkout_confirmation" onsubmit="submitonce();"&#39;); 
$selection = $payment_modules->selection(); 
echo(&#39;<div class="buttonRow payment_method">&#39;.$selection[0][&#39;module&#39;].&#39;</div>&#39;); 
echo(&#39;<div class="buttonRow forward paynow">&#39;); 
if (is_array($payment_modules->modules)) { 
echo $payment_modules->paynow_button($orders_id); 
} 
echo(zen_image_submit(BUTTON_IMAGE_PAYNOW, BUTTON_IMAGE_PAYNOW_ALT, &#39;name="btn_paynow" id="btn_paynow"&#39;)); 
echo(&#39;</div>&#39;); 
echo(&#39;</form>&#39;); 
echo(&#39;</fieldset>&#39;); 
} 
?> 
</div>

4. 在历史订单中显示pay now按钮。需要显示pay now按钮的页面有三个:account, account_history,account_history_info,这里的实现和checkout_success页面的实现大同小异,只是传给$payment_modules的函数paynow_button的参数不一样而已,这里就不再赘述。 
总结: 
经过上面的修改,我们的流程如下: 
1. 购物车(shopping cart) 
2. [货运方式(delivery method)] 
3. 支付方式(payment method) 
4. 订单确认(confirmation) 
5. 订单处理(checkout process) 
6. 下单成功(checkout success) 
7. [第三方网站支付] 
因为从订单确认到订单处理,都是在我们自己的网站完成的,并且进入支付网站之前,订单已经存在了,这样就不会出现掉单的情况了。 

更多php 修改zen-cart下单和付款流程以防止漏单相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn