param('client_type'); // 查找小程序根部门 $miniprogram = Miniprogram::where([['notify', '=', $miniType]])->findOrEmpty(); if ($miniprogram->isEmpty()) return json(['code' => self::error_msg, 'msg' => '未授权的小程序']); // code获取用户信息 $rs = $user->code2session($miniprogram->appid, $miniprogram->secret, $code); /** 调试 start */ // $rs = [ // 'openid'=>'oVCzo6Vp3a9hjQf4uQ-2P0ijY6s8', // 'session_key'=>'session_key' // ]; /** 调试 end */ if (isset($rs['errcode']) && $rs['errcode'] != 0) { return json(['code' => self::error_debug_msg, 'msg' => $rs['errmsg']]); } $token = [ 'openid' => $rs['openid'], 'session_key' => $rs['session_key'], 'client_type' => $miniType, 'root_org' => $miniprogram->root_id, 'isEmployee' => false ]; $shareuser = null; $share = $this->request->param('share'); if ($share) { $shareuser = ModelUser::where(['id' => $share, 'root_id' => $miniprogram->root_id])->field('id,nickname,headimgurl,phone')->find(); if ($shareuser) { $shareUid = $shareuser['id']; $firstShareEmp = Employee::where(['uid' => $shareuser['id']])->find(); if ($firstShareEmp['state'] == '离职' && $firstShareEmp['left_to_empid']) { $passedEmp = Employee::where(['id' => $firstShareEmp['left_to_empid']])->find(); $shareUid = $passedEmp['uid']; $shareuser = ModelUser::where('id', $shareUid)->field('id,nickname,headimgurl,phone')->find(); } $token['share'] = $shareUid; $shareBind = Employee::with(['employee_card'])->where([['uid', '=', $shareUid], ['state', '=', '在职']])->find(); if ($shareBind) { $token['share_employee'] = $shareBind['id']; $token['share_org'] = $shareBind['org_id']; $shareuser['position'] = empty($shareBind['employee_card']) ? '' : $shareBind['employee_card']['position']; $shareuser['qrcode'] = $shareBind['qrcode']; $shareuser['name'] = $shareBind['name']; } } } // 检测是否需要获取用户信息 $logic = new UserLogic(); $user = $logic->getInfo([['mini_openid', '=', $rs['openid']], ['root_id', '=', $token['root_org']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']); if ($user) $token['uid'] = $user['id']; // 绑定企业信息设置 if (isset($user['binded'])) { $company = Company::where('root_id',$token['root_org'])->find(); if ($company['status']==0 && $company['end_date'] >= date('Y-m-d')) { $token['employee_id'] = $user['binded']['id']; $token['org_id'] = $user['binded']['org_id']; $orgType = Org::where('id', $token['org_id'])->value('org_type'); $token['org_type'] = $orgType; $token['isEmployee'] = true; } } elseif ($user) { $this->addClue([ 'uid' => $token['uid'], 'employee_id' => $token['share_employee'] ?? 0, 'org_id' => $token['share_org'] ?? $token['root_org'] ]); } // 信息加密 $data = http_build_query($token); $aes = new Aes(config('app.jwt_key')); $key = $aes->encrypt($data); // token数据设置 $payload = array( "iss" => "https://" . $request->domain(), "aud" => 'mini', "iat" => time(), "nbf" => time(), "data" => $key ); // 自定义登陆状态 $token = JWT::encode($payload, config('app.jwt_key')); $company = Company::where('root_id', $miniprogram->root_id)->find(); $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company]; empty($shareuser) ?: $returnData['share'] = $shareuser; return json($returnData); } private function addClue($data) { // 如果线索是员工(包含运维,已离职,待审核) $isEmp = Employee::where(['uid' => $data['uid']])->count(); if ($isEmp) return; // 如果线索已经获取过,更新时间 if ($data['employee_id'] == 0) { // 判断是否有员工已获取 CustomerClue::where([['uid', '=', $data['uid']]])->update(['updatetime' => date('Y-m-d H:i:s')]); } else { // 判读是否重复获取 $rs = CustomerClue::where([['uid', '=', $data['uid']], ['employee_id', '=', $data['employee_id']]])->update(['updatetime' => date('Y-m-d H:i:s')]); // 没有更新过,创建线索 if (!$rs && $data['employee_id'] !== 0) { CustomerClue::create($data); } } } /** * 授权获取用户信息(客户小程序调用) */ public function setUserInfo($encryptedData, $iv, $signature, $rawData) { $request = request(); $token = $request->token; // 计算签名是否正确 $sign = sha1($rawData . $token['session_key']); if ($sign != $signature) { return json(['code' => self::error_debug_msg, 'msg' => '签名验证失败']); } $miniprogram = Miniprogram::where([['root_id', '=', $token['root_org']]])->findOrEmpty(); // 解析获取用户数据 $mini = new MiniprogramUser(); $data = $mini->getInfo($miniprogram->appid, $token['session_key'], $encryptedData, $iv); $saveData = [ 'mini_openid' => $token['openid'], 'city' => $data['city'], 'province' => $data['province'], 'country' => $data['country'], 'sex' => $data['gender'], 'nickname' => $data['nickName'], 'headimgurl' => $data['avatarUrl'], 'root_id' => $token['root_org'] ]; // 保存用户信息 $logic = new UserLogic(); $info = $logic->saveMiniInfo($saveData); // 更新token if (empty($token['uid'])) { $token['uid'] = $info['id']; // 添加客户线索 $this->addClue([ 'uid' => $token['uid'], 'employee_id' => $token['share_employee'] ?? 0, 'org_id' => $token['share_org'] ?? $token['root_org'] ]); } $data = http_build_query($token); $aes = new Aes(config('app.jwt_key')); $key = $aes->encrypt($data); $payload = array( "iss" => "https://" . $this->request->domain(), "iat" => time(), "nbf" => time(), "data" => $key ); // 自定义登陆状态 $token = JWT::encode($payload, config('app.jwt_key')); return json(['code' => self::success, 'msg' => '信息保存成功', 'token' => $token]); } /** * 授权获取并保存用户手机号 */ public function setUserMobile($encryptedData, $iv) { $request = request(); $type = $request->token['client_type']; $miniprogram = Miniprogram::where([['notify', '=', $type]])->findOrEmpty(); if ($miniprogram->isEmpty()) return json(['code' => self::error_msg, 'msg' => '未授权的小程序']); $mini = new MiniprogramUser(); $data = $mini->getInfo($miniprogram->appid, $request->token['session_key'], $encryptedData, $iv); $saveData = [ 'mini_openid' => $request->token['openid'], 'phone' => $data['phoneNumber'], 'root_id' => $request->token['root_org'] ]; // 保存用户信息 $logic = new UserLogic(); $info = $logic->saveMiniInfo($saveData); if (empty($info)) return json(['code' => self::error_msg, 'msg' => '未获取到个人信息']); // // 如果不是员工 // if (!empty($request->token['employee_id'])) { // // 更新员工的uid // Employee::where([['phone', '=', $info->phone],['root_id', '=', $request->token['root_org']]])->update(['uid' => $info->id]); // } // 线索更新手机号 if (!empty($request->token['share_employee'])) { CustomerClue::where([ 'uid' => $request->token['uid'], 'employee_id' => $request->token['share_employee'] ])->update(['phone' => $data['phoneNumber']]); } return json(['code' => self::success, 'msg' => '信息保存成功', 'mobile' => $data['phoneNumber']]); } /** * 员工注册 */ public function register() { $params = request()->param(['is_manager', 'name', 'orgid']); $result = EmployeeLogic::addemployee($params, $msg); if ($result) { $leader = Employee::where(['org_id'=>$params['orgid'], 'is_manager'=>1])->column('id'); event(new Msg($leader, '您接收到一条新审批,请点击前往审阅', 'register')); return json(['code' => 0, 'msg' => '成功提交', 'data' => $result]); } else { return json(['code' => 1, 'msg' => $msg]); } } /** * 组织结构 */ public function org() { $token = request()->token; $data = OrgLogic::struc($token['root_org']); return json(['code' => 0, 'data' => $data]); } }