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

本文实例讲述了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 framework相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《PHP操作zip文件及压缩技巧总结》、《php文件操作总结》、《ThinkPHP入门教程》、《ThinkPHP常用方法总结》、《smarty模板入门基础教程》及《PHP模板技术总结》。

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

(0)

相关推荐

  • Zend Framework缓存Cache用法简单实例

    本文实例讲述了Zend Framework缓存Cache用法.分享给大家供大家参考,具体如下: <?php require 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Cache'); Zend_Loader::loadClass('Zend_Config'); Zend_Loader::loadClass('Zend_Registry'); $config = new Zend_Config_Ini('configsecr/config.in

  • python实现zencart产品数据导入到magento(python导入数据)

    python版本要求在3.3.x,需要mysql connector for python第三方库支持 不适用所有的zencart导入到magento 复制代码 代码如下: #encoding=utf-8#@ author:凋零#@ contact:342103944@qq.comimport mysql.connectorimport sysimport timeimport globimport osimport reimport shutilconfig={'host':'127.0.0.

  • Zend Framework教程之Bootstrap类用法概述

    本文实例讲述了Zend Framework中Bootstrap类用法.分享给大家供大家参考,具体如下: Zend_Application_Bootstrap_Bootstrapper Zend_Application_Bootstrap_Bootstrapper是所有引导类必须实现的基本接口.基本功能是用于配置,注册资源,引导(无论是单个资源或整个应用程序),并运行应用程序. 接口方法: Zend_Application_Bootstrap_Bootstrapper Interface Meth

  • php 修改zen-cart下单和付款流程以防止漏单

    用过zen-cart的人都知道,zen-cart中下单步骤是下面这样的(其中[]中的表示不是必须的): 1. 购物车(shopping cart) 2. [货运方式(delivery method)] 3. 支付方式(payment method) 4. 订单确认(confirmation) 5. [第三方网站支付] 6. 订单处理(checkout process)--这一步比较重要,因为会在这里将购物车中的信息写入订单 7. 下单成功(checkout success) 这样的流程在正常情况

  • zen cart新进商品的随机排序修改方法

    zencart新进商品的随机排序修改方法第一步:首先,新进商品可以自己定义时间段:商店设置-最大值-新进商品的定义 zencart新进商品的随机排序修改方法第二步: 修改首页上新进商品: /includes/modules/new_products.php 在$new_products_query里增加相应ORDER BY xxx 例:select distinct p.products_id, p.products_image,p.products_tax_class_id, pd.produ

  • zen cart实现订单中增加paypal中预留电话的方法

    本文实例讲述了zen cart实现订单中增加paypal中预留电话的方法.分享给大家供大家参考,具体如下: 在PayPal的IPN返回值中联系电话是 contact_phone, 前提是你帐户设定了买家在付款时预留电话,如果没有要求的话,该值默认是不会返回的. 但在zen cart的PAYPAL的支付插件里是不获取这个信息的,需要手动修改PAYPAL的程序.下面我们就修改: 一.在 paypal 表中增加 contact_phone 字段 ALTER TABLE `paypal` ADD `co

  • Zend Framework入门知识点小结

    本文总结分析了Zend Framework入门知识点.分享给大家供大家参考,具体如下: zend framework是MVC模式的一种实现,要快速的入门差不多只看Zend_Controller Zend_View 部分就可以了吧. 1.Zend_Controller部分.最重要的类是Zend_Controller_Front.使用它的经典代码很 简单: $front=Zend_Controller_Front::getInstance(); $front-> setControllerDirec

  • Zend Framework基本页面布局分析

    本文实例讲述了Zend Framework基本页面布局方法.分享给大家供大家参考,具体如下: Zend Framework 的页面布局模块--Zend_Layout--既可以跟 MVC 一起使用,也可以单独使用.本文只讨论与 MVC 一起使用的情况. 1.布局脚本 在 application/views 下创建一个 layouts 的文件夹.主布局脚本 layout.phtml 代码如下: <?php echo $this->doctype('XHTML1_STRICT') ?> <

  • Zend Framework+smarty用法实例详解

    本文实例讲述了Zend Framework+smarty用法.分享给大家供大家参考,具体如下: 一.Zend Framework简介 Zend Framework使用模型-视图-控制器(Model-View-Controller(MVC))结构.这个用来把你的程序分离成不同部分使得开发和维护变得容易. 运行Zend Framework需要:PHP 5.1.4 (或更高) .Web 服务器支持 mod_rewrite功能,本实例采用Apache. 从这里http://framework.zend.

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

    本文实例讲述了zen_cart实现支付前生成订单的方法.分享给大家供大家参考,具体如下: 除了paypal之外. 客户通过其他的支付方式进入index.php?main_page=checkout_confirmation这个页面就能生出订单. 但是!! paypal就有点与众不同, 它只能是从它的官网 [paypal.com] 返回来并且进入checkout_process这个页面后,才能生出订单 而意外常会发生:比如网络不顺. 又比如客户不小心在返回前就关了页面. 那么,我们的网站后台就看不

  • PHP实现RSA签名生成订单功能【支付宝示例】

    本文实例讲述了PHP实现RSA签名生成订单功能.分享给大家供大家参考,具体如下: //组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16位纯数字 $mygoods['partner']="2088011744308664"; //商家账号 $mygoods['seller']="2088011744308664"; //

  • Android开发实现生成excel的方法详解

    本文实例讲述了Android开发实现生成excel的方法.分享给大家供大家参考,具体如下: 都说程序员不爽产品经理,其实有的时候遇到一些奇葩的后台开发人员也会很不顺心.最近项目有这样一个要求,要生成一个excel然后发邮件给客户.结果后台人员直接把这个功能扔给客户端,理由是后台不好实现.听到这也就只能自己实现了(分分钟就想来个螺旋王扣它头上).这篇博客讲下如下在android中生成excel表并存到本地.先看下生成后的效果图: 初始化数据 首先我们要先造下测试数据,这里我把数据写死在一个常量类C

  • Angular+Node生成随机数的方法

    本文实例讲述了Angular+Node生成随机数的方法.分享给大家供大家参考,具体如下: 以前写过一个PHP生成随机数,然后jquey ajax获取,再jQuery改变文本的随机数的程序 现在用Angular 和 Node来重写一下 Angular的好处是双向绑定,这样直接设置变量,不用再重新设置了 Node的好处我目前还不是很理解,可以通过count这个例子来说明一下Node和PHP的不同之处 当然了,最大的好处就是,前后端都可以用JavaScript来写了,这样的话Javascript的水平

  • java生成XML的方法【附demo源码下载】

    本文实例讲述了java生成XML的方法.分享给大家供大家参考,具体如下: 下拉框的生成,我是通过javascript读取xml文件生成的.Xml文件是根据数据库生成的.Xml文件只相当于页面到数据库的一道缓存.这样利于性能.生成xml文件又是一件繁琐的事情.只好交给机器去做了.真正的情景是程序定期自动或人为手动触发程序生成xml.今天我单独把xml文件生成的功能剥离出来写了一个小程序. 具体的实现是,使用jxl.jar读取(我承认我很喜欢使用Execel写配置)的SQL语句.SQL要指明哪些是名

  • iOS本地动态生成验证码的方法

    前几天app注册被人攻击了,从网上找了这个先保存下.... 用于ios本地动态生成验证码,效果如下: 导入CoreGraphics.framework 用于绘制图形 封装UIView,便捷使用,代码如下: AuthcodeView.h #import <UIKit/UIKit.h> @interface AuthcodeView : UIView @property (strong, nonatomic) NSArray *dataArray;//字符素材数组 @property (stron

  • CI框架实现框架前后端分离的方法详解

    本文实例分析了CI框架实现框架前后端分离的方法.分享给大家供大家参考,具体如下: 我们在使用CI框架开发中(或者使用所有的其他框架开发中),总是习惯于将所开发项目的前端和后台分离开来,将各自的控制器.模型或视图放到不同的文件夹中.在这一点上ThinkPHP框架要比CI框架更要方便一些.这篇博文我们就讲述如何实现根据CI框架开发将前后端实现分离.(本文以本人开发的Pkadmin后台管理系统为例,Pkadmin后台管理系统是基于Codeigniter_v3.1.0框架和Olive Admin后台模版

  • PHP生成随机数的方法总结

    第一种方法用mt_rand() function GetRandStr($length){ $str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $len=strlen($str)-1; $randstr=''; for($i=0;$i<$length;$i++){ $num=mt_rand(0,$len); $randstr .= $str[$num]; } return $randstr; } $numb

  • Java微信支付之关闭订单

    本文实例为大家分享了java微信支付之关闭订单的具体代码,供大家参考,具体内容如下 官方文档 一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口 注意:订单生成后不能马上调用关单接口,最短调用时间间隔为5分钟. 二.接口地址 https://api.mch.weixin.qq.com/pay/closeorder 三.请求参数 只能根据自己商户系统的订单号关闭 package co

  • Qt生成随机数的方法

    目录 1.生成随机数 2.生成不重复的随机数 3.生成递增的随机数 1.生成随机数         生成随机数主要用到了函数qsrand和qrand,这两个函数在#include <QtGlobal>中,qsrand用来设置一个种子,该种子为qrand生成随机数的起始值.比如说qsrand(10),设置10为种子,那么qrand生成的随机数就在[10,32767]之间.而如果在qrand()前没有调用过qsrand(),那么qrand()就会自动调用qsrand(1),即系统默认将1作为随机数

随机推荐