PHP教程

PHP tp6 订单页面

本文主要是介绍PHP tp6 订单页面,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
//controller

 /**
     * 显示结算页面
     *
     * @return \think\Response
     */
    public function create()
    {
        //登录检测
        if(!session('?user_info')){
            //没有登录 跳转到登录页面
            //设置登录成功后的跳转地址
            //sessr/create');
//            session('backion('back_url', 'home/orde_url', 'home/cart/index');
            $this->redirect('home/login/login');
        }
        //获取收货地址信息
        //获取用户id
        $user_id = session('user_info.id');
        $address = \app\common\model\Address::where('user_id', $user_id)->select();
//        echo \app\common\model\Address::getLastSql();die;
//        halt($address);die;
        //查询选中的购物记录以及商品信息和SKU规格商品信息
//        $cart_data = \app\common\model\Cart::with('goods,spec_goods')->where('is_selected', 1)->where('user_id', $user_id)->select();
//        $cart_data = (new \think\Collection($cart_data))->toArray();
//        $total_price = 0;
//        $total_number = 0;
//        foreach($cart_data as &$v){
//            //使用sku的价格,覆盖商品价格
//            if(isset($v['price']) && $v['price']>0){
//                $v['goods_price'] = $v['price'];
//            }
//            if(isset($v['cost_price2']) && $v['cost_price2']>0){
//                $v['cost_price'] = $v['cost_price2'];
//            }
//            //库存处理
//            if(isset($v['store_count']) && $v['store_count']>0){
//                $v['goods_number'] = $v['store_count'];
//            }
//            if(isset($v['store_frozen']) && $v['store_frozen']>0){
//                $v['frozen_number'] = $v['store_frozen'];
//            }
//            //累加总数量和总价格
//            $total_number += $v['number'];
//            $total_price += $v['number'] * $v['goods_price'];
//        }
//        unset($v);
//        获取选中的购物记录以及商品信息,统计总数量和价格
        $res = \app\home\logic\OrderLogic::getCartDataWithGoods();
        $res['address'] = $address;
//        return view('create', $res);
        $cart_data = $res['cart_data'];
        $total_number = $res['total_number'];
        $total_price = $res['total_price'];

        return view('create', ['address'=>$address, 'cart_data'=>$cart_data, 'total_number'=>$total_number, 'total_price' => $total_price]);
        //return view('create', compact('address', 'cart_data', 'total_number', 'total_price'));
    }

    /**
     * 提交订单
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
//    public function save(Request $request)
//    {
//        //接收参数
//        $params = input();
//        //参数检测
//        $validate = $this->validate($params, [
//            'address_id' => 'require|integer|gt:0'
//        ]);
//        if($validate !== true){
//            $this->error($validate);
//        }
//        //组装订单表数据 添加一条
//        //查询收货地址
//        $address = \app\common\model\Address::find($params['address_id']);
//        if(!$address){
//            $this->error('请重新选择收货地址');
//        }
//        //订单编号
//        $order_sn = time() . mt_rand(100000, 999999);
//        $user_id = session('user_info.id');
//        //查询结算的商品(选中的购物记录以及商品和SKU信息)
//        $res = \app\home\logic\OrderLogic::getCartDataWithGoods();
//        //$res['cart_data']  $res['total_number'] $res['total_price']
//        $order_data = [
//            'user_id' => $user_id,
//            'order_sn' => $order_sn,
//            'consignee' => $address['consignee'],
//            'address' => $address['area'] . $address['address'],
//            'phone' => $address['phone'],
//            'goods_price' => $res['total_price'], //商品总价
//            'shipping_price' => 0,//邮费
//            'coupon_price' => 0,//优惠金额
//            'order_amount' => $res['total_price'],//应付金额=商品总价+邮费-优惠金额
//            'total_amount' => $res['total_price'],//订单总金额=商品总价+邮费
//        ];
//        //开启事务
//        \think\Db::startTrans();
//        try{
//            //创建订单前 进行库存检测
//            foreach($res['cart_data'] as $v){
//                // $v['number']  $v['goods_number']
//                if($v['number'] > $v['goods_number']){
//                    //抛出异常 直接进入catch语法结构
//                    throw new \Exception('订单中包含库存不足的商品');
//                }
//            }
//            $order = \app\common\model\Order::create($order_data);
//            //向订单商品表添加多条数据
//            $order_goods_data = [];
//            foreach($res['cart_data'] as $v){
//                $row = [
//                    'order_id' => $order['id'],
//                    'goods_id' => $v['goods_id'],
//                    'spec_goods_id' => $v['spec_goods_id'],
//                    'number' => $v['number'],
//                    'goods_name' => $v['goods_name'],
//                    'goods_logo' => $v['goods_logo'],
//                    'goods_price' => $v['goods_price'],
//                    'spec_value_names' => $v['value_names'],
//                ];
//                $order_goods_data[] = $row;
//            }
//            //批量添加
//            $model = new \app\common\model\OrderGoods();
//            $model->saveAll($order_goods_data);
//            //从购物车表删除对应数据
//            //\app\common\model\Cart::where(['user_id' => $user_id, 'is_selected'=>1])->delete();
//            //\app\common\model\Cart::where('user_id',$user_id)->where('is_selected',1)->delete();
//            //库存预扣减(冻结库存)
//            $spec_goods = [];
//            $goods = [];
//            foreach($res['cart_data'] as $v){
//                //判断是否有SKU 有则修改SKU表,无则修改商品表
//                if($v['spec_goods_id']){
//                    //修改SKU表  购买数量$v['number']  库存$v['goods_number']  冻结$v['frozen_number']
//                    $row = [
//                        'id'=>$v['spec_goods_id'],
//                        'store_count' => $v['goods_number'] - $v['number'],
//                        'store_frozen' => $v['frozen_number'] + $v['number']
//                    ];
//                    $spec_goods[] = $row;
//                }else{
//                    //修改商品表  购买数量$v['number']  库存$v['goods_number']  冻结$v['frozen_number']
//                    $row = [
//                        'id'=>$v['goods_id'],
//                        'goods_number' => $v['goods_number'] - $v['number'],
//                        'frozen_number' => $v['frozen_number'] + $v['number']
//                    ];
//                    $goods[] = $row;
//                }
//            }
//            //批量修改库存
//            $sku_model = new \app\common\model\SpecGoods();
//            $sku_model->saveAll($spec_goods);
//            $goods_model = new \app\common\model\Goods();
//            $goods_model->saveAll($goods);
//            //提交事务
//            \think\Db::commit();
//            /*聚合支付 开始*/
//            //二维码图片中的支付链接(本地项目自定义链接,传递订单id参数)
//            //$url = url('/home/order/qrpay', ['id'=>$order->order_sn], true, true);
//            //用于测试的线上项目域名 http://pyg.tbyue.com
////            $url = url('/home/order/qrpay', ['id'=>$order->order_sn, 'debug'=>'true'], true, "http://pyg.tbyue.com");
////            //生成支付二维码
////            $qrCode = new \Endroid\QrCode\QrCode($url);
////            //二维码图片保存路径(请先将对应目录结构创建出来,需要具有写权限)
////            $qr_path = '/uploads/qrcode/'.uniqid(mt_rand(100000,999999), true).'.png';
////            //将二维码图片信息保存到文件中
////            $qrCode->writeFile('.' . $qr_path);
////            $this->assign('qr_path', $qr_path);
//            /*聚合支付 结束*/
//            //展示选择支付方式页面 。。。
//            $pay_type = config('pay_type');
//            return view('pay', ['order_sn' => $order_sn, 'pay_type'=>$pay_type, 'total_price'=>$res['total_price']]);
//        }catch (\Exception $e){
//            //回滚事务
//            \think\Db::rollback();
//            //$msg = $e->getMessage();
//            //$this->error($msg);
//            $this->error('创建订单失败,请重试');
//        }
//
//    }

    public function save(){
        //接收参数
        $params = input();
        //参数检测
        $validate = $this->validate($params, [
            'address_id' => 'require|integer|gt:0'
        ]);
        if($validate !== true){
            $this->error($validate);
        }
        //组装订单表数据 添加一条
        //查询收货地址
        $address = \app\common\model\Address::find($params['address_id']);
        if(!$address){
            $this->error('请重新选择收货地址');
        }
        //订单编号
        $order_sn = time() . mt_rand(100000, 999999);
        $user_id = session('user_info.id');
        //查询结算的商品(选中的购物记录以及商品和SKU信息)
        $res = \app\home\logic\OrderLogic::getCartDataWithGoods();
        //$res['cart_data']  $res['total_number'] $res['total_price']
        $order_data = [
            'user_id' => $user_id,
            'order_sn' => $order_sn,
            'consignee' => $address['consignee'],
            'address' => $address['area'] . $address['address'],
            'phone' => $address['phone'],
            'goods_price' => $res['total_price'], //商品总价
            'shipping_price' => 0,//邮费
            'coupon_price' => 0,//优惠金额
            'order_amount' => $res['total_price'],//应付金额=商品总价+邮费-优惠金额
            'total_amount' => $res['total_price'],//订单总金额=商品总价+邮费
        ];
        //开启事务
        \think\Db::startTrans();
        try{
            //创建订单前 进行库存检测
            foreach($res['cart_data'] as $v){
                // $v['number']  $v['goods_number']
                if($v['number'] > $v['goods_number']){
                    //抛出异常 直接进入catch语法结构
                    throw new \Exception('订单中包含库存不足的商品');
                }
            }
            $order = \app\common\model\Order::create($order_data);
//            //向订单商品表添加多条数据
//            $order_goods_data = [];
//            foreach($res['cart_data'] as $v){
//                $row = [
//                    'order_id' => $order['id'],
//                    'goods_id' => $v['goods_id'],
//                    'spec_goods_id' => $v['spec_goods_id'],
//                    'number' => $v['number'],
//                    'goods_name' => $v['goods_name'],
//                    'goods_logo' => $v['goods_logo'],
//                    'goods_price' => $v['goods_price'],
//                    'spec_value_names' => $v['value_names'],
//                ];
//                $order_goods_data[] = $row;
//            }
//            //批量添加
//            $model = new \app\common\model\OrderGoods();
//            $model->saveAll($order_goods_data);
//            //从购物车表删除对应数据
//            //\app\common\model\Cart::where(['user_id' => $user_id, 'is_selected'=>1])->delete();
//            //\app\common\model\Cart::where('user_id',$user_id)->where('is_selected',1)->delete();
//            //库存预扣减(冻结库存)
//            $spec_goods = [];
//            $goods = [];
//            foreach($res['cart_data'] as $v){
//                //判断是否有SKU 有则修改SKU表,无则修改商品表
//                if($v['spec_goods_id']){
//                    //修改SKU表  购买数量$v['number']  库存$v['goods_number']  冻结$v['frozen_number']
//                    $row = [
//                        'id'=>$v['spec_goods_id'],
//                        'store_count' => $v['goods_number'] - $v['number'],
//                        'store_frozen' => $v['frozen_number'] + $v['number']
//                    ];
//                    $spec_goods[] = $row;
//                }else{
//                    //修改商品表  购买数量$v['number']  库存$v['goods_number']  冻结$v['frozen_number']
//                    $row = [
//                        'id'=>$v['goods_id'],
//                        'goods_number' => $v['goods_number'] - $v['number'],
//                        'frozen_number' => $v['frozen_number'] + $v['number']
//                    ];
//                    $goods[] = $row;
//                }
//            }
//            //批量修改库存
//            $sku_model = new \app\common\model\SpecGoods();
//            $sku_model->saveAll($spec_goods);
//            $goods_model = new \app\common\model\Goods();
//            $goods_model->saveAll($goods);
//            //提交事务
            \think\Db::commit();
            //展示选择支付方式页面 。。。
            $pay_type = config('pay_type');
            return view('pay', ['order_sn' => $order_sn, 'pay_type'=>$pay_type, 'total_price'=>$res['total_price']]);
        }catch (\Exception $e){
            //回滚事务
            \think\Db::rollback();
            //$msg = $e->getMessage();
            //$this->error($msg);
            $this->error('创建订单失败,请重试');
        }
    }

    /**
     * 去支付
     */
    public function pay()
    {
        echo 111;
        //接收参数
        $params = input();
        //检测参数
        $validate = $this->validate($params, [
            'order_sn' => 'require',
            'pay_code|支付方式' => 'require'
        ]);
        if($validate !== true){
            $this->error($validate);
        }
        //查询订单
        $user_id = session('user_info.id');
        $order = \app\common\model\Order::where('order_sn', $params['order_sn'])->where('user_id', $user_id)->find();
        if(!$order){
            $this->error('订单不存在');
        }
        //将选择的支付方式,修改到订单表
        $pay_type = config('pay_type');
        $order->pay_code = $params['pay_code'];
        //$order->pay_name = config('pay_type.' . $params['pay_code'])['pay_name'];
        $order->pay_name = $pay_type[$params['pay_code']]['pay_name'];
        $order->save();
        //支付(根据支付方式进行处理)
        switch ($params['pay_code']){
            case 'wechat':
                //微信支付
                break;
            case 'union':
                //银联支付
                break;
            case 'alipay':
                //支付宝
            default:
            //默认 支付宝
            echo "<form id='alipayment' action='/plugins/alipay/pagepay/pagepay.php' method='post' style='display:none'>
    <input id='WIDout_trade_no' name='WIDout_trade_no' value='{$order['order_sn']}'/>
    <input id='WIDsubject' name='WIDsubject' value='品优购订单' />
    <input id='WIDtotal_amount' name='WIDtotal_amount' value='{$order['order_amount']}'/>
    <input id='WIDbody' name='WIDbody' value='品优购订单,测试订单,你付款了我也不发货' />
</form><script>document.getElementById('alipayment').submit();</script>";
                break;
        }
    }

    /**
     * 页面跳转 同步通知地址  get请求
     */
    public function callback()
    {
        //参考/plugins/alipay/return_url.php
        //接收参数
        $params = input();
        //参数检测(签名验证)  接收到的参数 和 支付宝传递的参数 是否发生改变
        require_once("./plugins/alipay/config.php");
        require_once './plugins/alipay/pagepay/service/AlipayTradeService.php';
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($params);
        if($result){
            //验签成功
            $order_sn = $params['out_trade_no'];
            $order = \app\common\model\Order::where('order_sn', $order_sn)->find();
            //展示结果
            return view('paysuccess', ['pay_name' => '支付宝', 'order_amount'=>$params['total_amount'], 'order' => $order]);
        }else{
            //验签失败
            //展示结果
            return view('payfail', ['msg' => '支付失败']);
        }

    }

    /**
     * 支付宝异步通知地址,订单状态修改等逻辑 post请求
     * 这个方法本地测试 不会执行。
     */
    public function notify()
    {
        //接收参数
        $params = input();
        //记录日志
        trace('支付宝异步通知-home/order/notify:'.json_encode($params), 'debug');
        //参考 /plugins/alipay/notify_url.php
        //参数检测(签名验证)  接收到的参数 和 支付宝传递的参数 是否发生改变
        require_once("./plugins/alipay/config.php");
        require_once './plugins/alipay/pagepay/service/AlipayTradeService.php';
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($params);
        if(!$result){
            //验证签名失败
            //记录日志
            trace('支付宝异步通知-home/order/notify:验签失败', 'error');
            echo 'fail';die;
        }
        //验签成功
        $order_sn = $params['out_trade_no'];
        $trade_status = $params['trade_status'];
        if($trade_status == 'TRADE_FINISHED'){
            //交易已经处理过
            echo 'success';die;
        }
        //交易尚未处理
        $order = \app\common\model\Order::where('order_sn', $order_sn)->find();
        if(!$order){
            //订单不存在
            //记录日志
            trace('支付宝异步通知-home/order/notify:订单不存在', 'error');
            echo 'fail';die;
        }
        if($order['order_amount'] != $params['total_amount']){
            //支付金额不对
            //记录日志
            trace('支付宝异步通知-home/order/notify:支付金额不对', 'error');
            echo 'fail';die;
        }
        //修改订单状态
        if($order['order_status'] == 0){
            $order->order_status = 1;
            $order->pay_time = time();
            $order->save();
            //记录支付信息 核心字段 支付宝订单号
            $json = json_encode($params);
            //添加数据到 pyg_pay_log表  用于后续向支付宝发起交易查询
            \app\common\model\PayLog::create(['order_sn' => $order_sn, 'json'=>$json ]);
            echo 'success';die;
        }
        echo 'success';die;
    }
这篇关于PHP tp6 订单页面的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!