1
0

User.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. namespace app\api\controller;
  3. use app\event\Msg;
  4. use app\logics\EmployeeLogic;
  5. use app\logics\OrgLogic;
  6. use app\logics\UserLogic;
  7. use app\model\Company;
  8. use app\model\CustomerClue;
  9. use app\model\Employee;
  10. use app\model\Miniprogram;
  11. use app\model\Org;
  12. use app\model\User as ModelUser;
  13. use Firebase\JWT\JWT;
  14. use openssl\Aes;
  15. use wx\miniprogram\User as MiniprogramUser;
  16. class User extends Base
  17. {
  18. /**
  19. * 用户登陆
  20. * @return json [code:状态,token:jwt_token, exist:是否已注册]
  21. */
  22. public function code2session($code)
  23. {
  24. $user = new MiniprogramUser();
  25. $request = request();
  26. // 小程序类型获取
  27. $miniType = $request->param('client_type');
  28. // 查找小程序根部门
  29. $miniprogram = Miniprogram::where([['notify', '=', $miniType]])->findOrEmpty();
  30. if ($miniprogram->isEmpty()) return json(['code' => self::error_msg, 'msg' => '未授权的小程序']);
  31. // code获取用户信息
  32. $rs = $user->code2session($miniprogram->appid, $miniprogram->secret, $code);
  33. /** 调试 start */
  34. // $rs = [
  35. // 'openid'=>'oVCzo6Vp3a9hjQf4uQ-2P0ijY6s8',
  36. // 'session_key'=>'session_key'
  37. // ];
  38. /** 调试 end */
  39. if (isset($rs['errcode']) && $rs['errcode'] != 0) {
  40. return json(['code' => self::error_debug_msg, 'msg' => $rs['errmsg']]);
  41. }
  42. $token = [
  43. 'openid' => $rs['openid'],
  44. 'session_key' => $rs['session_key'],
  45. 'client_type' => $miniType,
  46. 'root_org' => $miniprogram->root_id,
  47. 'isEmployee' => false
  48. ];
  49. $shareuser = null;
  50. $share = $this->request->param('share');
  51. if ($share) {
  52. $shareuser = ModelUser::where(['id' => $share, 'root_id' => $miniprogram->root_id])->field('id,nickname,headimgurl,phone')->find();
  53. if ($shareuser) {
  54. $shareUid = $shareuser['id'];
  55. $firstShareEmp = Employee::where(['uid' => $shareuser['id']])->find();
  56. if ($firstShareEmp['state'] == '离职' && $firstShareEmp['left_to_empid']) {
  57. $passedEmp = Employee::where(['id' => $firstShareEmp['left_to_empid']])->find();
  58. $shareUid = $passedEmp['uid'];
  59. $shareuser = ModelUser::where('id', $shareUid)->field('id,nickname,headimgurl,phone')->find();
  60. }
  61. $token['share'] = $shareUid;
  62. $shareBind = Employee::with(['employee_card'])->where([['uid', '=', $shareUid], ['state', '=', '在职']])->find();
  63. if ($shareBind) {
  64. $token['share_employee'] = $shareBind['id'];
  65. $token['share_org'] = $shareBind['org_id'];
  66. $shareuser['position'] = empty($shareBind['employee_card']) ? '' : $shareBind['employee_card']['position'];
  67. $shareuser['qrcode'] = $shareBind['qrcode'];
  68. $shareuser['name'] = $shareBind['name'];
  69. }
  70. }
  71. }
  72. // 检测是否需要获取用户信息
  73. $logic = new UserLogic();
  74. $user = $logic->getInfo([['mini_openid', '=', $rs['openid']], ['root_id', '=', $token['root_org']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']);
  75. if ($user) $token['uid'] = $user['id'];
  76. // 绑定企业信息设置
  77. if (isset($user['binded'])) {
  78. $company = Company::where('root_id',$token['root_org'])->find();
  79. if ($company['status']==0 && $company['end_date'] >= date('Y-m-d')) {
  80. $token['employee_id'] = $user['binded']['id'];
  81. $token['org_id'] = $user['binded']['org_id'];
  82. $orgType = Org::where('id', $token['org_id'])->value('org_type');
  83. $token['org_type'] = $orgType;
  84. $token['isEmployee'] = true;
  85. }
  86. } elseif ($user) {
  87. $this->addClue([
  88. 'uid' => $token['uid'],
  89. 'employee_id' => $token['share_employee'] ?? 0,
  90. 'org_id' => $token['share_org'] ?? $token['root_org']
  91. ]);
  92. }
  93. // 信息加密
  94. $data = http_build_query($token);
  95. $aes = new Aes(config('app.jwt_key'));
  96. $key = $aes->encrypt($data);
  97. // token数据设置
  98. $payload = array(
  99. "iss" => "https://" . $request->domain(),
  100. "aud" => 'mini',
  101. "iat" => time(),
  102. "nbf" => time(),
  103. "data" => $key
  104. );
  105. // 自定义登陆状态
  106. $token = JWT::encode($payload, config('app.jwt_key'));
  107. $company = Company::where('root_id', $miniprogram->root_id)->find();
  108. $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company];
  109. empty($shareuser) ?: $returnData['share'] = $shareuser;
  110. return json($returnData);
  111. }
  112. private function addClue($data)
  113. {
  114. // 如果线索是员工(包含运维,已离职,待审核)
  115. $isEmp = Employee::where(['uid' => $data['uid']])->count();
  116. if ($isEmp) return;
  117. // 如果线索已经获取过,更新时间
  118. if ($data['employee_id'] == 0) { // 判断是否有员工已获取
  119. CustomerClue::where([['uid', '=', $data['uid']]])->update(['updatetime' => date('Y-m-d H:i:s')]);
  120. } else { // 判读是否重复获取
  121. $rs = CustomerClue::where([['uid', '=', $data['uid']], ['employee_id', '=', $data['employee_id']]])->update(['updatetime' => date('Y-m-d H:i:s')]);
  122. // 没有更新过,创建线索
  123. if (!$rs && $data['employee_id'] !== 0) {
  124. CustomerClue::create($data);
  125. }
  126. }
  127. }
  128. /**
  129. * 授权获取用户信息(客户小程序调用)
  130. */
  131. public function setUserInfo($encryptedData, $iv, $signature, $rawData)
  132. {
  133. $request = request();
  134. $token = $request->token;
  135. // 计算签名是否正确
  136. $sign = sha1($rawData . $token['session_key']);
  137. if ($sign != $signature) {
  138. return json(['code' => self::error_debug_msg, 'msg' => '签名验证失败']);
  139. }
  140. $miniprogram = Miniprogram::where([['root_id', '=', $token['root_org']]])->findOrEmpty();
  141. // 解析获取用户数据
  142. $mini = new MiniprogramUser();
  143. $data = $mini->getInfo($miniprogram->appid, $token['session_key'], $encryptedData, $iv);
  144. $saveData = [
  145. 'mini_openid' => $token['openid'],
  146. 'city' => $data['city'],
  147. 'province' => $data['province'],
  148. 'country' => $data['country'],
  149. 'sex' => $data['gender'],
  150. 'nickname' => $data['nickName'],
  151. 'headimgurl' => $data['avatarUrl'],
  152. 'root_id' => $token['root_org']
  153. ];
  154. // 保存用户信息
  155. $logic = new UserLogic();
  156. $info = $logic->saveMiniInfo($saveData);
  157. // 更新token
  158. if (empty($token['uid'])) {
  159. $token['uid'] = $info['id'];
  160. // 添加客户线索
  161. $this->addClue([
  162. 'uid' => $token['uid'],
  163. 'employee_id' => $token['share_employee'] ?? 0,
  164. 'org_id' => $token['share_org'] ?? $token['root_org']
  165. ]);
  166. }
  167. $data = http_build_query($token);
  168. $aes = new Aes(config('app.jwt_key'));
  169. $key = $aes->encrypt($data);
  170. $payload = array(
  171. "iss" => "https://" . $this->request->domain(),
  172. "iat" => time(),
  173. "nbf" => time(),
  174. "data" => $key
  175. );
  176. // 自定义登陆状态
  177. $token = JWT::encode($payload, config('app.jwt_key'));
  178. return json(['code' => self::success, 'msg' => '信息保存成功', 'token' => $token]);
  179. }
  180. /**
  181. * 授权获取并保存用户手机号
  182. */
  183. public function setUserMobile($encryptedData, $iv)
  184. {
  185. $request = request();
  186. $type = $request->token['client_type'];
  187. $miniprogram = Miniprogram::where([['notify', '=', $type]])->findOrEmpty();
  188. if ($miniprogram->isEmpty()) return json(['code' => self::error_msg, 'msg' => '未授权的小程序']);
  189. $mini = new MiniprogramUser();
  190. $data = $mini->getInfo($miniprogram->appid, $request->token['session_key'], $encryptedData, $iv);
  191. $saveData = [
  192. 'mini_openid' => $request->token['openid'],
  193. 'phone' => $data['phoneNumber'],
  194. 'root_id' => $request->token['root_org']
  195. ];
  196. // 保存用户信息
  197. $logic = new UserLogic();
  198. $info = $logic->saveMiniInfo($saveData);
  199. if (empty($info)) return json(['code' => self::error_msg, 'msg' => '未获取到个人信息']);
  200. // // 如果不是员工
  201. // if (!empty($request->token['employee_id'])) {
  202. // // 更新员工的uid
  203. // Employee::where([['phone', '=', $info->phone],['root_id', '=', $request->token['root_org']]])->update(['uid' => $info->id]);
  204. // }
  205. // 线索更新手机号
  206. if (!empty($request->token['share_employee'])) {
  207. CustomerClue::where([
  208. 'uid' => $request->token['uid'],
  209. 'employee_id' => $request->token['share_employee']
  210. ])->update(['phone' => $data['phoneNumber']]);
  211. }
  212. return json(['code' => self::success, 'msg' => '信息保存成功', 'mobile' => $data['phoneNumber']]);
  213. }
  214. /**
  215. * 员工注册
  216. */
  217. public function register()
  218. {
  219. $params = request()->param(['is_manager', 'name', 'orgid']);
  220. $result = EmployeeLogic::addemployee($params, $msg);
  221. if ($result) {
  222. $leader = Employee::where(['org_id'=>$params['orgid'], 'is_manager'=>1])->column('id');
  223. event(new Msg($leader, '您接收到一条新审批,请点击前往审阅', 'register'));
  224. return json(['code' => 0, 'msg' => '成功提交', 'data' => $result]);
  225. } else {
  226. return json(['code' => 1, 'msg' => $msg]);
  227. }
  228. }
  229. /**
  230. * 组织结构
  231. */
  232. public function org()
  233. {
  234. $token = request()->token;
  235. $data = OrgLogic::struc($token['root_org']);
  236. return json(['code' => 0, 'data' => $data]);
  237. }
  238. }