官方解释:https://developers.weixin.qq.com/community/develop/article/doc/000c80906b4210625f3bde3775bc13

我们看看不使用云开发的情况:

第一步、调用wx.login获取code,再携带code像后台发起请求

(1)、首先需要在微信小程序调用登录开放接口 wx.login() 获取用户登陆凭证code。

onLaunch() {
    // 登录
    wx.login({
      success: res => {
        console.info(res);
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
  },

res的结果如下:

 

注意:这里的success虽然是接口调用成功的回调函数,但是它只是参数。

success回调函数也有参数res,res的属性为code

(2)、向自己的服务器发送请求,并将code一起发送过去。

在App.js的onLaunch生命周期函数中调用wx.login接口

onLaunch() {
      //隐藏系统tabbar
      this.hideTabBar();
      //获取设备信息
      this.getSystemInfo();
  
      // 登录
      const requestUrl = this.globalData.apiBaseUrl + '/api/login/code2session';
      wx.login({
        success: res => {
          // 发送 res.code 到后台换取 openId, sessionKey, unionId
          console.info(res)
          wx.request({
            url: requestUrl,
            method:"POST",
            data:{
              "code":res.code
            },
            header:{
              "Content-Type":"application/json"
            },
            success(res){
              console.log(res)
            }
          })
        }
      })
  },

res结果如下:

从wx.login(Object object)官方的API文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html 可知,

调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等。

接口的参数:object

在App.js的onLaunch生命周期函数中调用wx.login接口

onLaunch: function () {// 登录
    wx.login({
        success: res => {
            // 发送 res.code 到后台换取 openId 验证平台账号是否登录绑定过
            var that = this;
            wx.request({
                method: 'GET',
                url: this.globalData.serverApi + "/mobileApi/user/checkBind?code="+res.code,
                header: {
                    'content-type': 'application/json'
                },
                success (res) {
                    if(res.data.code == 301){
                        //未登录
                        var openId = res.data.openId;
                        wx.reLaunch({
                          url: '/pages/login/login?openId='+openId
                        })
                    }else if(res.data.code == 1){
                        //已登录
                        that.globalData.userInfo = res.data.userInfo;
                        that.globalData.token = res.data.token;
                    }else if(res.data.code == 0){
                        //获取openId失败
                        wx.showToast({
                          title: res.data.msg,
                          icon: 'none',
                          duration: 2000
                        })
                    }

                    // 由于 checkBind 是网络请求,可能会在 Page.onLoad 之后才返回
                    // 所以此处加入 callback 以防止这种情况
                    if (that.checkBindCallback) {
                      that.checkBindCallback(res)
                    }
                }
            })
      }
    })
  },

二、在自己的后台服务端调用auth.code2Session接口

官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。

请求地址:

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

后台代码

/**
     * 根据code获取openId去检查是否绑定平台用户
     * @param code
     * @return JSONObject
     */
    @GetMapping("/checkBind")
    public JSONObject checkBind(@RequestParam String code){
        JSONObject object = new JSONObject();
        String getOpenIdUrl = getOpenIdURL.replace("APPID",appId).replace("SECRET",appSecret).replace("JSCODE",code);
        try {
            //获取openId信息
            String resultStr = httpUtil.doGet(getOpenIdUrl,null,null);
            JSONObject resultObj = JSON.parseObject(resultStr);
            if(StringUtils.isNotEmpty(resultObj.getString("openid"))){
                //根据openId判断是否和平台用户绑定
                String openId = resultObj.getString("openid");
                Result result = appletUserService.appletUserQuery(openId);
                if(result.isSuccess()){
                    //已绑定
                    AppletUser appletUser = (AppletUser)result.getData();
                    String token = appletUser.getToken();
                    //获取用户信息
                    User userInfo = (User)redisUtilService.get(pre + "TOKEN" + token);
                    //根据登录token获取后台的权限菜单
            ...
                    object.put("token",token);
                    object.put("userInfo",userInfo);
                    object.put("code",ResultCode.SUCCESS);
                    object.put("msg","已经登录");
                }else{
                    //未绑定
                    object.put("openId",openId);
                    object.put("code",ResultCode.NO_LOGIN);
                    object.put("msg","未登录");
                }
            }else{
                object.put("code",ResultCode.FAILURE);
                object.put("msg",resultObj.getString("errmsg"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }

其中getOpenIdURL为:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

 

posted on 2021-12-02 10:37  周文豪  阅读(9164)  评论(0编辑  收藏  举报