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 相关文章推荐
初学者入门:细述PHP4的核心Zend
Sep 05 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
Oct 09 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
Dec 25 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
如何设置mysql允许外网访问
Jun 04 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
php封装的单文件(图片)上传类完整实例
Oct 18 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接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
jQuery 1.0.2
2006/10/11 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
js opener的使用详解
2014/01/11 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
详谈javascript异步编程
2016/02/21 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
理解javascript async的用法
2017/08/22 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
python使用matplotlib库生成随机漫步图
2018/08/27 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
python中count函数简单用法
2020/01/05 Python
荷兰超市:DEEN
2018/03/14 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
市场部专员岗位职责
2013/11/30 职场文书
学校对教师的评语
2014/04/28 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
2016寒假假期总结
2015/10/10 职场文书
党员干部学习心得体会
2016/01/23 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis