微信小程序 登录

 

登录流程图:

 

 

 

 

整理思路:   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;
    }

 

 

posted @ 2020-11-12 11:33  满眼都是她  阅读(270)  评论(0编辑  收藏  举报