求大家一波关注。。。
我们可以在微信官方文档中,找到小程序登录的时序图。如下图所示:
注意事项:
小程序端登陆代码
// index.js
// 获取应用实例
const app = getApp()
var httpUtils = require('../../utils/http.js')
Page({
data: {
},
onLoad: function (param) {
},
//登录
doLogin: function (e) {
//API接口
wx.getUserProfile({
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
console.log(res.userInfo);
wx.switchTab({
url: '../indexsy/indexsy',
})
}
}),
wx.login({
success: (res) => {
//获取登录的临时凭证
var code = res.code;
console.log("小程序的code"+code);
//调用后端,获取微信的session_key和secret
if (res.code) {
//发起网络请求,用于注册或获取用户信息
wx.showToast({
title: '成功登录小程序',
duration: 10000
});
console.log(55);
httpUtils.postReq('user/getUserByCode', {
code: res.code
}, function (res) {
console.log("登录成功");
wx.setStorage({
key: "token",
data: token,
success: function (res) {
typeof cb == "function" && cb(true)
},
fail: function (res) {
typeof cb == "function" && cb(false)
}
})
})
} else {
return
}
}
})
}
})
//http.js
function postReq(url, data, cb, showNoCommonModal, showLoading = true) {
if (showLoading) {
wx.showLoading({
title: '加载中...',
})
}
data['page'] = 1;
data['limit'] = 10000;
header.token = uriUtils.getToken();
wx.request({
url:'http://127.0.0.1:8080/mycode_war_exploded/' + url,
header: header,
data: data,
method: 'post',
success: function (res) {
if (res.data.code != uriUtils.CODE_SUCCESS &&
res.data.code != uriUtils.CODE_SUCCESS_0 &&
res.data.code != uriUtils.CODE_NEED_AUTH_USERINFO) {
if (!showNoCommonModal) {
showErrModal(res.data.msg, '提示');
}
// cb是不是函数类型同时将一个参数传入名为cb的函数下
return typeof cb == "function" && cb(false, res.data.msg)
}
return typeof cb == "function" && cb(res.data)
},
fail: function () {
if (!showNoCommonModal) {
showErrModal();
}
return typeof cb == "function" && cb(false)
},
complete: function () {
wx.hideLoading({
fail(){}
});
wx.stopPullDownRefresh();
}
})
}
后端的相关代码:
controller层代码
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUserByCode")
@ResponseBody
public ReturnData getUserByCode(String code){
return userService.selectUserByCode(code);
}
}
service层代码
//service层相关代码
public ReturnData selectUserByCode(String code) {
//根据code去微信查询openid
ReturnData returnData = WxLoginUtils.jsCode2Session(code);
if(returnData.getCode()!=ReturnData.KEY_CODE_SUCCESS){
return returnData;
}
User newUser = (User) returnData.getData();
//查询用户是否已经注册,如果没有注册进行注册操作
User dbUser = userMapper.selectUserByOpenid(newUser.getOpenid());
if(dbUser==null){ //没注册呢
newUser.setHaveGetUserInfo(User.NOT_GET_USERINFO);
int count = userMapper.insertUser(newUser);
if(count<=0){
return ReturnData.fail("登录失败,请重试");
}
Long userId = userMapper.selectUserByOpenid(newUser.getOpenid()).getId();
Map<String,Object> map = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID,userId);
String token = JwtUtil.creatToken(map);
return ReturnData.notGetUserInfo(token);
}else if(User.NOT_GET_USERINFO.equals(dbUser.getHaveGetUserInfo())){ //已经注册过但是尚未完善用户信息
Long userId = dbUser.getId();
Map<String,Object> map = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID,userId);
String token = JwtUtil.creatToken(map);
return ReturnData.notGetUserInfo(token);
}else { //已经注册并已经完善了用户信息
Long userId = dbUser.getId();
Map<String,Object> map = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID,userId);
String token = JwtUtil.creatToken(map);
return (ReturnData) ReturnData.success().put(ReturnData.KEY_DATA,token);
}
}
相关类的配置
/** * 微信登录相关的工具类 */ public class WxLoginUtils { //向微信服务器去请求,根据前台小程序传来的code获取openid public static ReturnData jsCode2Session(String loginCode){ if(TextUtils.isEmpty(loginCode)){ return ReturnData.fail("参数有误"); } //请求微信服务器的参数 //appid小程序唯一标识,secret小程序的app secret,js_code登录时获取的code,grant_type填写为authorization_code String params="appid="+ SettingUtils.WX_APPID +"&secret="+ SettingUtils.WX_APPSECRET +"&js_code="+loginCode +"&grant_type="+SettingUtils.GRANT_TYPE_AUTHORIZATION_CODE; //发送请求 String result=HttpRequest.sendGet(UriUtils.GET_SESSION_BY_CODE,params); //对数据进行解析 JSONObject jsonObject =JSON.parseObject(result); if(jsonObject==null){ return ReturnData.fail("微信api调用失败,请重试"); } Integer errcode=(Integer) jsonObject .get("errcode"); String errmsg=(String)jsonObject.get("errmsg"); if(errcode!=null && errcode!=ConstantUtils.ERR_CODE_SUCCESS ){ return ReturnData .fail(errmsg); } String openid=(String)jsonObject .get("openid") ; User user=new User(); user.setOpenid(openid ) ; return ReturnData .success(user ) ; } }