apiClient = new \DefaultIcbcClient( $this->APP_ID, $this->PRI_KEY, $this->signType, 'UTF-8', '', $this->APIGW_PUBLIC_KEY, '', '', '', '' ); } // 工行支付 public function pay($money="",$decive_info="111",$type="",$partner_id="",$store_type_id="",$order_id=0){ $user_id = $this->user_id; $merchant = 70; //商户获取金额比例 $our = 5; //服务费 $other = 3; // 其他分销推广人员费用 $user_billions = 22; // 其他+服务费 $user_msg = UserAuth::where("user_id",$user_id)->find(); $msg_id = $this->getMsgId(); // var_dump($msg_id); $out = "dlh".time().$user_id; $ip = ''; if (isset($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP'] != 'unknown') { // 判断是否有HTTP_CLIENT_IP这个请求头,存在优先使用 $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != 'unknown') { // 判断是否有HTTP_X_FORWARDED_FOR这个请求头,存在优先使用 $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] != 'unknown') { // 获取REMOTE_ADDR这个服务器变量 $ip = $_SERVER['REMOTE_ADDR']; } $orig_date_time = date("Y-m-d\TH:i:s"); $mer_url = "https://dlh.hainings.com/index/index/localReturn"; $order_num = 3; $basic = $this->basic($user_id,$out,$money,$our,$user_msg,$type); $general1 = $this->general1($user_id,$out,$money,$other,$user_msg,$type); $general2 = $this->general2($user_id,$out,$money,$user_billions,$user_msg,$type); $userAccount = ""; $order_submit_act_input = array($basic,$general1,$general2); if($type != ""){ $userAccount = $this->userAccount($user_id,$out,$money,$merchant,$user_msg); $order_num = 4; $order_submit_act_input = array($basic,$general1,$general2,$userAccount); } $request = [ 'serviceUrl' => 'https://gw.open.icbc.com.cn/api/cardbusiness/aggregatepay/b2c/online/consumepurchase/V2', 'method' => 'POST', 'isNeedEncrypt'=>false, 'biz_content' => array( "mer_id"=>"120448160200", "ser_id"=>"120400005722", "out_trade_no"=>$out, "pay_mode"=>"9", "access_type"=>"9", "mer_prtcl_no"=>"1204481602000201", "orig_date_time"=>$orig_date_time, "decive_info"=>$decive_info, "body"=>"东龙汇", "fee_type"=>"001", "spbill_create_ip"=>$ip, "total_fee"=>strval($money*100), "mer_url"=>$mer_url, "notify_type"=>"HS", "shop_appid"=>$this->shop_appid, "icbc_appid"=>$this->APP_ID, "open_id"=>$user_msg['openid'], "expire_time"=>"300", "is_suborder"=>"1", "order_num"=>(string)$order_num, "order_submit_act_input"=>$order_submit_act_input ), 'extraParams'=>[] ]; // $res = $this->apiClient->execute($request,$msg_id,""); // print_r("
");
        // var_dump($request);
        $data['mer_id'] = "120448160200";
        $data['ser_id'] = "120400005722";
        $data['order_id'] = $order_id;
        $data['out_trade_no'] = $out;
        $data['pay_mode'] = "9";
        $data['access_type'] = "9";
        $data['mer_prtcl_no'] = "1204481602000201";
        $data['orig_date_time'] = $orig_date_time;
        $data['spbill_create_ip'] = $ip;
        $data['decive_info'] = $decive_info;
        $data['total_fee'] = $money;
        $data['fee_type'] = "001";
        $data['mer_url'] = $mer_url;
        $data['notify_type'] = "HS";
        $data['shop_appid'] = $this->shop_appid;
        $data['icbc_appid'] = $this->APP_ID;
        $data['user_id'] = $user_id;
        $data['classify_amt'] = $money*100;
        $data['open_id'] = $user_msg['openid'];
        $data['dtime'] = date("Y-m-d H:i:s");
        $rest = Db::name("abutment_log")->insertGetId($data);
        $res = $this->apiClient->execute($request,$msg_id,"");
        $result = json_decode($res,true);
        //   print_r("
