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 escape URL编码
Dec 10 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
mac下安装nginx和php
Nov 04 PHP
php数组去重实例及分析
Nov 26 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
Apr 08 PHP
php检测文件编码的方法示例
Apr 25 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
php中JSON的使用与转换
Jan 14 PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
Laravel框架FormRequest中重写错误处理的方法
Feb 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
ArrayList类(增强版)
2007/04/04 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
python代码打印100-999之间的回文数示例
2019/11/24 Python
python3 logging日志封装实例
2020/04/08 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
database面试题
2013/03/28 面试题
员工年终演讲稿
2014/01/03 职场文书
青蓝工程实施方案
2014/03/27 职场文书
事业单位岗位说明书
2015/10/08 职场文书
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server