request->param('code'); if (!$code) { $this->error(__('Invalid parameters')); } $config = config('wxMiniProgram'); $getopenid = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$config['appid'].'&secret='.$config['secret'].'&js_code='.$code.'&grant_type=authorization_code'; $openidInfo = $this->getJson($getopenid); if(!isset($openidInfo['openid'])) { $this->error('用户openid获取失败',$openidInfo); } // 获取的结果存入数据库 $find = Db::name('user_sessionkey')->where(['openid'=>$openidInfo['openid']])->find(); if($find) { $update = []; $update['openid'] = $openidInfo['openid']; $update['sessionkey'] = $openidInfo['session_key']; $update['createtime'] = time(); $res = Db::name('user_sessionkey')->where(['openid'=>$openidInfo['openid']])->update($update); } else { $insert = []; $insert['openid'] = $openidInfo['openid']; $insert['sessionkey'] = $openidInfo['session_key']; $insert['createtime'] = time(); $res = Db::name('user_sessionkey')->insertGetId($insert); } if($res !== false) { $this->success('获取成功',$openidInfo); } else { $this->error('获取失败'); } } /** * json 请求 * @param $url * @return mixed */ private function getJson($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); return json_decode($output, true); } /** * 手机验证码登录 * * @ApiMethod (POST) * @param string $mobile 手机号 * @param string $captcha 验证码 */ public function mobilelogin() { $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); $openid = $this->request->post('openid'); if (!$mobile || !$captcha || !$openid) { $this->error(__('Invalid parameters')); } if (!Validate::regex($mobile, "^1\d{10}$")) { $this->error(__('Mobile is incorrect')); } if (!Sms::check($mobile, $captcha, 'mobilelogin')) { $this->error(__('Captcha is incorrect')); } // 获取openid和sessionkey $openidInfo = Db::name('user_sessionkey')->where(['openid'=>$openid])->find(); if(!$openidInfo){ $this->error('openid获取失败'); } // $check_user = Db::name('user')->where('mini_openid',$openidInfo['openid'])->where('mobile','neq',$mobile)->find(); if($check_user){ $this->error('该微信已经绑定手机号'.$check_user['mobile'].',请使用该手机号登录'); } $user = \app\common\model\User::getByMobile($mobile); if ($user) { if ($user->status != 1) { $this->error(__('Account is locked')); } //修改最新的sessionkey和openid。其他渠道注册,本渠道第一次来就赋值 $user->mini_openid = $openid; $user->save(); //如果已经有账号则直接登录 $ret = $this->auth->direct($user->id); } else { // 用户信息不存在时使用 $extend = [ 'mini_openid' => $openid, ]; $ret = $this->auth->register('', '', '', $mobile, $extend); } if ($ret) { Sms::flush($mobile, 'mobilelogin'); $this->success(__('Logged in successful'), $this->auth->getUserinfo()); } else { $this->error($this->auth->getError()); } } /** * 微信小程序授权登录 */ public function wxMiniProgramLogin() { $openid = $this->request->request('openid');// openid值 if (!$openid) { $this->error(__('Invalid parameters')); } // 用户登录逻辑 === 开始 $user_sessionkey = Db::name('user_sessionkey')->where('openid',$openid)->find(); if(empty($user_sessionkey)){ $this->error('登录失败,请先使用手机号注册','',-1); } $userInfo = Db::name('user')->where(['mini_openid'=>$user_sessionkey['openid']])->find(); // 判断用户是否已经存在 if($userInfo) { // 登录 if ($userInfo['status'] != 1) { $this->error(__('Account is locked')); } $res = $this->auth->direct($userInfo['id']); } else { //这里不在给注册,而是只能mobilelogin来注册 $this->error('登录失败,请先使用手机号注册','',-1); } if($res) { $userInfo = $this->auth->getUserinfo(); if(empty($userInfo['mobile'])){ $this->success("登录成功!",$userInfo,-1); } $this->success("登录成功!",$userInfo); } else { $this->error($this->auth->getError()); } } /** * 退出登录 * @ApiMethod (POST) */ public function logout() { if (!$this->request->isPost()) { $this->error(__('Invalid parameters')); } $this->auth->logout(); $this->success(__('Logout successful')); } //用户详细资料 public function getuserinfo(){ $info = $this->auth->getUserinfo(); $this->success(__('success'),$info); } /** * 修改会员个人信息 * * @ApiMethod (POST) * @param string $avatar 头像地址 * @param string $username 用户名 * @param string $nickname 昵称 * @param string $bio 个人简介 */ public function profile() { $field_array = ['avatar','nickname','contactname','address']; $data = []; foreach($field_array as $key => $field){ //前端传不了post,改了 /*if(!request()->has($field,'post')){ continue; }*/ if(!input('?'.$field)){ continue; } $newone = input($field); if($field == 'avatar'){ $newone = input('avatar', '', 'trim,strip_tags,htmlspecialchars'); } $data[$field] = $newone; } if(empty($data)){ $this->success(); } $update_rs = Db::name('user')->where('id',$this->auth->id)->update($data); if($update_rs === false){ $this->error('修改资料失败'); } $this->success(); } /** * 修改手机号 * * @ApiMethod (POST) * @param string $mobile 手机号 * @param string $captcha 验证码 */ public function changemobile() { $user = $this->auth->getUser(); $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); if (!$mobile || !$captcha) { $this->error(__('Invalid parameters')); } if (!Validate::regex($mobile, "^1\d{10}$")) { $this->error(__('Mobile is incorrect')); } if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) { $this->error(__('Mobile already exists')); } $result = Sms::check($mobile, $captcha, 'changemobile'); if (!$result) { $this->error(__('Captcha is incorrect')); } $user->mobile = $mobile; $user->save(); Sms::flush($mobile, 'changemobile'); $this->success(); } }