<?php

namespace app\index\controller;

use app\common\controller\Frontend;
use app\admin\model\Shangpin;
use app\admin\model\Order;


class Index extends Frontend
{

    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';
    protected $layout = '';


    public function _initialize()
    {
        parent::_initialize();
        $this->site=config("site");

        //官方测试商户号和密匙
        $this->site['zfpid']='20220726190052';
        $this->site['zfkey']='vg9ZRZN4FOKtDM06UfqH69GDJoG4gGIJ';
    }

    public function index()
    {
        $splist=Shangpin::where("status","normal")->paginate(10);
        if($this->request->isAjax()){
            $this->success("ok",'',$splist);
        }
        $this->view->assign("splist", $splist);
        return $this->view->fetch();
    }


    /**
     * 加入购物车
     */
    public function cart(){
        $act=$this->request->param("act");
        if($act=="delall"){
            Cookie("car",[],2600000);
            $this->success("购物车已清空",'',[]);
        }


        $id=$this->request->param("id/d");
        $num=$this->request->param("num/d",0);
        $car=cookie("car");
        $car= empty($car) ? [] : $car;

        if($act=="add"){
            $car[$id]= empty($car[$id]) ? 1 : $car[$id]+1;
            cookie("car",$car,2600000);
        }else if(!empty($id)){ //更新购物车
            if($num){ //大于0
                 $car[$id]= $num;
            }else{ //小于0
                unset($car[$id]);
            }
            cookie("car",$car,2600000);
        }
        //根据购物车读取商品
        $list=Shangpin::where('id','in',array_keys($car))->where("status","normal")->select();
        $allnum=0;
        $alljiage=0;
        $html="";
        foreach ($list as $key => $item) {
            $item->num=$car[$item->id];
            $allnum++;
            $alljiage=bcadd($alljiage,bcmul($item->jiage,$item->num,2),2);
            $html.="<li><h6 class='title ellipsis'>{$item->name}</h6><span class='price'>¥<em>{$item->jiage}</em></span><div class='numbox'><a class='press sub' href='javascript:;' onclick='jiajian({$item->id},".bcsub($item->num,1,0).");'>-</a><input type='text' value='{$item->num}' class='booknum' readonly><a class='press add' href='javascript:;' onclick='jiajian({$item->id},".bcadd($item->num,1,0).");'>+</a></div></li>";

        }
        $this->success("购物车已更新",'',['list'=>$list,'allnum'=>$allnum,'alljiage'=>$alljiage,'html'=>$html]);
    }

    public function checkout()
    {
         //根据购物车读取商品
        $car=cookie("car");
        $car= empty($car) ? [] : $car;
        if(empty($car)){
            $this->error("您的购物车暂无商品,请先选择商品!",url('index/index/index'));
        }

        $list=Shangpin::where('id','in',array_keys($car))->where("status","normal")->select();
        $allnum=0;
        $alljiage=0;
        $html="";
        foreach ($list as $key => $item) {
            $item->num=$car[$item->id];
            $allnum++;
            $alljiage=bcadd($alljiage,bcmul($item->jiage,$item->num,2),2);
        }

        $this->view->assign("splist", $list);
        $this->view->assign("allnum", $allnum);
        $this->view->assign("alljiage", $alljiage);


        //判断浏览器
       $type="";
       if(strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !== false ){
            $type="wxpay";
       }else if(strpos($_SERVER['HTTP_USER_AGENT'],'AlipayClient') !== false ){
            $type="alipay";
       }
        $this->view->assign("type", $type);
        return $this->view->fetch();
    }

