thinkphp 3.2 阿里云支付 分享

发布时间:2017年12月15日 17:22:25编辑:admin阅读(1921)评论(0)

    支付宝的支付,个人觉得比微信支付简单,(算是小司机一枚吧

    微信支付首先要申请支付,开通需要交300RMB,支付宝不需要,只要有公司资质就行

    支付宝支付唯一麻烦的就是公匙密匙的申请和分清什么是公匙,密匙,私匙,这里我就不说明了,自己啃文档(其实我说了也不一定会明白,不懂再@ 我)


    config.php 配置  //虽然我有现成的  partner  key  但是我就是不贴,你测试支付钱也不是给我的(

     字体红色的是你自己需要修改的地方  我用红色给你标记出来了

    "alipay_configa"=>array(
        'partner'=> '2088621XXXXXXXXX',   //合作身份者ID、key安全校验码或称私钥这一组参数是签约合同生效后才能拿的到
        'seller_id'=> '2088621XXXXXXXXX',          // seller_id 跟 partner 一样
        'key'=> 'xufu562b7rj58tkiuvsd178h6XXXXXX',      
        'notify_url' => 'http://'.$_SERVER['HTTP_HOST'] .'/Pchome/alipay/return_url/',    //服务器异步通知页面  支付宝通知使用POST方式 
        'return_url' => 'http://'.$_SERVER['HTTP_HOST'] .'/Pchome/alipay/return_url/',    //页面跳转同步通知页面  支付宝通知使用GET方式 
        'sign_type'    => strtoupper('MD5'),
        'input_charset'=> strtolower('utf-8'),
        'cacert'    => getcwd().'\\cacert.pem',     //安全证书  ,我是放在项目根目录下,主入口文件同一级
        'transport'   => 'http',
        'payment_type' => "1",
        'service' => "create_direct_pay_by_user",
        'anti_phishing_key' => "",
        'exter_invoke_ip' => "",
    ),


    配置文件弄好了之后就是调起支付的接口啦,

    AlipayController.class.php 

    Public function index(){
        if(!IS_POST){
            //dump($_POST);die;
            import("Vendor.Alipay.alipay_submit");    //导出阿里支付包
            $alipay_config=C("alipay_configa");         //调用配置参数   这里也可写进输入,后台配置操作
            $out_trade_no = date('Ymd').rand(0,99999999);    //商户订单号 通过支付页面的表单进行传递,注意要唯一!
            $subject =get_title(I("get.project_id"));//项目      //我自己下订单的项目,get_titel(项目id)  获取商品标题
            $total_fee = I("get.total_fee");                              //需支付的金额  安全性考虑可以在后台获取商品金额,购买数量重新计算一次(我懒直接获取了)
            $da['creat_time'] = time();//时间
            $da['project_type'] = 1;//项目类型        //可删
            $da['pay_status'] = 0;//支付状态           //订单状态,支付成功之后自己修改,状态规则自己定
            $da['total_fee'] = I("get.total_fee");      //支持金额
            $da['project_id'] = I("get.project_id");   //项目ID
            $da['user_id'] = $_SESSION['user_id'];   //用户ID
            $da['out_trade_no'] = $out_trade_no;   //订单号
            $da['repty'] = I("get.repty");                  //回报  可删
            $da['number_n'] = I("get.number_n");   //支持数量   购买数量
            $da['address_id'] = I("get.address_id");  //收货地址
            $da['remarks'] = I("get.remarks");          //留言
            cookie('sup_id',M('supporter')->add($da));                    //添加订单记录    并把订单id保存起来,
            $body = I("get.project_id");                    //自定义参数  可删  
            $parameter = array(
                "service"       => 'alipay.wap.create.direct.pay.by.user',
                "partner"       => trim($alipay_config['partner']),
                "payment_type"=> '1',
                "seller_id" => trim($alipay_config['seller_id']),
                "notify_url"=> 'http://域名.com/index.php/Pchome/alipay/return_urls/',
                "return_url"=> 'http://域名.com/index.php/Pchome/alipay/return_url/',//$_SERVER["REQUEST_SCHEME"].'://'.$_SERVER["SERVER_NAME"].'/index.php/Pchome/Alipay/return_url/',
                "seller_email"  => 'XXXXXXX@qq.com',   //支付宝收钱账号  可配置在config.php  也可保存在数据库
                "out_trade_no"=> $out_trade_no,
                "subject"=> $subject,
                "total_fee"=> $total_fee,
                "body"=> $body,
                "anti_phishing_key"=>'',
                "exter_invoke_ip"=>getip(),
                "_input_charset"=> trim(strtolower('utf-8'))
            );
            //建立请求
            $alipaySubmit = new \AlipaySubmit($alipay_config);
            $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
            echo $html_text;
        }
    }

    好了,支付就这样就可以调起支付了,支付成功之后写回调就可以了完成支付订单了,

    回调有两个,  return_url 同步回调,   notify_url  异步回调

    同步回调就是你自己浏览器支付成功之后调用接口,

    异步回调是支付宝支付成功之后支付宝那边调用你的接口传给你一些参数,安全性高


    好了下面是回调,  

    return_urls    同步回调   $_POST  请求

    Public function return_urls(){
        //支付宝回调参数
        //trade_no  支付宝订单号,记录可用于退款
        //cookie('sup_id')  添加订单时保存的订单id
        // out_trade_no  回调传回来的 订单号(自己生成的) 双重验证修改
        /*total_amount=0.01&timestamp=2017-04-10+14%3A25%3A26&sign=PgyHEVLQe
        4ygOq4oQ1aXSF%2FhDKIODVH7v0jJot5NsNx3Buw7CEi6MB3izG22%2B1LNe4cc1ietwKLEg4rIuizI%
        2FVGD9XsWVUaMScGd%2BLimKC06%2BFQom1N6iDNSgrx7bPcvyjvBV%2F8g2pezr1CF5E82GRLR%2FGcAc
        lA75Yu3VYATJc2IiTGJFY2WgXfCF0HcOW70djPhjh9PnYdmk8LK8jKNb3Zep4%2FsB1A%2FRYLZLnq9Krn
        5KUacqKn2RAL4E9VoSvemrm2JdDeCDstY%2F6Rt0bYpdVkspszjFSqL64pOjDUbqWTQhkolDvlvzhO5Xpz
        owTx8Dn%2BzNuMJOq6ZwregRotapA%3D%3D&
        trade_no=2017041021001004620279454731&
        sign_type=RSA2&
        auth_app_id=2017040506555396&
        charset=UTF-8&
        seller_id=2088621729394014&method
        =alipay.trade.wap.pay.return&app_id=2017040506555396&out_trade_no=201704106586&version=1.0*/
       
        if($_POST ['trade_status']=='TRADE_SUCCESS'){
            $art = M('supporter')->where('id='.cookie('sup_id').' and out_trade_no='.$_POST ['out_trade_no'])->find();
            $art['pay_status'] = 1;
        M('supporter')->where('id='.cookie('sup_id'))->save($art);
            //同步修改之后跳转
            $this->redirect('Product/details','id='.$art['project_id']);
        }
    }

    return_url  异步回调  $_GET请求

    Public function return_url(){
        /**dump(?body=207&is_success=T&notify_id=RqPnCoPT3K9%252Fvwbh3InYwe6E%252By8aLIjKcRG0G0YbVfQ7RH6DTcuNSEGs3oWVLLGMirGL
        &notify_time=2017-06-22+10%3A05%3A58&
        notify_type=trade_status_sync&
        out_trade_no=2017062232418708&
        payment_type=1&seller_id=2088621729394014&
        service=alipay.wap.create.direct.pay.by.user&subject=我
        &total_fee=0.01&trade_no=2017062221001004620207854582&trade_status=
        TRADE_SUCCESS&sign=e32835a8fdd5137b2a04e05659c69db7&sign_type=MD5);*/
        import("Vendor.Alipay.alipay_notify");
        $alipay_config=C("alipay_configa");
        //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        //dump($verify_result);
       
        if($_GET) {
            $trade_status = $_GET['trade_status'];
            if($_GET['trade_status'] == 'TRADE_FINISHED') {
                \Think\Log::record("【通信出错】1");
            }else if ($_GET['trade_status'] == 'TRADE_SUCCESS') {
                $da['pay_status'] = 1;
                if(M('supporter')->where('out_trade_no="'.$_GET['out_trade_no'].'"')->save($da)){
                    $this->redirect('Product/details',array('id'=>$_GET['body']));
                }else{
                    $this->redirect('Product/details',array('id'=>$_GET['body']));
                }
            }
        }else {   
            \Think\Log::record("【通信出错】0");
        }
    }



    好了,支付宝的支付就这几个步骤,把以前做的支付宝支付直接贴过来了

关键字支付宝支付