");
        // var_dump($result);
        $r = json_decode($result['wx_data_package'],true);

        if($order_id == 0){
            $out_trade_no =  createSn('user', 'id');
            $da['order_sn'] = $out_trade_no;
            $da['user_id'] = $user_id;
            $da['order_amount'] = $money;
            $da['partner_id'] = $partner_id;
            $da['store_type_id'] = $store_type_id;
            $da['alog_id'] = $rest;
            $da['pay_time'] = date("Y-m-d H:i:s");
            Db::name("distribution_pay")->save($da);
        }
        $r['nonceStr'] = $r['noncestr'];
        $r['timeStamp'] = $r['timestamp'];
        $r['paySign'] = $r['sign'];
        $r['order_num'] = $order_num;
        $r['alog_id'] = $rest;
        return JsonServer::success('查询成功',$r);
    }
    public function getMsgId(){
        return substr(md5("donglonghui".time().mt_rand(1,1000000)),8,13);
    }
    // 查询回调记录
    public function checkReturn($alog_id,$type="",$id){
        $abutment = Db::name("abutment_log")
            ->where("alog_id",$alog_id)
            ->where("state",0)
            ->find();
        if($abutment == null){
            return JsonServer::error('支付失败');
        }
        if($type == ""){
            $distributionPay = Db::name("distribution_pay")
                ->where("alog_id",$alog_id)
                ->find();
            if($distributionPay == null){
                return JsonServer::error('支付失败');
            }
        }
        $checkPay = $this->payReturnCheck($abutment['out_trade_no']);
        if($checkPay['return_msg'] === "SUCCESS"){
            Db::name("abutment_log")
                ->where("seq_no",$abutment['seq_no'])
                ->update(['state'=>1]);
            if($type == ""){
                Db::name("distribution_pay")
                    ->where("alog_id",$alog_id)
                    ->update(['pay_status'=>1]);
                Db::name("distribution_member_apply")->where("id",$id)->update(['alog_id'=>$alog_id]);
            }else{
                Db::name("order")
                    ->where("id",$abutment['order_id'])
                    ->update(['order_status'=>1,'pay_status'=>1]);
            }
          }else{
            return JsonServer::error('支付失败');
        }
        return JsonServer::success('回调成功');
    }

    //分销审核通过之后才会解冻分账或者确认收货
    public function CompleteAudit($id,$type=""){
        $dmemberApply = Db::name("distribution_member_apply")
            ->where("id",$id)
            ->find();
        $alog_id = $dmemberApply['alog_id'];
        $abutment = Db::name("abutment_log")
            ->where("alog_id",$alog_id)
            ->where("state",0)
            ->find();
        $checkPay = $this->payReturnCheck($abutment['out_trade_no']);
        if($checkPay['return_msg'] === "SUCCESS") {
            $r = json_decode($checkPay['order_submit_act_output'], true);
            $jd = $this->jiedong($r);
//            var_dump($jd);
            if (!$jd) {
                return JsonServer::error('解冻失败');
            }
            $user = Db::name("user")
                ->where('id',$abutment['user_id'])
                ->where('disable',0)
                ->where('del',0)
                ->find();
            if($user == null){
                return JsonServer::error('用户不存在或被禁用');
            }
            if($user['first_leader'] > 0){
                //获取配置比例
                $config = Db::name("config")->where("type","subsidy")->select()->toArray();
                $arr = array();
                $earnings_pecent = $earnings_electrodeless_pecent = 0;
                foreach($config as $key=>$value){
                    if($value['name'] == "distribution_user"){
                        $earnings_pecent = $value['value'];
                    }
                    if($value['name'] == "distribution_electrodeless"){
                        $earnings_electrodeless_pecent = $value['value'];
                    }
                }
                $earns = new Earnings();
                // 推广会员用户佣金
                $earnings = round($earnings_pecent*$abutment['classify_amt']/100,2);
                $distribution_user_earnings = AccountLog::distribution_user_earnings;
                $earnings_result = $earns->userEarnings($earnings,$user['first_leader'],$distribution_user_earnings);
                if(!$earnings_result){
                    return JsonServer::error('支付失败');
                }
                // 推广会员无极佣金
                if($user['divide_state']==1){
                    if($user['divide_role_user_id'] > 0){
                        $electrodeless = round($earnings_electrodeless_pecent*$abutment['order_amount']/100,2);
                        $distribution_user_electrodeless_earnings = AccountLog::distribution_user_electrodeless_earnings;
                        $earnings_result = $earns->userElectrodelessEarnings($electrodeless,$user['divide_role_user_id'],$distribution_user_electrodeless_earnings);
                        if(!$earnings_result){
                            return JsonServer::error('支付失败');
                        }
                    }
                }
            }
        }
        // 参与消费返补
        $billions = new Billions();
        $order['order_amount'] = round($abutment['order_amount'],2);
        $order['id'] = $alog_id;
        $order['type'] = 5;
        $type = "distribution";
        $billions_result = $billions->billions($order,$abutment['user_id'],$type);
        if(!$billions_result){
            return JsonServer::error('支付失败');
        }
        return JsonServer::success('操作成功');
    }

    // 用户账户
    public function userAccount($user_id,$out,$money,$merchant,$user_msg){
        $out4 = "dlh".time().$user_id."4";
        $data1['rec_num'] = "1";
        $data1['seq_no'] = $out;
        $data1['sub_order_id'] = $out4;
        $data1['oper_flag'] = "0";
        $data1['busi_type'] = "1";
        $data1['sub_mer_id'] = "120405000785";
        $data1['sub_mer_prtcl_no'] = "1204050007850201";
        $data1['classify_amt'] = $money*$merchant;
        $data1['user_id'] = $user_id;
        $data1['open_id'] = $user_msg['openid'];
        $data1['dtime'] = date("Y-m-d H:i:s");
        $rest = Db::name("abutment_log")->save($data1);
        return  array(
            "rec_num"=>"4",
            "sub_order_id"=>$out4,
            "oper_flag"=>"0",
            "busi_type"=>"1",
            "ori_mer_id"=>"120448160200",
            "seq_no"=>$out,
            "mer_acct"=>"1204068809100156171",
            "ori_trx_date"=>date("Y-m-d"),
            "sub_mer_id"=>"120405000785",
            "sub_mer_prtcl_no"=>"1204050007850201",
            "classify_amt"=>strval($money*$merchant)
        );
    }

    // 基本户
    public function basic($user_id,$out,$money,$our,$user_msg,$type){
        // $out2 = "dlh17314648899792";
        $out2 = "dlh".time().$user_id."2";
        $data2['rec_num'] = "1";
        $data2['seq_no'] = $out;
        $data2['sub_order_id'] = $out2;
        $data2['oper_flag'] = "0";
        $data2['busi_type'] = "1";
        $data2['sub_mer_id'] = "120448160201";
        $data2['sub_mer_prtcl_no'] = "1204481602010201";
        $data2['classify_amt'] = $money*$our;
        if($type == ""){
            $data2['classify_amt'] = $money*$our+$money*40;
        }
        $data2['user_id'] = $user_id;
        $data2['open_id'] = $user_msg['openid'];
        $data2['dtime'] = date("Y-m-d H:i:s");
        $rest = Db::name("abutment_log")->save($data2);
        return array(
            "rec_num"=>"1",
            "sub_order_id"=>$out2,
            "oper_flag"=>"0",
            "busi_type"=>"1",
            "ori_mer_id"=>"120448160200",
            "seq_no"=>$out,
            "mer_acct"=>"1204068809100138961",
            "ori_trx_date"=>date("Y-m-d"),
            "sub_mer_id"=>"120448160201",
            "sub_mer_prtcl_no"=>"1204481602010201",
            "classify_amt"=>strval($data2['classify_amt'])
        );
    }

    // 一般户1
    public function general1($user_id,$out,$money,$other,$user_msg,$type){
        // $out3 = "dlh17314648899793";
        $out3 = "dlh".time().$user_id."3";
        $data3['rec_num'] = "2";
        $data3['seq_no'] = $out;
        $data3['sub_order_id'] = $out3;
        $data3['oper_flag'] = "0";
        $data3['busi_type'] = "1";
        $data3['sub_mer_id'] = "120448160202";
        $data3['sub_mer_prtcl_no'] = "1204481602020201";
        $data3['classify_amt'] = $money*$other;
        if($type == ""){
            $data3['classify_amt'] = $money*$other+$money*30;
        }
        $data3['user_id'] = $user_id;
        $data3['open_id'] = $user_msg['openid'];
        $data3['dtime'] = date("Y-m-d H:i:s");
        $rest = Db::name("abutment_log")->save($data3);
        return    array(
            "rec_num"=>"2",
            "sub_order_id"=>$out3,
            "oper_flag"=>"0",
            "busi_type"=>"1",
            "ori_mer_id"=>"120448160200",
            "seq_no"=>$out,
            "mer_acct"=>"1204064019200152507",
            "ori_trx_date"=>date("Y-m-d"),
            "sub_mer_id"=>"120448160202",
            "sub_mer_prtcl_no"=>"1204481602020201",
            "classify_amt"=>strval($data3['classify_amt'])
        );
    }
    // 一般户2
    public function general2($user_id,$out,$money,$user_billions,$user_msg){
        $out4 = "dlh".time().$user_id."4";
        //  $out4 = "dlh17314648899794";
        $data4['rec_num'] = "3";
        $data4['seq_no'] = $out;
        $data4['sub_order_id'] = $out4;
        $data4['oper_flag'] = "0";
        $data4['busi_type'] = "1";
        $data4['sub_mer_id'] = "120448160203";
        $data4['sub_mer_prtcl_no'] = "1204481602030201";
        $data4['classify_amt'] = $money*$user_billions;
        $data4['user_id'] = $user_id;
        $data4['open_id'] = $user_msg['openid'];
        $data4['dtime'] = date("Y-m-d H:i:s");
        $rest = Db::name("abutment_log")->save($data4);
        return   array(
            "rec_num"=>"3",
            "sub_order_id"=>$out4,
            "oper_flag"=>"0",
            "busi_type"=>"1",
            "ori_mer_id"=>"120448160200",
            "seq_no"=>$out,
            "mer_acct"=>"1204064419000115357",
            "ori_trx_date"=>date("Y-m-d"),
            "sub_mer_id"=>"120448160203",
            "sub_mer_prtcl_no"=>"1204481602030201",
            "classify_amt"=>strval($money*$user_billions)
        );
    }
    // 查询是否支付成功
        public function payReturnCheck($out_trade_no){
        $user_id = 1;
        $msg_id = $this->getMsgId();
        //   $out = "dlh".time().$user_id;
        $request = [
            'serviceUrl' => 'https://gw.open.icbc.com.cn/api/cardbusiness/aggregatepay/b2c/online/orderqry/V2',
            'method' => 'POST',
            'isNeedEncrypt'=>false,
            'biz_content' => array(
                "mer_id"=>"120448160200",
                "deal_flag"=>'0',
                "out_trade_no"=>$out_trade_no,
                // "order_id"=>"120448160200000562407290003182",
                "mer_prtcl_no"=>"1204481602000201",
                "icbc_appid"=>$this->APP_ID
            ),
            'extraParams'=>[]
        ];
//        print_r("
");
//        var_dump($request);
        $res = $this->apiClient->execute($request,$msg_id,"");
//        var_dump($res);
        $result = json_decode($res,true);
        //   print_r("
");
//        var_dump($result);
        if(isset($result['order_submit_act_output'])){
            return $result;
        }else{
            $arr['return_msg'] = "ERROR";
            return $arr;
        }

    }

    //解冻
    public function jiedong($r){
        foreach($r as $key=>$value){
            $msg_id = $this->getMsgId();
            $request = [
                'serviceUrl' => 'https://gw.open.icbc.com.cn/api/mybank/mer/merin/thaw/V1',
                'method' => 'POST',
                'isNeedEncrypt'=>false,
                'biz_content' => array(
                    "icbcOrderSubNo"=>$value['sub_order_seq'],
                    "icbcOrderNo"=>$value['order_id'],
                    "outAgreeNo"=>$value['sub_mer_id']."0201"
                    // "outAgreeNo"=>"dlh17304530429791"
                    // "outAgreeNo"=>"1204481602020201"
                ),
                'extraParams'=>[]
            ];
//            print_r("
");
//            var_dump($request);
            $res = $this->apiClient->execute($request,$msg_id,"");
//            var_dump($res);
//               $result = json_decode($res,true);
            $result = json_decode($res,true);
            //   print_r("
");
//            var_dump($result);
            if($result['returnMsg']!="success"){
                return false;
            }
        }
        return true;
    }

    // 退款
}