Zencart Paypal先生成订单再付款且是礼物付款

百度了很多Zencart Paypal先生成订单再付款的教程,基本都是同一个方法就是防漏单的,但是这不是我要的,我要的是可以礼物付款而不是商品付款,所以我就结合了网站的很多方法,自己写了一个!

ZenCart默认的下单流程是:

购物车(shopping cart)->[货运方式(shipping method)]->支付方式(payment method)->订单确认(confirmation)->[第三方网站支付]->订单处理(checkout process)->下单成功(checkout success)。

我之前也是按网站上的教程,把代码加在Zencart主题的根目录includes\templates\当前模板名\templates\tpl_checkout_confirmation_default.php文件中 echo TITLE_CONTINUE_CHECKOUT_PROCEDURE . ‘<br />’ . TEXT_CONTINUE_CHECKOUT_PROCEDURE; 这段代码的后面。

这个方法是可以在支付前生成订单,但是不稳定,经常生成订单失败,所以我就修改了生成订单的文件!

以上面的方法是在根目录includes\templates\当前模板名\templates\tpl_checkout_confirmation_default.php 这个文件也就是结算页要提交订单的页面生成订单,而我是在点击提交按钮后处理跳转到支付页面的文件中生成订单!

所以我就在 根目录includes\templates\当前模板名\templates\tpl_fec_confirmation_default.php  在这个文件的顶部加入生成订单并跳转到Paypal的支付页面,为了不干扰其它支付接口,还要做个判断,代码如下:

$class = $_SESSION[‘payment’];

if($class == ‘paypal’){

echo "Your order is being processed, please wait...";
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;
		}
	}

	$pools = array('xxxxxxxx%2540outlook.com','xxxxxxx%2540outlook.com','xxxxxxx%2540outlook.com');
	$rand = mt_rand(0,count($pools)-1);
	$value = $pools[$rand];
	$order_id = "ds".$_SESSION['order_number_created'];
	$price = $order_totals[2]['value'];

	$url = "http://www.paypal.com/authflow/entry/?returnUri=%2Fmyaccount%2Ftransfer%2Fsend%2Fexternal%2FauthFlow%3Frecipient%3D$value%26payerId%3D%26displayName%3D%26thumbnailUrl%3D%26amount%3D$price%26currencyCode%3DUSD%26note%3D$order_id&flowId=&flowContext=p2p";

	unset($_SESSION['order_number_created']);

	echo "<script language='javascript'>";
	echo "location.href='".$url."'";
	//echo "alert('".$url."');";
	echo "</script>";

	exit();

}else{
	echo "<script language='javascript'>";
	echo "alert('Order generation failed, please reorder!');";
	echo "location.href='https://www.xxxxx.shop/index.php?main_page=checkout&fecaction=null'";
	echo "</script>";

	unset($_SESSION['order_number_created']);

	exit();
}

}

而且还可以设置多个Paypal帐号随机获取然后支付,代码如下:

$pools = array(‘xxxxxxxx%2540outlook.com’,’xxxxxxx%2540outlook.com’,’xxxxxxx%2540outlook.com’);

其中的 “%2540” 这个就是 “@” 是经过转码的。

unset($_SESSION[‘order_number_created’]); 这段代码是用来支付后清空生成的订单号,不然会地下生成不了新订单,因为被旧订单号所占用。

echo “location.href=’https://www.xxxxx.shop/index.php?main_page=checkout&fecaction=null'”; 这段代码是用来生成订单失败,重新返回到结算页面重新提交!

上面方法和代码已经测试可以跳转到Paypal的礼物支付页面! 因为已有成功支付!

所跳转到的Paypal的支付页面如下图:

相关说明:

1、终身VIP会员无限制任意下载,免积分。即前往开通>>

2、下载积分可通过日常 签到 以及 积分兑换 等途径获得!

3、本站资源无解压密码.

4、本站资源大多存储在云盘,如出现链接失效请评论反馈。

5、本站提供的免费源码、模板、软件工具等其他资源,均不包含技术服务,请大家谅解!资源仅供参考学习只用,请勿用于任何商业用途,请支持正版。

6、源码、模板等资源会随着技术、环境的升级而存在部分问题,还请慎重选择。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
南方小强 » Zencart Paypal先生成订单再付款且是礼物付款

发表评论