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 相关文章推荐
php 模拟get_headers函数的代码示例
Apr 27 PHP
解析php中const与define的应用区别
Jun 18 PHP
php ios推送(代码)
Jul 01 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
php强制更新图片缓存的方法
Feb 11 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
php排序算法实例分析
Oct 17 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
php访问对象中的成员的实例方法
Nov 17 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
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php编程每天必学之验证码
2016/03/03 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
JavaScript学习笔记之基础语法
2015/01/22 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
python 实现控制鼠标键盘
2020/11/27 Python
Python实现微信表情包炸群功能
2021/01/28 Python
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
毕业生找工作推荐信
2013/11/21 职场文书
化工专业推荐信范文
2013/11/28 职场文书
电气工程师岗位职责
2014/01/01 职场文书
小学生作文评语
2014/04/18 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
师德师风自查材料
2014/10/14 职场文书
慈善献爱心倡议书
2015/04/27 职场文书