连连支付

    /**
    支付配置
    **/

    public function config(){
        //商户编号是商户在连连钱包支付平台上开设的商户号码,为18位数字,如:201306081000001016

        //秘钥格式注意不能修改(左对齐,右边有回车符)

        $llpay_config['oid_partner'] = "商户编号";
        $llpay_config['RSA_PRIVATE_KEY'] ='RSA生成的私钥';


//连连银通公钥

        $llpay_config['LIANLIAN_PUBLICK_KEY'] ='连联通公钥';

        //安全检验码,以数字和字母组成的字符
        //$llpay_config['key'] = '201408071000001539_sahdisa_20141205';//MD5方式一放弃

        //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        //版本号
         $llpay_config['version'] = '1.1';

        //请求应用标识 为wap版本,不需修改
        $llpay_config['app_request'] = '3';


        //签名方式 不需修改
        $llpay_config['sign_type'] = strtoupper('RSA');

        //订单有效时间  分钟为单位,默认为10080分钟(7天) 
        $llpay_config['valid_order'] ="30";

        //字符编码格式 目前支持 gbk 或 utf-8
        $llpay_config['input_charset'] = strtolower('utf-8');

        //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
        $llpay_config['transport'] = 'http';


        //认证支付

        //证件类型
        $llpay_config['id_type'] = 0;

        return $llpay_config;

    }

    /**充值
    *order_id   订单id
    **/
    public function topUps(){
        $order_id=I("get.order_id");
        if(!$order_id){
            $this->redirect('Member/myRecharge','',0,'参数错误');
        }
        $info=M("Money_order")->where(array('id'=>$order_id,'status'=>0))->find();
        if(empty($info)){
            $this->redirect('Member/myRecharge','',0,'参数错误');
        }
        $user_id= $_SESSION['user_id'];
        $user_info=D('Member')->where(['id'=>$user_id])->find();
        $this->pay($user_info,$info['order_no'],$info['money'],'充值','101001');

    }


    public function pay($user_info,$no_order,$money_order,$name_goods,$busi_partner){

        $llpay_config= $this->config();

        // $_POST['no_order'] = 'qbcz' . date('YmdHis', time()) . rand(1111, 9999);//商户订单号
        // $_POST['name_goods'] = "钱包充值";//商品名称
        // $_POST['pay_type'] = "银联支付";//支付方式
        // $_POST['card_no'] = "6214855717504522";//支付卡号

        /* *
         * 功能:连连支付WEB交易接口接入页
         * 版本:1.0
         * 修改日期:2014-06-17
         * 说明:
         * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
         */

        Vendor ("webllpay.lib.llpay_submit");

        /**************************请求参数**************************/

        //商户用户唯一编号
        $user_id = $user_info['id'];

        //支付类型
        $busi_partner = $busi_partner;

        //商户订单号
        $no_order = $no_order;
        //商户网站订单系统中唯一订单号,必填

        //付款金额
        $money_order = $money_order;

        //必填

        //商品名称
        $name_goods = $name_goods;

        //订单地址
        $url_order = $_POST['url_order'];

        //订单描述
        $info_order = $info_order;

        //银行网银编码
        $bank_code = $_POST['bank_code'];

        //支付方式
        $pay_type = 'D';//认证支付
        //$pay_type = '';

        //卡号
        $card_no = $_POST['card_no'];

        //姓名
        $acct_name = $user_info['realname'];

        //身份证号
        $id_no = $user_info['card_id'];

        //协议号
        $no_agree = $_POST['no_agree'];

        //修改标记
        $flag_modify = $_POST['flag_modify'];

        //风险控制参数
        $a['frms_ware_category']=2026;
        $a['user_info_mercht_userno']=$user_info['id'];//用户id
        $a['user_info_dt_register']=date('YmdHis',$user_info['addtime']);//注册时间
        $a['user_info_mercht_userno']=$user_info['telephone'];//手机号
        $a['user_info_identify_state']=1;//是否实名认证
        $a['user_info_identify_type ']=2;
        $a['user_info_full_name']=$user_info['realname'];
        $a['user_info_id_no']=$user_info['card_id'];

        $risk_item =json_encode($a,JSON_UNESCAPED_UNICODE);

        //分账信息数据
        $shareing_data = $_POST['shareing_data'];

        //返回修改信息地址
        $back_url = $_POST['back_url'];

        //订单有效期
        $valid_order = $_POST['valid_order'];

        //服务器异步通知页面路径
        $notify_url = "服务器异步通知地址/notify_url.html";
        //需http://格式的完整路径,不能加?id=123这类自定义参数

        //页面跳转同步通知页面路径
        $return_url = "服务器同步通知页面";
        //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/

        /************************************************************/
        date_default_timezone_set('PRC');
        //构造要请求的参数数组,无需改动
        $parameter = array (
            "version" => trim($llpay_config['version']),
            "oid_partner" => trim($llpay_config['oid_partner']),
            "sign_type" => trim($llpay_config['sign_type']),
            "userreq_ip" => trim($llpay_config['userreq_ip']),
            "id_type" => trim($llpay_config['id_type']),
            "valid_order" => trim($llpay_config['valid_order']),
            "user_id" => $user_id,
            "timestamp" => local_date('YmdHis', time()),

            "busi_partner" => $busi_partner,
            "no_order" => $no_order,
            "dt_order" => local_date('YmdHis', time()),

            "name_goods" => $name_goods,
            "info_order" => $info_order,
            "money_order" => $money_order,
            "notify_url" => $notify_url,
            "url_return" => $return_url,
            "url_order" => $url_order,
            "bank_code" => $bank_code,
            "pay_type" => $pay_type,
            "no_agree" => $no_agree,
            "shareing_data" => $shareing_data,
            "risk_item" => $risk_item,
            "id_no" => $id_no,
            "acct_name" => $acct_name,
            "flag_modify" => $flag_modify,
            "card_no" => $card_no,
            "back_url" => $back_url
        );

        //建立请求
        $llpaySubmit = new \LLpaySubmit($llpay_config);

        $html_text = $llpaySubmit->buildRequestForm($parameter, "post", "确认");
        echo $html_text;


    }


    /**
    异步回调
     **/
    public function notify_url(){
        /* *
          * 功能:连连支付服务器异步通知页面
         * 版本:2.0
         * 日期:2014-10-16
         * 说明:
         * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。


         *************************页面功能说明*************************
         * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
         * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
         */

        Vendor ("webllpay.lib.llpay_notify");
        Vendor ("webllpay.lib.llpay_cls_json");
        //计算得出通知验证结果
        $llpayNotify = new \LLpayNotify($this->config());
        $str = file_get_contents("php://input");
        file_put_contents("llpay.txt",$str.PHP_EOL,FILE_APPEND);
        $verify_result = $llpayNotify->verifyNotify();
        file_put_contents("12.txt",$llpayNotify->result);
        if ($llpayNotify->result) { //验证成功
            //获取连连支付的通知返回参数,可参考技术文档中服务器异步通知参数列表
            $no_order = $llpayNotify->notifyResp['no_order'];//商户订单号
            $oid_paybill = $llpayNotify->notifyResp['oid_paybill'];//连连支付单号
            $result_pay = $llpayNotify->notifyResp['result_pay'];//支付结果,SUCCESS:为支付成功
            $money_order = $llpayNotify->notifyResp['money_order'];// 支付金额
            if($result_pay == "SUCCESS"){
                //请在这里加上商户的业务逻辑程序代(更新订单状态、入账业务)
                M()->startTrans();
                $re=M("Money_order")->where(array('status'=>0,'order_no'=>$no_order))->setField('status',1);
                if(!$re){
                    M()->rollback();
                }
                //充值成功添加流水记录
                $money_order_res = M("Money_order")->where(array("status"=>1,"order_no"=>$no_order))->field("id,user_id,money,way")->find();

                if ($money_order_res) {
                    //20171024 zj 修改  充值时进入钱包余额立马转入策略余额
                    $mem = M("Member")->where(array("id"=>$money_order_res['user_id']))->field("id,wallet,celue_wallet")->find();
                    //增加充值钱包记录
                    $my_map = array();
                    $my_map['wallet'] = $mem['wallet'] + $money_order_res['money'];
                    $map = array();
                    $map['user_id'] = $money_order_res['user_id'];//用户id
                    $map['type'] = 1;//收入
                    $map['amount'] = $money_order_res['money'];//交易金额
                    $map['way'] = $money_order_res['way'];//支付方式 1连连付
                    $map['posttime'] = time();//时间
                    $map['cate'] = 8;// 充值
                    $map['status'] = 1;//1 已同意    2已拒绝   3未审核',
                    $map['wallet'] = $my_map['wallet'];//当前余额
                    $money_water_res = M("money_water")->add($map);

                    //钱包转策略余额
                    $mycelue_map = array();
                    $mycelue_map['celue_wallet'] = $mem['celue_wallet'] + $money_order_res['money'];
                    $map1 = array();
                    $map1['user_id'] = $money_order_res['user_id'];//用户id
                    $map1['type'] = 2;//支出
                    $map1['amount'] = $money_order_res['money'];//交易金额
                    $map1['way'] = 4;//支付方式 余额支付
                    $map1['way_name'] = "钱包转策略余额";//支付介绍
                    $map1['posttime'] = time();//时间                    $map1['cate'] = 14;// 钱包转策略余额

                    $map1['status'] = 1;//1 已同意    2已拒绝   3未审核',
                    $map1['wallet'] = $mem['celue_wallet'];//当前策略余额
                    $money_water_res1 = M("money_water")->add($map1);
                    $mem_res = M("member")->where(array("id"=>$money_order_res['user_id']))->save($mycelue_map);
//                  $sql= M("member")->getlastsql();
//                  file_put_contents("sql.txt", $sql, FILE_APPEND);
                    if (!$money_water_res || !$mem_res) {
                        M()->rollback();
                        file_put_contents("log.txt", "异步通知 修改用户金额失败\n", FILE_APPEND);
                        die("{'ret_code':'9999','ret_msg':'修改用户金额失败'}");
                    }
                }else{
                    M()->rollback();
                    file_put_contents("log.txt", "异步通知 获取用户金额失败\n", FILE_APPEND);
                    die("{'ret_code':'9999','ret_msg':'获取用户金额失败'}");
                }


                M()->commit();
                file_put_contents("log.txt", "异步通知 验证成功\n", FILE_APPEND);
                die("{'ret_code':'0000','ret_msg':'交易成功'}"); //请不要修改或删除
                //——请根据您的业务逻辑来编写程序——
                //payAfter($llpayNotify->notifyResp);
            }


            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        } else {
            file_put_contents("log.txt", "异步通知 验证失败\n", FILE_APPEND);
            //验证失败
            die("{'ret_code':'9999','ret_msg':'验签失败'}");
            //调试用,写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
        }


    }

猜你喜欢

转载自blog.csdn.net/weixin_38112233/article/details/80257915