dao = $dao; } public function getList(array $where,$page,$limit) { $query = $this->dao->search($where); $count = $query->count(); $list = $query->page($page,$limit) ->order('mer_intention_id', 'desc') ->select(); $haikeApplyRepository = app()->make(MerchantHaikeApplyRepository::class); foreach ($list as &$item) { $item->haike_status = 0; if (!$item->merch_no) { $item->haike_status = '暂无申请'; $item->haike_status_msg = ''; } else { try { $apply = $haikeApplyRepository->getWhere(['apply_id' => $item->mer_intention_id, 'apply_type' => 1]); if ($apply) { $item->haike_status = $apply->status; $item->haike_status_msg = '-'.$apply->check_result; } $apply2 = $haikeApplyRepository->getWhere(['apply_id' => $item->mer_intention_id, 'apply_type' => 2]); if ($apply2) { $str = substr($apply2->check_result, strpos($apply2->check_result, '{')); $array = json_decode($str, true); $item->haike_apply_wx_status = $apply2->status; $item->haike_apply_wx_status_msg = '-' . $array['result_msg'] ?? ''; } $apply3 = $haikeApplyRepository->getWhere(['apply_id' => $item->mer_intention_id, 'apply_type' => 3]); if ($apply3) { $str = substr($apply2->check_result, strpos($apply2->check_result, '{')); $array = json_decode($str, true); $item->haike_apply_ali_status = $apply3->status; $item->haike_apply_ali_status_msg = '-' . $array['result_msg'] ?? ''; } } catch (\Throwable $e) { $item->haike_status = $item->agent_apply_no; $item->haike_status_msg = ''; $item->haike_apply_wx_status = 0; $item->haike_apply_wx_status_msg = ''; $item->haike_apply_ali_status = 0; $item->haike_apply_ali_status_msg = ''; } } $item = $this->wxAuthStatus($item, $haikeApplyRepository); $item->haike_wx_auth_status = 0; $sxy_status = $this->sxyStatus($item->mer_intention_id); $item->sxy_status = $sxy_status['msg']; $item->sys_status_code = $sxy_status['code']; } unset($item); // $list = $query->page($page,$limit)->select(); // $count1 = $query->where("status",1)->count(); // $count2 = $query->where("status",0)->count(); // $count3 = $query->where("status",2)->count(); $count1 =$count3 =$count2=0; $lists = $query->select(); foreach ($lists as $item) { if($item["status"]==1){ $count1+=1; }elseif ($item["status"]==0){ $count2+=1; }else{ $count3+=1; } } $cardLists=[ ['className'=> 'el-icon-s-goods', 'count'=>$count1, 'field'=>'个', 'name'=> '已通过' ], ['className'=> 'el-icon-s-goods', 'count'=>$count2, 'field'=>'个', 'name'=> '审核中' ], ['className'=> 'el-icon-s-goods', 'count'=>$count3, 'field'=>'个', 'name'=> '未通过' ], ]; return compact('count','list','cardLists'); } public function sxyStatus($id){ $res = Db::name("declare_log") -> where("m_id",$id) -> order('id','desc') -> find(); //declare==1:审核提交成功 //status==SUCCESS:审核成功 $result['code'] = 2;//1:不展示审核按钮。2:展示审核按钮 if($res['declare'] == 1){ $result['msg'] = '审核中'; $result['code'] = 1; } switch ($res['status']){ case 'SUCCESS': $result['msg'] = '已开通'; $result['code'] = 1; break; case 'ESIGN_SUCCESS': $result['msg'] = '电子签签约成功'; $result['code'] = 1; break; case 'ESIGN_FAIL': $result['msg'] = '电子签签约失败'; $result['code'] = 2; break; } if($res['declare'] != 1 || $res['status'] == 'NO_PASS' || $res['status'] == 'REFUSE'){ $result['msg'] = $res['message']; } $result['status']=$res['status']; return $result; } public function markForm($id) { $intention = $this->dao->get($id); $intention->mer_intention_id = (string)$intention->mer_intention_id; $where=[ Elm::input('mer_intention_id', '申请 ID', '')->disabled(true), Elm::input('merch_no', '海科商户号')->disabled(true), Elm::input('phone', '手机号'), Elm::input('mer_name', '商户名称'), Elm::input('mer_short_name', '商户简称'), Elm::input('addr', '详细地址'), Elm::frameImage('doorhead', '门头照', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=doorhead&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal']), Elm::frameImage('business_license', '营业执照', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=business_license&type=1')->modal(['modal' => false])->width('896px')->height('480px')->props(['footer' => false])->info('小微非必填'), Elm::frameImage('card_positive_person', '身份证正面(法人)', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=card_positive_person&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal']), Elm::frameImage('card_back_person', '身份证反面(法人)', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=card_back_person&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal']), Elm::input('identification_valid_date_start', '身份证有效期起始时间')->info('例:2000-01-01'), Elm::input('identification_valid_date_end', '身份证有效期结束时间')->info('例:2030-01-01'), Elm::input('name', '法人姓名'), Elm::input('idcard_no', '法人身份证号'), Elm::input('email', '邮箱'), Elm::input('acc_type', '结算方式(10A:对公,10B:对私)'), Elm::input('bank_account', '开户账号'), Elm::input('bank_deposit', '开户行'), Elm::input('bank_branch', '开户支行'), Elm::frameImage('open_account', '开户许可证', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=open_account&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal'])->info('小微上传结算卡照片'), Elm::frameImage('logo', '店铺LOGO', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=logo&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal']), Elm::input('business_addr', '营业执照地址')->info('小微请填写实际经营地址'), Elm::input('house_number', '门牌号'), Elm::input('type', '1企业2个体3个人'), Elm::input('spread_account', '推荐人手机号'), Elm::input('credit_code', '社会信用代码'), Elm::frameImage('business_premises2', '营业场所室内照图片1', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=business_premises2&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal']), Elm::frameImage('business_premises3', '营业场所室内照图片2', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=business_premises3&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal']), Elm::frameImage('business_premises4', '协议盖章', '/' . config('admin.admin_prefix') . '/setting/uploadPicture?field=business_premises4&type=1')->props(['footer' => false])->modal(['modal' => false, 'custom-class' => 'suibian-modal'])->info('小微必传'), Elm::input('haike_wx_type', '海科微信营业范围'), Elm::input('haike_wx_appid', '海科微信APPID')->info('配置微信公众号'), Elm::input('haike_wxsub_merch_no', '海科子商户号', '')->info('用于二次认证'), Elm::input('haike_ali_type', '海科支付宝营业范围'), Elm::input('agent_apply_no', '海科申请单号')->disabled(true), Elm::textarea('mark', '备注'), ]; return Elm::createForm(Route::buildUrl('systemMerchantIntentionMark', compact('id'))->build(), $where)->setTitle('编辑')->formData($intention->toArray()); } public function statusForm($id) { $form = Elm::createForm(Route::buildUrl('systemMerchantIntentionStatus', ['id' => $id])->build()); $form->setRule([ Elm::select('status', '审核状态', 1)->options([ ['value' => 1, 'label' => '同意'], ['value' => 2, 'label' => '拒绝'], ]), Elm::textarea('check_result', '审核结果'), ]); return $form->setTitle('修改审核状态'); } public function createMer($id){ $data = Db::name("merchant_intention") ->where("mer_intention_id",$id) ->find(); $user = Db::name("user")->where("uid",$data['uid'])->field('account,pwd,identity')->find(); if(in_array($user['identity'],[1,2,3])){ return ['code'=> 500,'msg'=>'该用户已是代理请拒绝']; } $count= Db::name("merchant_admin") ->where(['account' => $user['account'], 'is_del'=>0]) ->count(); if ($count > 0) { return ['code'=> 500,'msg' => '该用户已创建过商户账号,请先删除原有账户']; } $admin= Db::name("merchant_admin") ->where(['uid' => $data['uid'], 'is_del'=>0]) ->find(); if($admin){ return ['code'=> 500,'msg'=>'该用户已是商户']; } if($user['account'] == $admin['account']){ return ['code'=> 500,'msg'=>'该手机号已是商户账号']; } $expire_time=strtotime(date('Y-m-d'))+86400*365+86400-1; $spread = Db::name("user") ->where(["account"=>$data['spread_account']]) ->field("uid,account,spread_count") ->find(); $insdata=[ 'uid'=>$data['uid'], 'merch_no' => $data['merch_no'], 'type'=>$data['type']??3, "mer_name"=>$data["mer_name"]??"", "mer_phone"=>$data["phone"]??"", "mer_address"=>$data["addr"]??"", "house_number"=>$data["house_number"]??"", "category_id"=>$data['cate_id']?$data['cate_id']:0, "doorhead"=>$data["doorhead"]??"", "mer_banner"=>$data["doorhead"]??"", "status"=>1, "lat"=>$data["lat"], "lng"=>$data["lng"], "business_license"=>$data["business_license"]??"", "service_phone"=>$data["phone"]??"", 'open_account'=>$data['open_account']??"", 'bank_account'=>$data['bank_account']??"", 'bank_location'=>$data['bank_location']??"", 'bank_deposit'=>$data['bank_deposit']??"", 'bank_branch'=>$data['bank_branch']??"", 'name'=>$data['name']??"", 'email'=>$data['email']??"", 'card_positive_person'=>$data['card_positive_person']??"", 'card_back_person'=>$data['card_back_person']??"", 'logo'=>$data['logo']??"", 'mer_avatar' => $data['logo']??"", 'mer_info'=>$data['desc']??"", 'district_addr'=>$data['district_addr']??"", 'province_id'=>$data['province_id']??"", 'city_id'=>$data['city_id']??"", 'area_id'=>$data['area_id']??"", 'street_id'=>$data['street_id']??"", "create_time"=>date("Y-m-d H:i:s"), "update_time"=>date("Y-m-d H:i:s"), "expire_time"=>$expire_time ]; try{ $merchant_id = Db::transaction(function () use ($spread, $data, $user, $insdata){ if ($spread) { $insdata['recommender'] = $spread['uid']; //推荐人推荐数量加1 Db::name("user")->where(['uid' => $spread['uid']])->update(['spread_count' => ($spread['spread_count'] + 1)]); //修改用户推荐人信息 Db::name("user")->where(['uid' => $data['uid']])->update(['spread_uid' => $spread['uid']]); //保存用户的推荐记录 $log = [ 'uid' => $spread['uid'], 'link_id' => $data['uid'], 'identity' => 4, 'create_time' => date("Y-m-d H:i:s"), ]; Db::name("user_identity_log")->insert($log); } $merchant_id = Db::name("merchant")->insertGetId($insdata); /*添加账户*/ $merchant_admin_array = [ 'uid' => $data['uid'], "mer_id" => $merchant_id, "account" => $user["account"], "pwd" => $user["pwd"], "real_name" => $data["mer_name"], "phone" => $data["phone"], "create_time" => date("Y-m-d H:i:s"), 'level' => 0 ]; Db::name("merchant_admin")->insert($merchant_admin_array); //用户更改成商家 Db::name("user")->where(['uid' => $data['uid']])->update(['identity' => 5]); //更改商户收款码 Db::name("MerchantQrcode") -> where("uid",$data['uid']) -> update(['mer_id'=>$merchant_id]); return $merchant_id; }); if (!$merchant_id) return ['code' => 500, 'msg' => '创建商户失败']; return ['code' => 200, 'data' => $merchant_id]; } catch (\Throwable $e) { return ['code' => 500, 'msg' => $e->getMessage()]; } } /*详情*/ public function getDetail($where) { $data = Db::name("merchant_intention") ->where($where) ->find(); if ($data) { $data['cate_name'] = Db::name("merchant_category") ->where(['merchant_category_id' => $data['cate_id']]) ->value('category_name'); $data['province_name'] = Db::name("user_province") ->where(['province_id' => $data['province_id']]) ->value('province_name'); $data['city_name'] = Db::name("user_city") ->where(['city_id' => $data['city_id']]) ->value('city_name'); $data['area_name'] = Db::name("user_area") ->where(['area_id' => $data['area_id']]) ->value('area_name'); $data['street_name'] = Db::name("user_street") ->where(['street_id' => $data['street_id']]) ->value('street_name'); } return $data; } /** * 信息回显 * @return array|bool * @author php迷途小书童 * @created 2021/2/22 16:16 */ public function intentionInfo($where){ try { $intention = $this->dao->getWhere($where); $haikeApplyRepository = app()->make(MerchantHaikeApplyRepository::class); $haikeMerchantApply = $haikeApplyRepository->getWhere(['apply_id' => $intention->mer_intention_id,'trade_type' => 'WX,ALI']); $haikeWxApply = $haikeApplyRepository->getWhere(['apply_id' => $intention->mer_intention_id,'apply_type' => 2]); $haikeAliApply = $haikeApplyRepository->getWhere(['apply_id' => $intention->mer_intention_id,'apply_type' => 3]); $merchantInfo = []; if (!$haikeMerchantApply) { $merchantInfo['code'] = 0; $merchantInfo['msg'] = '暂无申请信息'; } else { //如果海科审核拒绝 if (in_array($haikeMerchantApply->status, [1,5,6])) { $intention->status = 2; $intention->check_result = $haikeMerchantApply->check_result; $intention->save(); } else if ($haikeWxApply->status == 2) { $str = substr($haikeWxApply->check_result, strpos($haikeWxApply->check_result, '{')); $array = json_decode($str, true); $intention->status = 2; $intention->check_result = $array['result_msg'] ?? ''; $intention->save(); } else if ($haikeAliApply->status == 2) { $str = substr($haikeAliApply->check_result, strpos($haikeAliApply->check_result, '{')); $array = json_decode($str, true); $intention->status = 2; $intention->check_result = $array['result_msg'] ?? ''; $intention->save(); } else { if ($intention->status != 1) { $intention->status = 0; $intention->check_result = ''; $intention->save(); } $merchantInfo['code'] = 0; $merchantInfo['msg'] = '暂无申请信息'; } } $intention = $this->wxAuthStatus($intention, $haikeApplyRepository, $width = '200px'); if (in_array($intention->haike_wx_auth_result_code, ['未授权'])) { $intention->haike_wx_auth_result_code = ''; $intention->haike_wx_auth_result_msg = ''; } if (in_array($intention->haike_wx_auth_result_code, ['已授权'])) { $intention->haike_wx_auth_result_code = ''; $intention->haike_wx_auth_result_msg = ''; $return = $this->createMer($intention->mer_intention_id); if ($return['code'] == 200) { $this->dao->update($intention->mer_intention_id, ['status' => 1,'check_result' => '已授权', 'mer_id' => $return['data']]); } else { Log::info('创建商户失败:'.$return['msg']); } } if ($intention->haike_wx_auth_result_state == 'APPLYMENT_STATE_REJECTED') { $intention->status = 2; $intention->check_result = $intention->haike_wx_auth_result_msg; $intention->save(); $intention->haike_wx_auth_result_msg = ''; } $sxy_msg=Db::name('declare_log')->where('m_id',$intention->mer_intention_id??0)->order('id','desc')->find(); if($sxy_msg['status']=='SUCCESS' || $sxy_msg['status']=='ESIGN_SUCCESS'){ $sxy_msg='线上已授权'; }else{ $sxy_msg=$sxy_msg['message']; } $intention->check_result=$intention->check_result.' || '. $sxy_msg; return [ 'intention' => $intention, 'haikeMerchantInfo' => $merchantInfo, 'haikeWxAuthInfo' => [ 'haike_wx_auth_result_code' => $intention->haike_wx_auth_result_code, 'haike_wx_auth_result_msg' => $intention->haike_wx_auth_result_msg, ], ]; } catch (\Throwable $e) { Log::info('获取回显信息失败'.$e->getMessage()); return false; } } /*获取省份*/ public function getProvince(){ $data = Db::name("user_province") ->where(['status'=>1]) ->field("province_id,province_code,province_name") ->select(); return $data; } /*获取城市*/ public function getCity($province_code){ $data = Db::name("user_city") ->where(['status'=>1,'province_code'=>$province_code]) ->field("city_id,city_code,city_name") ->select(); return $data; } /*获取区域*/ public function getArea($city_code){ $data = Db::name("user_area") ->where(['status'=>1,'city_code'=>$city_code]) ->field("area_id,area_code,area_name") ->select(); return $data; } /*获取街道*/ public function getStreet($area_code){ $data = Db::name("user_street") ->where(['status'=>1,'area_code'=>$area_code]) ->field("street_id,street_code,street_name") ->select(); return $data; } /*获取用户身份*/ public function getIdentity($uid){ $data = Db::name("user")->where(["uid"=>$uid])->field("identity,account,uid")->find(); return $data; } /*实名认证判断*/ public function real($uid){ $data = Db::name("user_certification")->where(["uid"=>$uid,'status'=>1])->count(); return $data; } public function wxAuthStatus($intention, $haikeApplyRepository, $width = '100px') { if ($intention->haike_wx_auth_apply_status == 1) { $intention->haike_wx_auth_result_code = '已授权'; $intention->haike_wx_auth_result_msg =''; return $intention; } $authAstatusResult = $this->queryMerchantAuthStatus(['merch_no' => $intention->merch_no, 'wx_merch_no' => $intention->haike_wxsub_merch_no]); $intention->haike_wx_auth_result_code = '未授权'; $intention->haike_wx_auth_result_msg =''; if ($authAstatusResult['return_code'] === 10000) { if ($authAstatusResult['authorize_state'] == "AUTHORIZE_STATE_AUTHORIZED") { $intention->haike_wx_auth_apply_status = 1; $intention->save(); $intention->haike_wx_auth_result_code = '已授权'; $intention->haike_wx_auth_result_msg =''; return $intention; } } if ($intention->haike_wx_auth_status === 1) { $haikeApply = $haikeApplyRepository->getWhere(['apply_id' => $intention->mer_intention_id,'trade_type' => 'WXAUTHAPPLY']); if ($haikeApply) { try { $responseApply = $this->queryMerchantApplyStatus($haikeApply->agent_apply_no); $intention->haike_wx_auth_result_state = ''; if ($responseApply['return_code'] !== 10000) { $intention->haike_wx_auth_result_code = $responseApply['return_code']; $intention->haike_wx_auth_result_msg = $responseApply['return_msg']; } else { $intention->haike_wx_auth_result_state = $responseApply['applyment_state']; $intention->haike_wx_auth_result_code = $responseApply['applyment_state']; if (in_array($responseApply['applyment_state'],['APPLYMENT_STATE_WAITTING_FOR_CONFIRM_CONTACT','APPLYMENT_STATE_WAITTING_FOR_CONFIRM_LEGALPERSON','APPLYMENT_STATE_PASSED','APPLYMENT_STATE_FREEZED'])) { $intention->haike_wx_auth_result_msg = ""; } else { if (in_array($responseApply['applyment_state'],['APPLYMENT_STATE_REJECTED'])) { $intention->haike_wx_auth_result_msg = $responseApply['reject_reason']; } else { $intention->haike_wx_auth_result_msg = ''; } } $intention->haike_wx_auth_result_code = $this->getAuthCodeMsg($responseApply['applyment_state'], $intention->haike_wxsub_merch_no); } } catch (\Throwable $e) { $intention->haike_wx_auth_result_state = ''; $intention->haike_wx_auth_result_code = $e->getMessage(); $intention->haike_wx_auth_result_msg = ''; } } } return $intention; } public function getAuthCodeMsg($applyment_state, $haike_wxsub_merch_no) { switch ($applyment_state) { case 'APPLYMENT_STATE_WAITTING_FOR_AUDIT': $msg = '【审核中】:请耐心等待1~2个工作日,微信支付将会完成审核。'; break; case 'APPLYMENT_STATE_EDITTING': $msg = '【编辑中】:可能提交申请发生了错误导致,可用同一个业务申请编号重新提交。'; break; case 'APPLYMENT_STATE_WAITTING_FOR_CONFIRM_CONTACT': $msg = '【待确认联系信息】:请扫描微信支付返回的小程序码确认联系信息。'; break; case 'APPLYMENT_STATE_WAITTING_FOR_CONFIRM_LEGALPERSON': $msg = '【待账户验证】:请扫描微信支付返回的小程序码在小程序端完成账户验证。'; break; case 'APPLYMENT_STATE_PASSED': $msg = '【审核通过】:请扫描微信支付返回的小程序码在小程序端完成授权流程。'; break; case 'APPLYMENT_STATE_REJECTED': $msg = '【审核驳回】:请按照驳回原因修改申请资料,并更换业务申请编码,重新提交申请。'; break; case 'APPLYMENT_STATE_FREEZED': $msg = '【已冻结】:可能是该主体已完成过入驻,请查看驳回原因,并通知驳回原因中指定的联系人扫描微信支付返回的小程序码在小程序端完成授权流程。'; break; case 'APPLYMENT_STATE_CANCELED': $msg = '【已作废】:表示申请单已被撤销,无需再对其进行操作。'; break; default: $msg = '未知。'; break; } return $msg . '微信子商户号:' .$haike_wxsub_merch_no; } public function createSXY($id){ $intention = $this->getDetail(['mer_intention_id'=>$id]); //签约名称 $arr['signedName'] = $intention['name']; if($intention['type'] != 3){ $arr['signedName'] = $intention['mer_name']; } if($intention['acc_type'] != "10A"){//对私全部以自然人身份入网 $arr['signedName'] = $intention['name']; } // if($intention['acc_type'] == "10A" || $intention['type'] == 1){//10A对公10B对私 对公或者企业填公司名称 // $arr['signedName'] = $intention['mer_name']; // } // if($intention['acc_type'] == '10A' && $intention['type'] == 2){//个体可以对公 // $arr['signedName'] = $intention['mer_name']; // } // if($intention['acc_type'] == '10B' && $intention['type'] == 2){//个体可以对私 // $arr['signedName'] = $intention['name']; // } //end if($intention['type'] == 1){//企业 $arr['registerRole'] = 'ENTERPRISE_LEGAL_PERSON'; }elseif ($intention['type'] == 2){//个体 $arr['registerRole'] = 'INDIVIDUAL_BUSINESS'; }elseif ($intention['type'] == 3){//个人 $arr['registerRole'] = 'NATURAL_PERSON'; } if($intention['acc_type'] != "10A"){//对私全部以自然人身份入网 $arr['registerRole'] = 'NATURAL_PERSON'; } $arr['cerType'] = 'ID_CARD'; // //个人传其他 个体跟企业传营业执照 // if($intention['type'] == 3){ // $arr['cerType'] = 'OTHERS'; // } // if($intention['type'] == 1 || $intention['type'] == 2){ // $arr['cerType'] = 'BUSINESS_LICENSE'; // } $arr['signedShorthand'] = $arr['signedName']; $arr['businessAddressProvince'] = $this -> getAddress($intention['province_id'],'province'); $arr['businessAddressCity'] = $this -> getAddress($intention['city_id'],'city'); $arr['businessAddressArea'] = $this -> getAddress($intention['area_id'],'area'); $arr['businessAddress'] = $intention['addr']; $arr['contactName'] = $intention['name']; $arr['contactEmail'] = $intention['email']; $arr['contactPhone'] = $intention['phone']; $arr['businessClassification'] = 'ELECTRONIC_BUSINESS_16';//电商_其他 //银行 $arr['bankCode'] = $this -> getSXYBankCode($intention['bank_deposit']); $arr['bankBranchName'] =$intention['bank_branch']; //开户名称 $arr['accountName'] = $intention['name'];//开户名称 if($intention['acc_type'] == "10B"){ $arr['accountName'] = $intention['name']; } if($intention['acc_type'] == "10A"){//10A对公10B对私 对公或者企业填公司名称 $arr['accountName'] = $intention['mer_name']; } if($intention['acc_type'] == '10A'){//个体可以对公 $arr['accountName'] = $intention['mer_name']; } // if($intention['acc_type'] == '10B' && $intention['type'] == 2){//个体可以对私 // $arr['accountName'] = $intention['name']; // } //end str_replace(' ', '', $intention['bank_account']); $arr['bankCardNo'] = str_replace(' ', '', $intention['bank_account']);; $arr['cityCode'] = Db::name("user_city") ->where(['city_id' => $intention['city_id']]) ->value('city_code'); $arr['provinceCode'] = Db::name("user_province") ->where(['province_id' => $intention['province_id']]) ->value('province_code'); if($intention['acc_type'] == '10A'){//10A对公10B对私 $arr['accountType'] = 'PUBLIC'; }else{ $arr['accountType'] = 'PRIVATE'; } $arr['legalPersonName'] = $intention['name']; $arr['legalPersonIdNo'] = $intention['idcard_no']; $arr['legalPersonPhoneNo'] = $intention['phone']; //registerRole类型为NATURAL_PERSON必填 $arr['profession'] = $arr['registerRole'] == 'NATURAL_PERSON' ? 6 : ''; //end $arr['legalPersonIdType'] = 'IDCARD'; $arr['legalPersonIdNoSup'] = $intention['idcard_no']; $arr['idEffectiveDateStart'] = $intention['identification_valid_date_start']; $arr['idEffectiveDateEnd'] = $intention['identification_valid_date_end'] == 'forever' ? '2099-12-31' : $intention['identification_valid_date_end']; //registerRole类型不为NATURAL_PERSON必填 $arr['cerNoType'] = $arr['registerRole'] != 'NATURAL_PERSON' ? 'SOCIAL_CREDIT_NO' : ''; $arr['cerNo'] = $arr['registerRole'] != 'NATURAL_PERSON' ? $intention['credit_code'] : ''; $arr['sellingArea'] = 'B'; $arr['staffSize'] = 'B'; $arr['businessLicensePath'] = $arr['registerRole'] != 'NATURAL_PERSON' ? $this -> sxyPath($intention['business_license']) : ''; //end $arr['legalIdCardProsPath'] = $this -> sxyPath($intention['card_positive_person']); $arr['legalIdCardConsPath'] = $this -> sxyPath($intention['card_back_person']); //openAccountPath 商户类型不为自然人及个体工商户时必传 //legalPersonBankCardPath 商户类型为自然人时必传,为个体工商户时此项和openAccountPath二选一进行传递 // $arr['openAccountPath'] = ''; $arr['legalPersonBankCardPath'] = ''; //非个人非个体 if ($intention['type'] != 3 && $intention['type'] != 2) { $arr['openAccountPath'] = $this -> sxyPath($intention['open_account']) ?: ''; } //个人 if ($intention['type'] == 3) { $arr['legalPersonBankCardPath'] = $this -> sxyPath($intention['open_account']) ?: ''; } //个体对公 if ($intention['type'] == 2 && $intention['acc_type'] != '10B') { $arr['openAccountPath'] = $this -> sxyPath($intention['open_account']) ?: ''; } //对私 if ($intention['acc_type'] != '10A') { $arr['legalPersonBankCardPath'] = $this -> sxyPath($intention['open_account']) ?: ''; } //对公 if ($intention['type'] == 1 && $intention['acc_type'] != '10B') { $arr['legalPersonBankCardPath'] = $this -> sxyPath($intention['open_account']) ?: ''; } $arr['m_id'] = $intention['mer_intention_id']; $res = ShouxinyiApiRequest::merchantApply($arr); Db::name("log")->insert(array('data'=>json_encode($res)));//日志记录 return true; } public function sxyPath($file1){ if ($file1 == '') return false; $path = "/serviceprovider/chuxubao/".date('Ymd')."/"; //本地路径 $file1 = str_replace('http://app.bjtdba.com','',$file1); $file1 = str_replace('https://app.bjtdba.com','',$file1); //远程路径含文件名 $f = explode("/",$file1); $file = $path.$f[count($f)-1]; $sxy = ShouxinyiApiRequest::uploadSFtp($path,$file,"./public".$file1); return $file; } public function getAddress($id,$type){ if($type == 'province'){ $res = Db::name("user_province") ->where(['province_id' => $id]) ->field('province_code,short_name') ->find(); $code = $res['province_code']; $check = Db::name("sxy_business_address") -> where('code',$code) -> find(); if(!$check){ $code = Db::name("sxy_business_address") -> where("province like '%".$res['short_name']."%'") -> value('code'); } return $code; } if($type == 'city'){ $res = Db::name("user_city") ->where(['city_id' => $id]) ->field('city_code,short_name') ->find(); $code = $res['city_code']; $check = Db::name("sxy_business_address") -> where('code',$code) -> find(); if(!$check){ $code = Db::name("sxy_business_address") -> where("city like '%".$res['short_name']."%'") -> value('code'); } return $code; } if($type == 'area'){ $res = Db::name("user_area") ->where(['area_id' => $id]) ->field('area_code,short_name') ->find(); $code = $res['area_code']; $check = Db::name("sxy_business_address") -> where('code',$code) -> find(); if(!$check){ $code = Db::name("sxy_business_address") -> where("area like '%".$res['short_name']."%'") -> value('code'); } return $code; } return ''; } public function getHfAddress($id,$type){ if($type == 'province'){ $res = Db::name("user_province") ->where(['province_id' => $id]) ->field('province_code,short_name') ->find(); $code = $res['province_code']; $check = Db::name("hf_business_address") -> where('code',$code) -> find(); if(!$check){ $code = Db::name("hf_business_address") -> where("province like '%".$res['short_name']."%'") -> value('code'); } return $code; } if($type == 'city'){ $res = Db::name("user_city") ->where(['city_id' => $id]) ->field('city_code,short_name') ->find(); $code = $res['city_code']; $check = Db::name("hf_business_address") -> where('code',$code) -> find(); if(!$check){ $code = Db::name("hf_business_address") -> where("city like '%".$res['short_name']."%'") -> value('code'); } return $code; } if($type == 'area'){ $res = Db::name("user_area") ->where(['area_id' => $id]) ->field('area_code,short_name') ->find(); $code = $res['area_code']; $check = Db::name("hf_business_address") -> where('code',$code) -> find(); if(!$check){ $code = Db::name("hf_business_address") -> where("area like '%".$res['short_name']."%'") -> value('code'); } return $code; } return ''; } public function getSXYBankCode($bank_deposit){ $count=strpos($bank_deposit,"中国"); $bank_deposit=substr_replace($bank_deposit,"",$count,6); $code = Db::name("sxy_settlement_bank") ->where("bank_name like '%".$bank_deposit."%'") ->value('code'); if($code) return $code; $bank_deposit = mb_substr($bank_deposit,0,2); $code = Db::name("sxy_settlement_bank") ->where("bank_name like '%".$bank_deposit."%'") ->value('code'); if($code) return $code; $bank_deposit = mb_substr($bank_deposit,2,2); $code = Db::name("sxy_settlement_bank") ->where("bank_name like '%".$bank_deposit."%'") ->value('code'); if($code) return $code; $bank_deposit = mb_substr($bank_deposit,4,2); $code = Db::name("sxy_settlement_bank") ->where("bank_name like '%".$bank_deposit."%'") ->value('code'); if($code) return $code; return ''; } public function huifu_create($id,$type,$key='',$app_id='',$mer_id='') { try { $checkMerchat=Db::name('merchant')->where('mer_id',$mer_id)->find(); if(!$checkMerchat) return '错误'; $app_id='app_383a75dd-c03d-44ab-8f58-92c60fe9b9d0'; $key='api_live_b0a687ec-5450-4ada-a0e4-65bac0f46871'; //拿到商户的信息 $merchat=Db::name('merchant_intention')->where('mer_intention_id',$id)->find(); //商户类型为个人走此 if($merchat['type']==3){ //用户在汇付的ID $member_id='member_personal_'.time().rand(1111,9999); $params=[ 'app_id'=>$app_id, 'member_id'=>$member_id,//商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 'nickname' => $checkMerchat['mer_name'] ]; //创建用户对象 $res=$this->crate_merber_personal_traits($params,$type,$key); if(isset($res['data'])){ $result = json_decode($res['data'],true); Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['status'=>3,'check_result'=>$result['error_msg']]); return $result['error_msg']; } if(!empty($res['error_type'])){ Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['status'=>3,'check_result'=>$res['error_msg']]); return $res['error_msg']; } //个人创建 没有生成结算账户需要手动创建结算账户 $jiesuandata=[ 'app_id'=>$app_id,//应用ID 'member_id'=>$member_id,//商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 'channel'=>'bank_account',//结算类型 目前仅支持银行卡 固定值 bank_account 'account_info'=>[ 'card_id'=>str_replace(" ",'',$merchat['bank_account']),//银行卡号 'card_name'=>$merchat['name'],//银行卡对应的户名 'cert_id'=>$merchat['idcard_no'],//证件号,银行账户类型为对私时,必填 'cert_type'=>'00',//证件类型,仅支持:00-身份证,银行账户类型为对私时,必填 'tel_no'=>$merchat['phone'],//手机号 'bank_name'=>$merchat['bank_deposit'],//开户银行名称 'bank_acct_type'=>2//银行账户类型:1-对公;2-对私 ] ]; //创建该用户的结算账户 $res=$this->create_settleAccounttraits($jiesuandata,$type,$key); if(isset($res['data'])){ $result = json_decode($res['data'],true); //创建失败 Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['status'=>3,'check_result'=>$result['error_msg'],'hf_status'=>3]); return $result['error_msg']; } if(!empty($res['error_type'])){ Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['status'=>3,'check_result'=>$res['error_msg'],'hf_status'=>3]); return $res['error_msg']; } //将生成的id 存入数据库 $insert = [ [ 'mer_id' => $checkMerchat['mer_id'], 'type' => 1, 'member_id' => $checkMerchat['hf_member_id'], 'settle_account_id' => $res['id'] ], [ 'mer_id' => $checkMerchat['mer_id'], 'type' => 2, 'member_id' => $checkMerchat['hf_member_id_wx'], 'settle_account_id' => $res['id'] ], [ 'mer_id' => $checkMerchat['mer_id'], 'type' => 3, 'member_id' => $member_id, 'settle_account_id' => $res['id'] ], ]; Db::name('merchant_member')->where('mer_id', $merchat['mer_id'])->insertAll($insert); Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['status'=>1,'check_result'=>'线下支付已授权','hf_status'=>2]); }else{ //压缩包 $imgs=[ $merchat['business_license'], $merchat['card_positive_person'], $merchat['card_back_person'], $merchat['open_account'], ]; $res=$this->addzip($imgs,'attach_file'); if (!$res){ Db::name('merchant_intention')->where('mer_intention_id',$merchat['mer_intention_id'])->update(['status'=>2,'check_result'=>'图片不存在']); return "图片不存在"; } $file_real_path = realpath($res); $fileInfo = pathinfo($file_real_path); //压缩包end //银行卡编码 $bank_code=Db::name('hf_bank_code')->whereLike('name','%'.$merchat['bank_deposit'].'%')->value('code'); if(!$bank_code){ Db::name('merchant_intention')->where('mer_intention_id',$merchat['mer_intention_id'])->update(['status'=>2,'check_result'=>'银行卡开户行填写不正确']); return "银行卡开户行填写不正确"; } //结算卡类型 if($merchat['acc_type']=='10A'){ $bank_acct_type=1; $card_name=$merchat['mer_name']; }else{ $bank_acct_type=2; $card_name=$merchat['name']; } //有效期为永久 默认值为 20991231 if($merchat['identification_valid_date_end']=='forever'){ $legal_cert_id_expires='20991231'; }else{ $legal_cert_id_expires=date('Ymd',strtotime($merchat['identification_valid_date_end'])); } //有效期为长期 默认值为 20991231 if($merchat['merc_end_time']=='长期'){ $merc_end_time='20991231'; }else{ $merc_end_time=date('Ymd',strtotime($merchat['merc_end_time'])); if($merc_end_time$app_id,//控制台 主页面应用的app_id 'order_no'=>$order_no,//请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 'member_id'=>$member_id,//商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 'name'=>$merchat['mer_name'],//企业名称 'prov_code'=>$this->getHfAddress($merchat['province_id'],'province'),//省份编码 (省市编码) 'area_code'=>$this->getHfAddress($merchat['city_id'],'city'),//地区编码 (省市编码) 'social_credit_code'=>$merchat['credit_code'],//统一社会信用码 'social_credit_code_expires'=>$merc_end_time,//统一社会信用证有效期 'business_scope'=>'零售',//经营范围 'legal_person'=>$merchat['name'],//法人姓名 'legal_cert_id'=>$merchat['idcard_no'],//法人身份证号码 'legal_cert_id_expires'=>$legal_cert_id_expires,//法人身份证有效期(格式:YYYYMMDD,例如:20190909) 'legal_mp'=>$merchat['phone'],//法人手机号 'address'=>$merchat['business_addr'],//企业地址 'bank_code'=>$bank_code,//银行代码,如果需要自动开结算账户,本字段必填(详见附录 银行代码) 'bank_acct_type'=>$bank_acct_type,//银行账户类型:1-对公;2-对私,如果需要自动开结算账户,本字段必填 'card_no'=>$merchat['bank_account'],//银行卡号,如果需要自动开结算账户,本字段必填 'card_name'=>$card_name,//银行卡对应的户名,如果需要自动开结算账户,本字段必填;若银行账户类型是对公,必须与企业名称一致 'notify_url'=>env('APP_URL').'/sys/HuiPay/notify_url/'.'crate_merber_enterprise',//异步通知地址,url为http/https路径,服务器POST回调,URL 上请勿附带参数 ]; //上传附件,传入的中文文件名称为 UTF-8 字符集 URLEncode 编码后的字符串。内容须包含三证合一证件照、法人身份证正面照、法人身份证反面照、开户银行许可证照。 压缩 zip包后上传,最大限制为 9 M。 $params['attach_file']=new \CURLFile($file_real_path,'', $fileInfo['basename']); //增加记录为异步通知做准备 Db::name('hf_user_order')->insert(['mer_intention_id'=>$id,'order_no'=>$order_no]); //创建企业用户并增加结算卡账户 $res=$this->crate_merber_enterprise_traits($params,$type,$key); if (isset($res['data'])){ $result = json_decode($res['data'],true); if(!empty($result['error_type'])){ Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['check_result'=>$result['error_msg']]); return $result['error_msg']; } } if(!empty($res['error_type'])){ Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['check_result'=>$res['error_msg']]); return $res['error_msg']; } //更改汇付状态 Db::name('merchant_intention')->where('mer_intention_id',$id)->update(['hf_status'=>1,'check_result'=>'审核中']); } Db::name('user')->where('uid',$merchat['uid'])->update([ 'user_group'=>4 ]); return "success"; }catch (\Exception $exception){ Db::name('log')->insert(['data'=>$exception->getFile().':'.$exception->getLine().'【'.$exception->getMessage().'】']); return ['data'=>$exception->getFile().':'.$exception->getLine().'【'.$exception->getMessage().'】']; } } /** * 将优化后的二维码添加到压缩包 */ public function addzip($show_src,$name='attach_file') { try { $tmpDir = './public/zip/'; // if (!file_exists($tmpDir)) { //创建文件夹 mkdir($tmpDir, 0777, true); } // $phone=Db::name('user_agent') // ->where('u_a.user_id',$uid) // ->alias('u_a') // ->leftJoin('user u','u_a.user_id=u.uid') // ->field('u.phone') // ->find(); $zipName = date('YmdHis') . mt_rand(1000, 9999) . '.zip'; // 压缩包文件名 if($name > 0){ $rend=md5(mt_rand(100000000, 999999999)); $zipName = $name . '_' . $rend . '.zip'; // 压缩包文件名 } $zipNameUrl = $tmpDir . $zipName; // 文件路径 //生成文件 $zip = new \ZipArchive(); if ($zip->open($zipNameUrl, \ZipArchive::OVERWRITE) !== true) { //OVERWRITE 参数会覆写压缩包的文件 文件必须已经存在 if ($zip->open($zipNameUrl, \ZipArchive::CREATE) !== true) { // 文件不存在则生成一个新的文件 用CREATE打开文件会追加内容至zip return '下载失败,文件夹不存在'; } } foreach ($show_src as $file) { //判断图片是否存在 $isFile = $this->checkFileExists($file); if (!$isFile) { continue; } //抓取图片内容 $fileContent = file_get_contents($file); //添加图片 $zip->addFromString(basename($file), $fileContent); } // 关闭 $zip->close(); $qrcodeData=[ 'url'=>'./public/zip/'.$zipName, 'ctime'=>time() ]; return $qrcodeData['url']; }catch(\Exception $e){ log::info($e->getMessage()); return false; } } /** * 判断文件是否存在,支持本地及远程文件 * @param String $file 文件路径 * @return Boolean */ private function checkFileExists($file) { // 远程文件 if (strtolower(substr($file, 0, 5)) == 'https') { // 远程文件 $header = get_headers($file, true); return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304')); } elseif (strtolower(substr($file, 0, 4)) == 'http') { // 远程文件 $header = get_headers($file, true); return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304')); } else { // 本地文件 return file_exists($file); } } //进件 汇付 public function UpgradeToMerchants($merchant_params,$name) { $merchant_params['fee_rate_list']='[{"rate_channel": "wx_pub_online","fee_rate": "0.008"}, {"rate_channel": "wx_pub_offline","fee_rate": "0.0038"}, {"rate_channel": "wx_lite_online","fee_rate": "0.007"}, {"rate_channel": "wx_lite_offline","fee_rate": "0.0038"}, {"rate_channel": "wx_scan","fee_rate": "0.0038"}, {"rate_channel": "alipay_qr_online","fee_rate": "0.007"}, {"rate_channel": "alipay_qr_offline","fee_rate": "0.0038"}, {"rate_channel": "alipay_scan","fee_rate": "0.0038"}, {"rate_channel": "alipay_lite_online","fee_rate": "0.007"}, {"rate_channel": "alipay_lite_offline","fee_rate": "0.0038"}, {"rate_channel": "alipay_call","fee_rate": "0.007"}, {"rate_channel": "union_qr_under","fee_rate": "0.0038"}, {"rate_channel": "union_qr_beyond","fee_rate": "0.007"}, {"rate_channel": "union","fee_rate": "0.007"}, {"rate_channel": "alipay_pub","fee_rate": "0.0038"}]'; Db::name('log')->insert(['data'=>json_encode($merchant_params)]); return $this->incoming_parts($merchant_params,$name); } //进件 汇付 public function incoming_select($merchant_params,$name) { return $this->incoming_parts_select($merchant_params,$name); } public function ruzhu($ruzhu_data,$name) { return $this->Merchant_settlement($ruzhu_data,$name); } public function ruzhu_query($ruzhu_query_data,$name) { return $this->Merchant_settlement_select($ruzhu_query_data,$name); } public function merProfilePictures($data,$name) { $up_dir = '/uploads/users/huifu_upload/'; $new_file = (int)(microtime(true) * 1000); $res=$this->uploadImg($data['file'],$up_dir,$new_file); Db::name('log')->insert(['data'=>json_encode($res)]); $file_real_path = realpath($res['path']); $fileInfo = pathinfo($file_real_path); $data['file']=new \CURLFile($file_real_path,'', $fileInfo['basename']) ; $data=$this->merProfilePicture($data,$name); if(empty($data['error_type'])){ $data=['file_type'=>$data['file_type'],'pic_id'=>$data['pic_id']]; }else{ $data=['errro_msg'=>$data['error_msg']]; } return $data; } public function uploadImg(string $image, string $up_dir,$new_file) { $base64_img = trim($image); if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result)) { $type = $result[2]; if (in_array($type, array('pjpeg', 'jpeg', 'jpg','JPG', 'gif', 'bmp', 'png'))) { if (!is_dir('./public' .$up_dir)) { mkdir('./public' .$up_dir,0777,true); } // $new_file = (int)(microtime(true) * 1000); $imgName = $up_dir . "{$new_file}." . $type; $new_file = './public'.$imgName; if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_img)))) { // 完整的图片地址 return ["path"=>$new_file,"suffix"=>$type]; } else { return false; } } } return false; } public function commit_res($data,$name) { return $this->merProfileForAudit($data,$name); } public function commit_res_query($data) { return $this->merProfileAuditStatus($data); } }