model->where("openid",$request->user['openid'])->field("openid,nickname,avatar,mobile")->findOrEmpty(); if ($data->isEmpty()) return errorTrans("error.data"); if (empty($data['avatar'])) $data['avatar'] = sConf("service.logo"); $data['mobile'] = $data['mobile']?hide_mobile($data['mobile']):'-'; return success("ok",$data->toArray()); } catch (\Throwable $th) { return error($th->getMessage()); } } /** * 完善昵称 * @param Request $request * @return Response */ #[PostMapping("nick")] public function loginNick(Request $request): Response { try { $param = $this->_valid([ "avatar.require" => trans("empty.require"), "nickname.require" => trans("empty.require"), ],$request->method()); if (!is_array($param)) return error($param); $userInfo = [ "nickname" => $param['nickname']?removeEmoji2($param['nickname']):'-', "avatar" => $param['avatar'] ]; $map = ["openid" => $request->user['openid']]; $user = $this->model->where($map)->findOrEmpty(); if ($user->isEmpty()) return error("更新数据失败"); $state = $user->save($userInfo); if (!$state) return error("授权获取失败"); return success("ok"); } catch (\Throwable $th) { return error($th->getMessage()); } } /** * 手机号码 * @param Request $request * @return Response */ #[PostMapping("mobile")] public function loginMobile(Request $request): Response { try { $param = $this->_valid([ "login.require" => '获取登录参数失败', "code.default" => '', "encryptedData.default" => '', "iv.default" => '', ],$request->method()); if (!is_array($param)) return error($param); $sessionKey = (new Crypt)->config($this->getDyConfig())->getSessionKey($param['login']); if (empty($sessionKey)) return error("请重新进入再试"); if (!empty($param['code'])) { $mobileStr = (new Crypt)->config($this->getDyConfig())->token()->getMobile($param['code']); } else { $data = $this->decrypt($param['encryptedData'],$sessionKey['session_key'],$param['iv']); $mobileStr = $data['purePhoneNumber']; } if (empty($mobileStr)) return error("授权信息获取失败!!"); $mobile = $this->decrypt2code(sConf('wechat.min_private_key'), $mobileStr); $map = ["openid" => $sessionKey['openid']]; $user = $this->model->where($map)->findOrEmpty(); if ($user->isEmpty()) { $map["create_ip"] = $request->getRealIp(); $map["mobile"] = $mobile['purePhoneNumber']; $userId = $user->insertGetId($map); } else { $userId = $user['id']; $user->mobile = $mobile['purePhoneNumber']; $user->save(); } $userAuth = get_object_vars(AuthFacade::guard("user")->login(["id" => $userId,'openid' => $sessionKey['openid']])); return success("ok",$userAuth); } catch (\Throwable $th) { return error($th->getMessage()); } } protected function decrypt2code($private_key, $ciphertext_str) { // 解码 base64 密文 $ciphertext = base64_decode($ciphertext_str); // 使用私钥解密 openssl_private_decrypt($ciphertext, $plaintext, $private_key, OPENSSL_PKCS1_PADDING); if ($plaintext === false) { return []; } return json_decode($plaintext,true); } protected function decrypt($encrypted_data, $session_key, $iv) { $data = base64_decode($encrypted_data); $key = base64_decode($session_key); $iv_decoded = base64_decode($iv); // 使用 AES-256-CBC 模式解密 $decrypted = openssl_decrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv_decoded); return json_decode($decrypted,true); } }