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初学者头疼问题总结
Oct 09 PHP
php入门教程 精简版
Dec 13 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
基于empty函数的判断详解
Jun 17 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
destoon后台网站设置变成空白的解决方法
Jun 21 PHP
php缓冲输出实例分析
Jan 05 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
微信企业转账之入口类分装php代码
Oct 01 PHP
PHP抽象类和接口用法实例详解
Jul 20 PHP
Laravel 自动生成验证的实例讲解:login / logout
Oct 14 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Python中print函数简单使用总结
2019/08/05 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python