request->param('client_type'); // 查找小程序根部门 if (!empty($miniType)) { $miniprogram = Miniprogram::where([['notify', '=', $miniType]])->findOrEmpty(); $rootOrg = $miniprogram->root_id; $miniprogramId = Company::where('root_id', $rootOrg)->value('mini'); $miniprogram = Wechat::findOrEmpty($miniprogramId); } else { $defaultRootOrg = Miniprogram::where([['notify', '=', config('app.cgi')]])->value('root_id'); if (empty($client)) { $miniprogram = Wechat::findOrEmpty(1); } else { $miniprogram = Wechat::where('appid', $client)->findOrEmpty(); } } if ($miniprogram->isEmpty()) return json(['code' => self::error_msg, 'msg' => '未授权的小程序']); // code获取用户信息 $rs = (new MiniprogramUser())->code2session($miniprogram->appid, $miniprogram->secret, $code); if (isset($rs['errcode']) && $rs['errcode'] != 0) { return json(['code' => self::error_debug_msg, 'msg' => $rs['errmsg']]); } // 初始token $token = [ 'openid' => $rs['openid'], 'session_key' => $rs['session_key'], 'client_type' => $miniType, 'isEmployee' => false, 'mini' => $miniprogram->id ]; $multi = ModelUser::whereOr([['unionid', '=', $rs['unionid']], ['mini_openid', '=', $rs['openid']]])->count(); // 查询用户数量 if ($multi == 1) { $user = ModelUser::whereOr([['unionid', '=', $rs['unionid']], ['mini_openid', '=', $rs['openid']]])->find(); if (!empty($rootOrg) && $user->root_id != $rootOrg) $user = null; } elseif ($multi > 1) { if (!empty($rootOrg)) { $user = ModelUser::whereOr([[['unionid', '=', $rs['unionid']], ['root_id', '=', $rootOrg]], [['mini_openid', '=', $rs['openid']], ['root_id', '=', $rootOrg]]])->find(); } else { // 查询用户最后进入记录 $user = ModelUser::whereOr([['unionid', '=', $rs['unionid']], ['mini_openid', '=', $rs['openid']]])->order('updatetime desc')->find(); } } if (empty($user)) { $data = [ 'mini_openid' => $rs['openid'], 'unionid' => $rs['unionid'], 'root_id' => $rootOrg ?? $defaultRootOrg, 'updatetime' => date('Y-m-d H:i:s') ]; $user = ModelUser::create($data); } else { $user->updatetime = date('Y-m-d H:i:s'); if (empty($user->unionid)) $user->unionid = $rs['unionid']; $user->mini_openid = $rs['openid']; $user->save(); } $rootOrg = $user->root_id; $token['root_org'] = $rootOrg; $token['client_type'] = Miniprogram::where(['root_id' => $rootOrg])->value('notify'); $token['uid'] = $user->id; $userData = $user->visible(['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone'])->toArray(); $employee = Employee::where([['uid', '=', $user->id], ['state', 'in', ['在职', '待审核']]])->find(); if ($employee) { $employee->save(['updatetime' => date('Y-m-d H:i:s')]); if ($employee->disable == 0) { $userData['binded'] = [ 'id' => $employee->id, 'name' => $employee->name, 'org_name' => $employee->org->name, 'org_id' => $employee->org_id, 'isManager' => $employee->is_manager, 'isNewbie' => $employee->is_newbie, 'state' => $employee->state, 'qrcode' => $employee->qrcode ]; } $token['isEmployee'] = true; $token['employee_id'] = $employee->id; $token['org_id'] = $employee->org_id; } $shareuser = null; $share = $this->request->param('share'); $share_agent_id = $this->request->param('share_agent_id'); //通过经纪人分享打开的 $share_agent_id = isset($share_agent_id)&&!empty($share_agent_id) ? $share_agent_id : 0; if ($share && !$token['isEmployee']) { $shareuser = ModelUser::where(['id' => $share, 'root_id' => $rootOrg])->field('id,nickname,headimgurl,phone')->find(); if ($shareuser) { $shareBind = Employee::where(['uid' => $shareuser->id])->find(); if ($shareBind && $shareBind['state'] == '离职' && $shareBind['left_to_empid']) { // 如果分享人已离职 $shareBind = Employee::where(['id' => $shareBind['left_to_empid']])->find(); $shareuser = ModelUser::where('id', $shareBind->uid)->field('id,nickname,headimgurl,phone')->find(); } $token['share'] = $shareuser->id; if ($shareBind && $shareBind['state'] == '在职') { $token['share_employee'] = $shareBind->id; $token['share_org'] = $shareBind->org_id; $token['share_agent_id'] = $share_agent_id; //经纪人分享的 $shareuser['qrcode'] = $shareBind->qrcode; } if (!$token['isEmployee'] && !empty($user->nickname) && !empty($user->headimgurl)) { $this->addClue([ 'uid' => $userData['id'], 'employee_id' => $token['share_employee'] ?? 0, 'org_id' => $token['share_org'] ?? $token['root_org'], 'agent_id' => $share_agent_id ], $token['root_org']); } } } $company = Company::where('root_id', $rootOrg)->find()->toArray(); $company['client_type'] = $token['client_type']; // 信息加密 $data = http_build_query($token); $aes = new Aes(config('app.jwt_key')); $key = $aes->encrypt($data); // token数据设置 $payload = array( "iss" => "https://" . $this->request->domain(), "aud" => 'mini', "iat" => time(), "nbf" => time(), "data" => $key ); // 自定义登陆状态 $token = JWT::encode($payload, config('app.jwt_key')); $returnData = ['code' => self::success, 'token' => $token, 'user' => $userData, 'company' => $company['company_name'], 'company_data' => $company]; empty($shareuser) ?: $returnData['share'] = $shareuser; return json($returnData); } private function addClue($data, $root_id) { // 如果线索是员工(包含运维,已离职,待审核) $isEmployee = Employee::where([['uid', '=', $data['uid']], ['root_id', '=', $root_id], ['state', 'in', ['在职', '待审核']]])->find(); if ($isEmployee) return false; // 如果线索已经获取过,更新时间 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 = Wechat::where([['id', '=', $token['mini']]])->find(); // 解析获取用户数据 $mini = new MiniprogramUser(); $data = $mini->getInfo($miniprogram->appid, $token['session_key'], $encryptedData, $iv); $user = ModelUser::where([['mini_openid', '=', $request->token['openid']], ['root_id', '=', $token['root_org']]])->find(); // 保存用户信息 $user->save([ 'city' => $data['city'], 'province' => $data['province'], 'country' => $data['country'], 'sex' => $data['gender'], 'nickname' => $data['nickName'], 'headimgurl' => $data['avatarUrl'] ]); // 更新token if (!$token['isEmployee']) { // 添加客户线索 $this->addClue([ 'uid' => $token['uid'], 'employee_id' => $token['share_employee'] ?? 0, 'org_id' => $token['share_org'] ?? $token['root_org'], 'agent_id' => $token['share_agent_id'] ?? 0 ], $token['root_org']); } return json(['code' => self::success, 'msg' => '信息保存成功']); } /** * 授权获取并保存用户手机号 */ public function setUserMobile($encryptedData, $iv) { $request = request(); $miniprogram = Wechat::where([['id', '=', $request->token['mini']]])->find(); $mini = new MiniprogramUser(); $data = $mini->getInfo($miniprogram->appid, $request->token['session_key'], $encryptedData, $iv); $user = ModelUser::where([['mini_openid', '=', $request->token['openid']], ['root_id', '=', $request->token['root_org']]])->find(); $user->save(['phone' => $data['phoneNumber']]); // 线索更新手机号 if (!$request->token['isEmployee'] && !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]); } }