zen_cart实现支付前生成订单的方法


Posted in PHP onMay 06, 2016

本文实例讲述了zen_cart实现支付前生成订单的方法。分享给大家供大家参考,具体如下:

除了paypal之外. 客户通过其他的支付方式进入index.php?main_page=checkout_confirmation这个页面就能生出订单.
但是!! paypal就有点与众不同, 它只能是从它的官网 [paypal.com] 返回来并且进入checkout_process这个页面后,才能生出订单

而意外常会发生:比如网络不顺. 又比如客户不小心在返回前就关了页面.

那么,我们的网站后台就看不到客户买的是什么产品(虽然在paypal后台能看到是谁买了,但确实是无法知道他到底买了什么,)这可是一个好郁闷的事情

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支付会运行这些生成订单的代码,加了这段后就不用担心会漏单了。

如果需要更完美的做法,为防止顾客在访问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']

订单不再生成,

如果顾客返回修改了购物车,再次到达checkout_payment时$_SESSION['order_number_created']将被清除,

其实,生成订单的代码可以写在modules/payment/paypal.php的 function confirmation()中。

代码如下:

function confirmation() {
if(!isset($_SESSION['order_number_created']))
{
global $order,$order_total_modules,$order_totals,$zco_notifier,$insert_id; 
$zco_notifier->notify('NOTIFY_CHECKOUT_PROCESS_BEGIN'); // if the customer is not logged on, redirect them to the time out page
if (!$_SESSION['customer_id']) 
{ 
zen_redirect(zen_href_link(FILENAME_TIME_OUT)); 
} 
else 
{ // validate customer 
if (zen_get_customer_validate_session($_SESSION['customer_id']) == false) 
{ 
$_SESSION['navigation']->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_SHIPPING));
zen_redirect(zen_href_link(FILENAME_LOGIN, '', 'SSL')); 
} 
} 
if(isset($mycartID)&&$mycartID == $_SESSION['cart']->cartID)
{ 
return array('title' => MODULE_PAYMENT_PAYPAL_TEXT_DESCRIPTION); 
} 
$mycartID = $_SESSION['cart']->cartID; 
$order = new order; // prevent 0-entry orders from being generated/spoofed 
if (sizeof($order->products) < 1) 
{ 
zen_redirect(zen_href_link(FILENAME_SHOPPING_CART)); 
} 
$order_total_modules = new order_total; 
$zco_notifier->notify('NOTIFY_CHECKOUT_PROCESS_BEFORE_ORDER_TOTALS_PRE_CONFIRMATION_CHECK');
//$order_totals = $order_total_modules->pre_confirmation_check(); 
$zco_notifier->notify('NOTIFY_CHECKOUT_PROCESS_BEFORE_ORDER_TOTALS_PROCESS'); 
$order_totals = $order_total_modules->process(); 
$zco_notifier->notify('NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_TOTALS_PROCESS'); 
if (!isset($_SESSION['payment']) && !$credit_covers) 
{ 
zen_redirect(zen_href_link(FILENAME_DEFAULT)); 
} // load the before_process
// load the before_process function from the payment modules 
//$zco_notifier->notify('NOTIFY_CHECKOUT_PROCESS_AFTER_PAYMENT_MODULES_BEFOREPROCESS');
// create the order record 
$insert_id = $order->create($order_totals, 2); 
require(DIR_WS_LANGUAGES.'english/email_extras.php'); 
require(DIR_WS_LANGUAGES.'english/checkout_process.php'); 
// 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');
$order->send_order_email($insert_id, 2);
if (is_array($order_total_modules->modules)) 
{
reset($order_total_modules->modules);
while (list(, $value) = each($order_total_modules->modules)) 
{
$class = substr($value, 0, strrpos($value, '.'));
if (!isset($GLOBALS[$class])) continue;
$GLOBALS[$class]->output=null;
}
}
}
else 
return false;
}

希望本文所述对大家基于zend框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一个ftp类(ini.php)
Oct 09 PHP
php中的时间显示
Jan 18 PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 PHP
学习PHP的数组总结【经验】
May 05 #PHP
关于php中一些字符串总结
May 05 #PHP
php实现计算百度地图坐标之间距离的方法
May 05 #PHP
php求数组全排列,元素所有组合的方法
May 05 #PHP
php遍历解析xml字符串的方法
May 05 #PHP
Joomla调用系统自带编辑器的实现方法
May 05 #PHP
yii2超好用的日期组件和时间组件
May 05 #PHP
You might like
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
ezSQL PHP数据库操作类库
2010/05/16 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
phpfpm的作用和用法
2019/10/10 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
python和ruby,我选谁?
2017/09/13 Python
python中lambda()的用法
2017/11/16 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
会计辞职信范文
2014/01/15 职场文书
少先队活动总结
2014/08/29 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
大学生自荐信范文
2015/03/05 职场文书
运动会广播稿300字
2015/08/19 职场文书