微信小程序登陆

概况描述

后台使用Spring boot,部分功能须要在小程序上实现。html

咱们的后台是有权限验证的,因此须要用户登陆才能调用后端的API。因此,小程序端就须要登陆后端。json

本文实现了微信小程序的登陆来完成本身服务器后端的登陆功能。小程序

实现原理

首先,咱们须要登陆小程序,用微信对其受权,而后带着受权的状态进行后端的登陆。咱们来看一下微信官方提供给咱们的时序图:后端

clipboard.png

咱们看到,最开始会调用wx.login以获取code,而后携带获取的code,去请求后咱们的后端的。微信小程序

clipboard.png

而后,咱们须要在后端,使用获取的code和小程序的appId以及secret,共同请求微信接口,实现受权,而后微信会返回给咱们openIdsession_keyapi

clipboard.png

接着,咱们须要将openIdsession_key进行保存,就和咱们原来后端的登陆作法同样,对登陆的用户进行session存储,而后再登陆的时候,去session中请求,看是否存在用户信息,以达到验证登陆的目的。服务器

clipboard.png

这以后,咱们就能够带着登陆的状态去请求后端的API了。微信

大体的原理知道了,咱们就去实现一下登陆的过程。session

实现

小程序端

首先咱们要知道一点,若是要验证你是哪一个用户,就须要微信进行受权。微信给咱们提供了比较方便的解决办法。app

clipboard.png

button中有这么一个属性:open-type,经过他咱们能够直接去获取用户的微信信息。

<button open-type='getUserInfo' bindgetuserinfo='doLogin'>登陆</button>

open-type设置为getUserInfo,而后再使用bindgetuserinfo去触发登陆的方法,这个函数会返回用户的信息。

clipboard.png

而后,就是调用wx.login()来获取code

wx.login({
      success: function(res) {
        console.log(res)
      }
    })

当微信端登陆成功的时候,咱们就会获取到相应的code,这是用户的临时登陆凭证,每次登陆都会不一样,过一段时间也会失效:

clipboard.png

接着带着code去请求咱们的后端:

wx.login({
      success: function(res) {
        console.log(res)
        
        // 获取登陆的临时凭证
        var code = res.code;

        // 调用后台,获取session_key,openid
        wx.request({
          url: 'http://localhost:8080/user/wxLogin?code=' + code,
          method: 'POST',  
        })
      }
    })

好了,如今咱们须要一个支撑微信小程序登陆的后台了。

后端

控制器:

/**
     * 微信登陆
     * @param code  登陆临时凭证code
     */
    @PostMapping("/wxLogin")
    public voidwxLogin(String code) {
        userService.wxLogin(code);
    }

service:

public void wxLogin(String code) {
        String url = "https://api.weixin.qq.com/sns/jscode2session?" +
                "appid=APPID&" +
                "secret=SERECT&" +
                "js_code=" + code + "&" +
                "grant_type=authorization_code";

        logger.debug("请求微信api,进行登陆受权,获取session_key和openid");
        String jsonString = restTemplate.getForObject(url, String.class);
        JSONObject jsonObject = JSONObject.parseObject(jsonString);

        logger.debug("获取openid,进行存储");
        String openid = jsonObject.get("openid").toString();
        httpSession.setAttribute("openid", openid);
    }

由于这里,对于同一个用户而言,openid是相同的,因此,当下次再来请求的时候,咱们只须要获取它,就能判断是否登陆了。

后面,对于其余请求的处理,还须要涉及到拦截器,可是原理和以前同样,这里就不作赘述。


官方参考:
https://developers.weixin.qq....
https://developers.weixin.qq....
https://developers.weixin.qq....
https://developers.weixin.qq....
https://developers.weixin.qq....

相关文章
相关标签/搜索