微信小程序 登录
登录流程图:
整理思路: 1. 通过passport,账号密码登录获取token passport配置
2. 利用token拿到oppenid => AppID、AppSecret 、code 前两者是微信小程序开发者获取、code是小程序发送到服务器
小程序发起请求获取token并缓存到小程序:
apilogin() { // api接口登录 if (!cache.has('token')) { http.httpReq({ url: '请求的链接', method: 'POST', data: { '账号密码' } }).then(ret => { // 把token写入到缓存中 cache.set('token', ret.data.token); }) } }
获取token的后台:
public function login(Request $request) { // 表单验证 // 异步捕获 ajax 和 接口会用 try { // 验证不通过跳转到 首页 需要自定义异常走向,错误信息要让自己来确定 $this->validate($request, [ 'username' => 'required', 'password' => 'required' ]); } catch (\Exception $exception) { return response()->json(['status' => 1000, 'msg' => '账号或密码不能为空'], 400); } // 查看对象中可用的方法 //dump(get_class_methods()); $bool = auth()->guard('apiweb')->attempt($request->all()); // 账号登录成功 if ($bool) { // 生成token // 得到用户模型对象 $userModel = auth()->guard('apiweb')->user(); // 判断接口当天是否超过2000次 if ($userModel->click > env('APINUM')) { return response()->json(['status' => 1002, 'msg' => '当天请求次数超上限'], 500); } // 生成token 保存在服务器端1份,给客户返回1份 $token = $userModel->createToken('api')->accessToken; // 让当请求次数加 1 数据一致 $userModel->increment('click'); //set click=click+1 $data = [ 'expire' => 7200, 'token' => $token ]; return response()->json($data); } else { return response()->json(['status' => 1001, 'msg' => '账号或密码不正确'], 401); } }
获取到token值后获取oppenid
小程序发送请求:
// 小程序登录 wxlogin(token) { wx.login({ timeout: 2000, success: ({ code }) => { // 发起网络请求 http.httpReq({ url: 'http://www.zfw.com/api/v1/wxlogin', method: 'POST', data: { code }, token }).then(ret => { cache.forever('openid', ret.data.openid); }) } }); }
后台通过小程序传来的code 、和己有的微信小程序AppID、AppSecret 生成oppenid:
public function wxlogin(Request $request) { // 此2个值是小程序后台提供 $appid = '自己微信小程序的appid'; $secret = '自己微信小程序的secret'; // 小程序传过来的 $code = $request->get('code'); // 请求地址 $url = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code'; $url = sprintf($url, $appid, $secret, $code); // 申请请求客户端 verify 不检查证书ssl $client = new Client(['timeout' => 5, 'verify' => false]); $response = $client->get($url); $json = (string)$response->getBody(); // return $json;die // json转为数组 $arr = json_decode($json, true); // 写入到数据表中 try { Renting::create(['openid' => $arr['openid']]); } catch (\Exception $exception) { } return $json; }