生成订单过程分析

商品添加到购物车以后就要去生成订单,模块文件app/Lib/shop/cartModule.class.php,函数done

public function done()
{
$region4_id = intval($_REQUEST['region_lv4']);
$region3_id = intval($_REQUEST['region_lv3']);
$region2_id = intval($_REQUEST['region_lv2']);
$region1_id = intval($_REQUEST['region_lv1']);

if ($region4_id==0)
{
if ($region3_id==0)
{
if ($region2_id==0)
{
$region_id = $region1_id;
}
else
$region_id = $region2_id;
}
else
$region_id = $region3_id;
}
else
$region_id = $region4_id;

//获取用户提交的参数
$delivery_id = intval($_REQUEST['delivery']);
//支付方式id
$payment = intval($_REQUEST['payment']);
//用户余额支付
$account_money = floatval($_REQUEST['account_money']);
//所有用户余额
$all_account_money = intval($_REQUEST['all_account_money']);
$ecvsn = $_REQUEST['ecvsn']?addslashes(trim($_REQUEST['ecvsn'])):'';
$ecvpassword = $_REQUEST['ecvpassword']?addslashes(trim($_REQUEST['ecvpassword'])):'';

$user_id = intval($GLOBALS['user_info']['id']);
$session_id = es_session::id();

//根据用户id和会话id从购物车里获取商品
$goods_list = $GLOBALS['db']->getAll("select * from ".DB_PREFIX."deal_cart where session_id='".$session_id."' and user_id=".$user_id);
if(!$goods_list)
{
showErr($GLOBALS['lang']['CART_EMPTY_TIP'],$ajax);
}

//验证购物车,如果用户为空提示错误并要求用户登录
if(!$GLOBALS['user_info'])
{
showErr($GLOBALS['lang']['PLEASE_LOGIN_FIRST'],$ajax,url("shop","user#login"));
}

//查询商品
$deal_ids = $GLOBALS['db']->getAll("select distinct(deal_id) as deal_id from ".DB_PREFIX."deal_cart where session_id = '".$session_id."' and user_id = ".$user_id);
foreach($deal_ids as $row)
{
//验证商品销售时间
$checker = check_deal_time($row['deal_id']);
if($checker['status']==0)
{
showErr($checker['info']." ".$GLOBALS['lang']['DEAL_ERROR_'.$checker['data']],$ajax,url("shop","cart#index"));
}

//难商品数量
$checker = check_deal_number($row['deal_id']);
if($checker['status']==0)
{
showErr($checker['info']." ".$GLOBALS['lang']['DEAL_ERROR_'.$checker['data']],$ajax,url("shop","cart#index"));
}

//验证支付方式的支持
if($GLOBALS['db']->getOne("select define_payment from ".DB_PREFIX."deal where id = ".$row['deal_id'])==1)
{
if($GLOBALS['db']->getOne("select count(*) from ".DB_PREFIX."deal_payment where deal_id = ".$row['deal_id']." and payment_id = ".$payment))
{
showErr($GLOBALS['lang']['INVALID_PAYMENT'],$ajax,url("shop","cart#index"));
}
}
}

//开始验证关于属性的库存
$deal_attr_ids = $GLOBALS['db']->getAll("select deal_id,attr,name,attr_str from ".DB_PREFIX."deal_cart where session_id = '".es_session::id()."' and user_id = ".$user_id);
foreach($deal_attr_ids as $row)
{
$attr_setting_str = '';
if($row['attr_str']!='')
{
$attr_setting_str = $row['attr_str'];
}
if($attr_setting_str!='')
{
$checker = check_deal_number_attr($row['deal_id'],$attr_setting_str);
if($checker['status']==0)
{
if($ajax==1)
showErr($checker['info']." ".$GLOBALS['lang']['DEAL_ERROR_'.$checker['data']]."|".$row['deal_id']."|".$checker['attr'],$ajax,url("shop","cart#index"));
else
showErr($checker['info']." ".$GLOBALS['lang']['DEAL_ERROR_'.$checker['data']],$ajax,url("shop","cart#index"));
}
}
}




//结束验证购物车
//开始验证订单接交信息
require_once APP_ROOT_PATH."system/libs/cart.php";
$data = count_buy_total($region_id,$delivery_id,$payment,$account_money,$all_account_money,$ecvsn,$ecvpassword,$goods_list);


if($data['is_delivery'] == 1)
{
//配送验证
if(!$data['region_info']||$data['region_info']['region_level'] != 4)
{
showErr($GLOBALS['lang']['FILL_CORRECT_CONSIGNEE_ADDRESS']);
}
if(trim($_REQUEST['consignee'])=='')
{
showErr($GLOBALS['lang']['FILL_CORRECT_CONSIGNEE']);
}
if(trim($_REQUEST['address'])=='')
{
showErr($GLOBALS['lang']['FILL_CORRECT_ADDRESS']);
}
if(trim($_REQUEST['zip'])=='')
{
showErr($GLOBALS['lang']['FILL_CORRECT_ZIP']);
}
if(trim($_REQUEST['mobile'])=='')
{
showErr($GLOBALS['lang']['FILL_MOBILE_PHONE']);

}
if(!check_mobile(trim($_REQUEST['mobile'])))
{
showErr($GLOBALS['lang']['FILL_CORRECT_MOBILE_PHONE']);
}
if(!$data['delivery_info'])
{
showErr($GLOBALS['lang']['PLEASE_SELECT_DELIVERY']);
}
}

if(round($data['pay_price'],4)>0&&!$data['payment_info'])
{
showErr($GLOBALS['lang']['PLEASE_SELECT_PAYMENT']);
}
//结束验证订单接交信息

//开始生成订单
$now = get_gmtime();
$order['type'] = 0; //普通订单
$order['user_id'] = $user_id;
$order['create_time'] = $now;
$order['total_price'] = $data['pay_total_price']; //应付总额 商品价 - 会员折扣 + 运费 + 支付手续费
$order['pay_amount'] = 0;
$order['pay_status'] = 0; //新单都为零, 等下面的流程同步订单状态
$order['delivery_status'] = $data['is_delivery']==0?5:0;
$order['order_status'] = 0; //新单都为零, 等下面的流程同步订单状态
$order['return_total_score'] = $data['return_total_score']; //结单后送的积分
$order['return_total_money'] = $data['return_total_money']; //结单后送的现金
$order['memo'] = htmlspecialchars(addslashes(trim($_REQUEST['memo'])));
$order['region_lv1'] = intval($_REQUEST['region_lv1']);
$order['region_lv2'] = intval($_REQUEST['region_lv2']);
$order['region_lv3'] = intval($_REQUEST['region_lv3']);
$order['region_lv4'] = intval($_REQUEST['region_lv4']);
$order['address'] = htmlspecialchars(addslashes(trim($_REQUEST['address'])));
$order['mobile'] = htmlspecialchars(addslashes(trim($_REQUEST['mobile'])));
$order['consignee'] = htmlspecialchars(addslashes(trim($_REQUEST['consignee'])));
$order['zip'] = htmlspecialchars(addslashes(trim($_REQUEST['zip'])));
$order['deal_total_price'] = $data['total_price']; //团购商品总价
$order['discount_price'] = $data['user_discount'];
$order['delivery_fee'] = $data['delivery_fee'];
$order['ecv_money'] = 0;
$order['account_money'] = 0;
$order['ecv_sn'] = '';
$order['delivery_id'] = $data['delivery_info']['id'];
$order['payment_id'] = $data['payment_info']['id'];
$order['payment_fee'] = $data['payment_fee'];
$order['payment_fee'] = $data['payment_fee'];
$order['bank_id'] = htmlspecialchars(addslashes(trim($_REQUEST['bank_id'])));
//更新来路
$order['referer'] = $GLOBALS['referer'];
$user_info = es_session::get("user_info");
$order['user_name'] = $user_info['user_name'];
$coupon_mobile = htmlspecialchars(addslashes(trim($_REQUEST['coupon_mobile'])));
if($coupon_mobile!='')
$GLOBALS['db']->query("update ".DB_PREFIX."user set mobile = '".$coupon_mobile."' where id = ".intval($user_info['id']));

//生成订单号,保证唯一性
do
{
$order['order_sn'] = to_date(get_gmtime(),"Ymdhis").rand(10,99);
$GLOBALS['db']->autoExecute(DB_PREFIX."deal_order",$order,'INSERT','','SILENT');
$order_id = intval($GLOBALS['db']->insert_id());
}while($order_id==0);

//生成订单商品
foreach($goods_list as $k=>$v)
{
$goods_item = array();
$goods_item['deal_id'] = $v['deal_id'];
$goods_item['number'] = $v['number'];
$goods_item['unit_price'] = $v['unit_price'];
$goods_item['total_price'] = $v['total_price'];
$goods_item['name'] = addslashes($v['name']);
$goods_item['sub_name'] = addslashes($v['sub_name']);
$goods_item['attr'] = $v['attr'];
$goods_item['verify_code'] = $v['verify_code'];
$goods_item['order_id'] = $order_id;
$goods_item['return_score'] = $v['return_score'];
$goods_item['return_total_score'] = $v['return_total_score'];
$goods_item['return_money'] = $v['return_money'];
$goods_item['return_total_money'] = $v['return_total_money'];
$goods_item['buy_type'] = $v['buy_type'];
$goods_item['attr_str'] = $v['attr_str'];
$GLOBALS['db']->autoExecute(DB_PREFIX."deal_order_item",$goods_item,'INSERT','','SILENT');
}

//开始更新订单表的deal_ids
$deal_ids = $GLOBALS['db']->getOne("select group_concat(deal_id) from ".DB_PREFIX."deal_order_item where order_id = ".$order_id);
$GLOBALS['db']->query("update ".DB_PREFIX."deal_order set deal_ids = '".$deal_ids."' where id = ".$order_id);

//删除购物车
$GLOBALS['db']->query("delete from ".DB_PREFIX."deal_cart where session_id = '".$session_id."' and user_id = ".$user_id);

if($data['is_delivery']==1)
{
//保存收款人
$user_consignee = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user_consignee where user_id = ".$user_id." order by id desc");
$user_consignee['region_lv1'] = intval($_REQUEST['region_lv1']);
$user_consignee['region_lv2'] = intval($_REQUEST['region_lv2']);
$user_consignee['region_lv3'] = intval($_REQUEST['region_lv3']);
$user_consignee['region_lv4'] = intval($_REQUEST['region_lv4']);
$user_consignee['address'] = htmlspecialchars(addslashes(trim($_REQUEST['address'])));
$user_consignee['mobile'] = htmlspecialchars(addslashes(trim($_REQUEST['mobile'])));
$user_consignee['consignee'] = htmlspecialchars(addslashes(trim($_REQUEST['consignee'])));
$user_consignee['zip'] = htmlspecialchars(addslashes(trim($_REQUEST['zip'])));
$user_consignee['user_id'] = $user_id;
if(intval($user_consignee['id'])==0)
{
//新增
$GLOBALS['db']->autoExecute(DB_PREFIX."user_consignee",$user_consignee,'INSERT','','SILENT');
}
else
{
//更新
$GLOBALS['db']->autoExecute(DB_PREFIX."user_consignee",$user_consignee,'UPDATE','id='.$user_consignee['id'],'SILENT');
rm_auto_cache("consignee_info",array("consignee_id"=>intval($user_consignee['id'])));
}
}

//生成order_id 后
//1. 代金券支付
$ecv_data = $data['ecv_data'];
if($ecv_data)
{
$ecv_payment_id = $GLOBALS['db']->getOne("select id from ".DB_PREFIX."payment where class_name = 'Voucher'");
$payment_notice_id = make_payment_notice($ecv_data['money'],$order_id,$ecv_payment_id);
require_once APP_ROOT_PATH."system/payment/Voucher_payment.php";
$voucher_payment = new Voucher_payment();
$voucher_payment->direct_pay($ecv_data['sn'],$ecv_data['password'],$payment_notice_id);
}

//2. 余额支付
$account_money = $data['account_money'];
if(floatval($account_money) > 0)
{
$account_payment_id = $GLOBALS['db']->getOne("select id from ".DB_PREFIX."payment where class_name = 'Account'");
$payment_notice_id = make_payment_notice($account_money,$order_id,$account_payment_id);
require_once APP_ROOT_PATH."system/payment/Account_payment.php";
$account_payment = new Account_payment();
$account_payment->get_payment_code($payment_notice_id);
}

//3. 相应的支付接口
$payment_info = $data['payment_info'];
if($payment_info&&$data['pay_price']>0)
{
$payment_notice_id = make_payment_notice($data['pay_price'],$order_id,$payment_info['id']);
//创建支付接口的付款单
}

$rs = order_paid($order_id);
if($rs)
{
app_redirect(url("shop","payment#done",array("id"=>$order_id))); //支付成功
}
else
{
app_redirect(url("shop","payment#pay",array("id"=>$payment_notice_id)));
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值