<?php
 namespace Home\Controller;
 use Think\Controller;
 class PayController extends Controller{
        //在类初始化方法中，引入相关类库    
        public function _initialize() {
         vendor('Alipay.alipaycore');
         vendor('Alipay.alipaymd5');
         vendor('Alipay.alipaynotify');
         vendor('Alipay.alipaysubmit');    
     }
      
     //doalipay方法
        /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
          然后进行相关处理
        */
     public function doalipay(){
             /*********************************************************
             把alipayapi.php中复制过来的如下两段代码去掉，
            第一段是引入配置项，
            第二段是引入submit.class.php这个类。
           为什么要去掉？？
            第一，配置项的内容已经在项目的Config.php文件中进行了配置，我们只需用C函数进行调用即可；
            第二，这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入；所以这里不再需要；
            *****************************************************/
        // require_once("alipay.config.php");
        // require_once("lib/alipay_submit.class.php");
         
        //这里我们通过TP的C函数把配置项参数读出，赋给$alipay_config；
        $alipay_config=C('alipay_config');  
         /**************************请求参数**************************/
        $payment_type = "1"; //支付类型 //必填，不能修改
        $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
        $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
        $seller_email = C('alipay.seller_email');//卖家支付宝帐户必填
  
          
        /*$out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject = $_POST['ordsubject'];  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee = $_POST['ordtotal_fee'];   //付款金额  //必填 通过支付页面的表单进行传递
        $body = $_POST['ordbody'];  //订单描述 通过支付页面的表单进行传递
        $show_url = $_POST['ordshow_url'];  //商品展示地址 通过支付页面的表单进行传递
        $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址  */
        


        /*$out_trade_no = '11111';//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject = '我靠我测试测试';  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee ='0.1';   //付款金额  //必填 通过支付页面的表单进行传递
        $body = '缪果';  //订单描述 通过支付页面的表单进行传递
        $show_url = '11';  //商品展示地址 通过支付页面的表单进行传递
        $anti_phishing_key = time();//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址*/
        

        /*********************添加订单信息**************************/
        $where['id']=$_GET['order'];
        $order=M('dingdan')->where($where)->find();

        $out_trade_no = $order['id'];//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject = $order['goodname'];  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee =$order['zongjia'];   //付款金额  //必填 通过支付页面的表单进行传递
        $body = '商品描述';  //订单描述 通过支付页面的表单进行传递
        $show_url = '11';  //商品展示地址 通过支付页面的表单进行传递
        $anti_phishing_key = time();//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址
        /*************************添加订单信息end**********************/
         
         /************************************************************/
      
         //构造要请求的参数数组，无需改动
    $parameter = array(
         "service" => "create_direct_pay_by_user",
         "partner" => trim($alipay_config['partner']),
         "payment_type"    => $payment_type,
         "notify_url"    => $notify_url,
         "return_url"    => $return_url,
         "seller_email"    => $seller_email,
         "out_trade_no"    => $out_trade_no,
         "subject"    => $subject,
         "total_fee"    => $total_fee,
         "body"            => $body,
         "show_url"    => $show_url,
         "anti_phishing_key"    => $anti_phishing_key,
         "exter_invoke_ip"    => $exter_invoke_ip,
         "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
         );
         //建立请求
        $alipaySubmit = new \AlipaySubmit($alipay_config);
         $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
         echo $html_text;
     }
      
      
         /******************************
         服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
         
         *******************************/
     function notifyurl(){
                 /*
                 同理去掉以下两句代码；
                */ 
                 //require_once("alipay.config.php");
                 //require_once("lib/alipay_notify.class.php");
                  
                 //这里还是通过C函数来读取配置项，赋值给$alipay_config
         $alipay_config=C('alipay_config');
         //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($alipay_config);
         $verify_result = $alipayNotify->verifyNotify();
         if($verify_result) {
                //验证成功
                   //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
           $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
           $trade_no       = $_POST['trade_no'];          //支付宝交易号
           $trade_status   = $_POST['trade_status'];      //交易状态
           $total_fee      = $_POST['total_fee'];         //交易金额
           $notify_id      = $_POST['notify_id'];         //通知校验ID。
           $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
           $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号；
                   $parameter = array(
              "out_trade_no"     => $out_trade_no, //商户订单编号；
             "trade_no"     => $trade_no,     //支付宝交易号；
             "total_fee"     => $total_fee,    //交易金额；
             "trade_status"     => $trade_status, //交易状态
             "notify_id"     => $notify_id,    //通知校验ID。
             "notify_time"   => $notify_time,  //通知的发送时间。
             "buyer_email"   => $buyer_email,  //买家支付宝帐号；
           );
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                        //
            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {   
                    $where['id']=$out_trade_no;
                    $chkorder = M('dingdan')->where($where)->find();
                    if($chkorder['status'] == 0){
                        $data['status']=1;
                        M('dingdan')->where($where)->save($data);
                        $dlist  = M('dingdan')->find($out_trade_no);
                        $name = $dlist['goodname'];
                        $shuliang = $dlist['shuliang'];
                        $jiage = $dlist['zongjia'];
                        $dingdanhao = $dlist['dingdanhao'];
                        $gid = $dlist['gid'];
                        $glist = M('good')->find($gid);

                        if($glist['fakaleixin'] == '卡密发卡'){
                            $newkucun = $glist['kucun']-$shuliang;
                            M('good')->where("id=$gid")->setField('kucun',$newkucun);
                            $klist =  M('kami')->where("status=0 and g_id=$gid")->limit($shuliang)->order('rand()')->select();
                   
                            foreach ($klist as $key=>$v)
                            {
                                $arr[] = $v['id'];
                                $cdk[] = $v['cdk'];
                            }
                            $where['id'] =  array('in',$arr);
                            M('kami')->where($where)->setField("status",1);
                            M('kami')->where($where)->setField("d_id",$out_trade_no);
                            $cdk =  session('cdk',$cdk);
                            session('name',$name);
                            session('shuliang',$shuliang);
                            session('zongjia',$jiage);
                            session('gid',$gid);
                            session('dingdanhao',$dingdanhao);
                        }else{
                            session('gid',$gid);
                        }
                    }

                    //进行订单处理，并传送从支付宝返回的参数；
             }
                 echo "success";        //请不要修改或删除
         }else {
                 //验证失败
                echo "fail";
         }    
     }
      
     /*
         页面跳转处理方法；
        这里其实就是将return_url.php这个文件中的代码复制过来，进行处理； 
         */
     function returnurl(){
                 //头部的处理跟上面两个方法一样，这里不罗嗦了！
        $alipay_config=C('alipay_config');
         $alipayNotify = new \AlipayNotify($alipay_config);//计算得出通知验证结果
        $verify_result = $alipayNotify->verifyReturn();
         if($verify_result) {
             //验证成功
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
        $out_trade_no   = $_GET['out_trade_no'];      //商户订单号
        $trade_no       = $_GET['trade_no'];          //支付宝交易号
        $trade_status   = $_GET['trade_status'];      //交易状态
        $total_fee      = $_GET['total_fee'];         //交易金额
        $notify_id      = $_GET['notify_id'];         //通知校验ID。
        $notify_time    = $_GET['notify_time'];       //通知的发送时间。
        $buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号；
             
         $parameter = array(
            "out_trade_no"     => $out_trade_no,      //商户订单编号；
            "trade_no"     => $trade_no,          //支付宝交易号；
            "total_fee"      => $total_fee,         //交易金额；
            "trade_status"     => $trade_status,      //交易状态
            "notify_id"      => $notify_id,         //通知校验ID。
            "notify_time"    => $notify_time,       //通知的发送时间。
            "buyer_email"    => $buyer_email,       //买家支付宝帐号
        );
          
         
    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
            $where['id']=$out_trade_no;
            $chkorder = M('dingdan')->where($where)->find();
            if($chkorder['status'] == 0){
                $data['status']=1;
    //            $data['u_alipay']=$buyer_email;
                M('dingdan')->where($where)->save($data);
                $dlist  = M('dingdan')->find($out_trade_no);
                $name = $dlist['goodname'];
                $shuliang = $dlist['shuliang'];
                $jiage = $dlist['zongjia'];
                $dingdanhao = $dlist['dingdanhao'];
                $gid = $dlist['gid'];
                $glist = M('good')->find($gid);

                if($glist['fakaleixin'] == '卡密发卡'){
                    $newkucun = $glist['kucun']-$shuliang;
                    M('good')->where("id=$gid")->setField('kucun',$newkucun);
                    $klist =  M('kami')->where("status=0 and g_id=$gid")->limit($shuliang)->order('rand()')->select();
           
                    foreach ($klist as $key=>$v)
                    {
                        $arr[] = $v['id'];
                        $cdk[] = $v['cdk'];
                    }
                    $where['id'] =  array('in',$arr);
                    M('kami')->where($where)->setField("status",1);
                    M('kami')->where($where)->setField("d_id",$out_trade_no);
                    $cdk =  session('cdk',$cdk);
                    session('name',$name);
                    session('shuliang',$shuliang);
                    session('zongjia',$jiage);
                    session('gid',$gid);
                    session('dingdanhao',$dingdanhao);
                }else{
                    session('gid',$gid);
                }
                $this->redirect('Index/buyend');
            }else{
                $this->redirect('Index/buyend');
                //$this->error('该订单已支付！','Home/Index/buyend');
            }
//            $this->success('支付成功',U('Home/Index/buyend'));
            //进行订单处理，并传送从支付宝返回的参数；
         //$this->redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面；
    }else {
         echo "trade_status=".$_GET['trade_status'];
         $this->redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面；
    }
 }else {
     //验证失败
    //如要调试，请看alipay_notify.php页面的verifyReturn函数
    echo "支付失败！";
     }
 }
 }
 ?>