針對除了paypal之外. 客戶通過其他的支付方式進入index.php?main_page=checkout_confirmation這個頁面就能生出訂單.paypal就有點與衆不同, 它隻能是從它的官網 [paypal.com] 返回來并且進入checkout_process這個頁面後,才能生出訂單,而意外常會發生:比如網絡不順. 又比如客戶不小心在返回前就關了頁面.
paypal防漏單的原理就是——在 checkout_confirmation.php這個頁面先生出訂單!!!提供解決方法
方法是:在這個文件的最後部分echo TITLE_CONTINUE_CHECKOUT_PROCEDURE . ‘<br />’ . TEXT_CONTINUE_CHECKOUT_PROCEDURE;
後面添加代碼:
// create the order record 防漏單
if ($_SESSION['payment'] == ‘paypal’) {
$insert_id = $order->create($order_totals, 2);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_CREATE’);
$payment_modules->after_order_create($insert_id);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_PAYMENT_MODULES_AFTER_ORDER_CREATE’);
// store the product info to the order
$order->create_add_products($insert_id);
$_SESSION['order_number_created'] = $insert_id;
爲了避免對其他支付方式産生影響,代碼做了個判斷,隻有paypal支付會運行這些生成訂單的代碼,加了這段後就不用擔心會漏單了—成功付款後後台訂單如圖:
其中GS/AK的爲防漏單的訂單,隻有在出現漏單的時候才會查看這些訂單,裏面的信息跟正常訂單相比會少一個交易号,但是至少是可以看到客戶信息及所購買了什麽産品…
如果需要更完美的做法, 爲防止顧客在訪問checkout process的時候會重複生成訂單, 那麽就需要加個判斷
if($_SESSION['payment']!=’paypal’){
/*// create the order record
$insert_id = $order->create($order_totals, 2);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_CREATE’);
$payment_modules->after_order_create($insert_id);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_PAYMENT_MODULES_AFTER_ORDER_CREATE’);
// store the product info to the order
$order->create_add_products($insert_id);
$_SESSION['order_number_created'] = $insert_id;
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_CREATE_ADD_PRODUCTS’);
//send email notifications
$order->send_order_email($insert_id, 2);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_SEND_ORDER_EMAIL’);*/
}
而且在确認頁面,如果顧客一直刷新頁面,就會一直生成訂單,可以加個限制.
// create the order record 防漏單
if ($_SESSION['payment'] == ‘paypal’ and !isset($_SESSION['order_number_created'])) {
$insert_id = $order->create($order_totals, 2);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_CREATE’);
$payment_modules->after_order_create($insert_id);
$zco_notifier->notify(‘NOTIFY_CHECKOUT_PROCESS_AFTER_PAYMENT_MODULES_AFTER_ORDER_CREATE’);
// store the product info to the order
$order->create_add_products($insert_id);
$_SESSION['order_number_created'] = $insert_id;
}
在pages/checkout_payment/header_php.php任意位置加上unset($_SESSION['order_number_created']);
這樣,就算顧客在确認頁面一直刷新,因爲已經設置了$_SESSION['order_number_created'],訂單不再生成,
转载于:https://blog.51cto.com/wmrwx/1094807