官方解释:https://developers.weixin.qq.com/community/develop/article/doc/000c80906b4210625f3bde3775bc13
我们看看不使用云开发的情况:
第一步、调用wx.login获取code,再携带code像后台发起请求
首先需要在微信小程序调用登录开放接口 wx.login() 获取用户登陆凭证code。然后,向自己的服务器发送请求,并将code一起发送过去。
从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
注意:这里的success虽然是接口调用成功的回调函数,但是它只是参数。
success回调函数也有参数res,res的属性为code
在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