    public function pay()
    {
        $type=$this->request->param("type",'alipay'); //支持设置支付宝:alipay 微信支付:wxpay


        $car=cookie("car");
        $car= empty($car) ? [] : $car;
        if(empty($car)){
            $this->error("您的购物车暂无商品,请先选择商品!",url('index/index/index'));
        }
        $list=Shangpin::where('id','in',array_keys($car))->where("status","normal")->select();
        $alljiage=0;
        foreach ($list as $key => $item) {
            $item->num=$car[$item->id];
            $alljiage=bcadd($alljiage,bcmul($item->jiage,$item->num,2),2);
        }


        $notify_url= request()->domain(). url('index/index/notify');//异步回调地址
        $return_url= request()->domain(). url('index/index/return'); //同步回调地址
        $out_trade_no=date("Ymdhms").rand(1000,9999);//商户端订单号,不可重复
        $name="订单支付{$alljiage}元";//商品名称
        $money=$alljiage;//订单金额,最多保留2位小数
        $sign_type="MD5";//签名方式,目前仅支持MD5
        $param="";//附加信息,回调时原样返回

        $arr = array(
            "pid" => $this->site['zfpid'],
            "type" => $type,
            "notify_url" => $notify_url,
            "return_url" => $return_url,
            "out_trade_no" => $out_trade_no,
            "name" => $name,
            "money" => $money,
            "param" => $param,
            "sign_type" => $sign_type
        );

        $addres=(new Order)->allowField(true)->save([
            "sn"=>$out_trade_no,
            "title"=>$name,
            "amount"=>$money,
            "payamount"=>$money,
            "paytype"=>$type,
            "paytime"=>0,
            "json"=>json_encode($list),
            "ip"=>$this->request->ip(),
            "useragent"=>$_SERVER['HTTP_USER_AGENT'],
            "status"=>'wait',
        ]);

        if($addres){
            $sign=$this->get_sign($arr,$this->site['zfkey']);
            header("location:".$this->site['zfurl']."submit.php?pid={$this->site['zfpid']}&type=$type&notify_url=$notify_url&return_url=$return_url&out_trade_no=$out_trade_no&name=$name&money=$money&param=$param&sign_type=$sign_type&sign=$sign");
            exit;
        }else{
            $this->error("订单添加失败,请联系管理员或重试!");
        }
    }

    public function notify()
    {
        $money=$this->request->param('money');
        $name=$this->request->param('name');
        $pid=$this->request->param('pid');
        $out_trade_no=$this->request->param('out_trade_no');
        $trade_no=$this->request->param('trade_no');
        $trade_status=$this->request->param('trade_status');
        $type=$this->request->param('type');
        $trade_status=$this->request->param('trade_status');
        $sign=$this->request->param('sign');
        $sign_type=$this->request->param('sign_type');
        $arr=array(
            "pid" => $pid,
            "type" => $type,
            "out_trade_no" => $out_trade_no,
            "trade_no" => $trade_no,
            "name" => $name,
            "money" => $money,
            "trade_status"  => $trade_status,
            "sign_type" => $sign_type
        );
        //trace($arr,"zf_arr");
        if($sign==$this->get_sign($arr,$this->site['zfkey'])){
            //trace("ok","zf_ok");
            echo "success"; //返回success说明通知成功,不要删除本行
            (new Order)->where('sn',$out_trade_no)->update(['status'=>'ok','paytime'=>time()]);
        }else{
            //trace("err","zf_err");
            echo "error";
        }
    }
    public function return()
    {
        cookie("car",[]);
        return $this->view->fetch();
    }
    public function payres()
    {
        $out_trade_no=$this->request->param('out_trade_no');
        $row=Order::get(['sn'=>$out_trade_no]);
        if(!empty($row) && $row->status=="ok"){
            $this->success("",url('index/index/return',['act'=>'chenggong']));
        }else{
            $this->error();
        }
    }
    protected function get_sign(array $datas,$hashkey){
        ksort($datas);
        reset($datas);
        $pre =array();
        foreach ($datas as $key => $data){
            if(is_null($data)||$data===''){continue;}
            if($key=='sign' || $key=='sign_type'){
                continue;
            }
            $pre[$key]=stripslashes($data);
        }
        $arg  = '';
        $qty = count($pre);
        $index=0;
        foreach ($pre as $key=>$val){
            $arg.="$key=$val";
            if($index++<($qty-1)){
                $arg.="&";
            }
        }
        return strtolower(md5($arg.$hashkey));
    }

}

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部