123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <?php
- namespace app\api\controller;
- use app\event\Msg;
- use app\logics\EmployeeLogic;
- use app\logics\OrgLogic;
- use app\logics\UserLogic;
- use app\model\Company;
- use app\model\CustomerClue;
- use app\model\Employee;
- use app\model\Miniprogram;
- use app\model\Org;
- use app\model\User as ModelUser;
- use Firebase\JWT\JWT;
- use openssl\Aes;
- use wx\miniprogram\User as MiniprogramUser;
- class User extends Base
- {
- /**
- * 用户登陆
- * @return json [code:状态,token:jwt_token, exist:是否已注册]
- */
- public function code2session($code)
- {
- $user = new MiniprogramUser();
- $request = request();
- // 小程序类型获取
- $miniType = $request->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]);
- }
- }
|