后台使用Spring boot
,部分功能须要在小程序上实现。html
咱们的后台是有权限验证的,因此须要用户登陆才能调用后端的API。因此,小程序端就须要登陆后端。json
本文实现了微信小程序的登陆来完成本身服务器后端的登陆功能。小程序
首先,咱们须要登陆小程序,用微信对其受权,而后带着受权的状态进行后端的登陆。咱们来看一下微信官方提供给咱们的时序图:后端
咱们看到,最开始会调用wx.login
以获取code
,而后携带获取的code
,去请求后咱们的后端的。微信小程序
而后,咱们须要在后端
,使用获取的code
和小程序的appId
以及secret
,共同请求微信接口,实现受权,而后微信会返回给咱们openId
和session_key
。api
接着,咱们须要将openId
和session_key
进行保存,就和咱们原来后端的登陆作法同样,对登陆的用户进行session存储,而后再登陆的时候,去session中请求,看是否存在用户信息,以达到验证登陆的目的。服务器
这以后,咱们就能够带着登陆的状态去请求后端的API了。微信
大体的原理知道了,咱们就去实现一下登陆的过程。session
首先咱们要知道一点,若是要验证你是哪一个用户,就须要微信进行受权。微信给咱们提供了比较方便的解决办法。app
button
中有这么一个属性:open-type
,经过他咱们能够直接去获取用户的微信信息。
<button open-type='getUserInfo' bindgetuserinfo='doLogin'>登陆</button>
将open-type
设置为getUserInfo
,而后再使用bindgetuserinfo
去触发登陆的方法,这个函数会返回用户的信息。
而后,就是调用wx.login()
来获取code
。
wx.login({ success: function(res) { console.log(res) } })
当微信端登陆成功的时候,咱们就会获取到相应的code
,这是用户的临时登陆凭证,每次登陆都会不一样,过一段时间也会失效:
接着带着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....