首先还是一样的问题,拿到问题不要直接盲目写,先阅读官方文档
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
tip:先把流程捋清楚,其实什么都不是问题
一、service业务逻辑层
appId、appSecret都是商家唯一有的,可自行前往商户平台获取
我把这两个值存储在配置类中方便获取
/**
* 微信小程序登录
* @param code
* @return
*/
public AjaxResult wxlogin(String code) {
//请求微信登录的地址
String url = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";
String replaceUrl = url.replace("{0}", appId).replace("{1}", appSecret).replace("{2}", code); //替换为需要的值
JSONObject jsonObject = JSONObject.parseObject(HttpUtils.sendGet(replaceUrl)); //转为json格式接收
//请求成功后 获取数据
String openid = jsonObject.getString("openid");
String nickname = jsonObject.getString("nickname");
String session_key = jsonObject.getString("session_key");
redisTemplate.opsForValue().set("openid", openid);
if (openid == null) {
return AjaxResult.error("登录失败");
}
//查询用户是否存在,用来判断是否为第一次登录,记住openId是每个用户的标识
WechatUser wxUser = wechatUserMapper.selectWxUserByOpenId(openid);
// 不存在的话则是创建一个新用户存放数据
WechatUser user = new WechatUser();
if (wxUser == null) {
user.setOpenId(openid);
// 插入操作 username根据自己要求存储
user.setUsername(generateRandomUsername(prefix));
if (nickname != null) {
user.setNickName(nickname);
}
user.setNickName(generateRandomUsername(prefix));
if (unionId != null) {
user.setUnionId(unionId);
}
user.setCreateTime(DateUtils.getNowDate());
user.setLoginTime(DateUtils.getCurrentTimestamp());
user.setTime(1);
wechatUserMapper.insertWechatUser(user);
} else {
//更新
user = wxUser;
user.setUpdateTime(DateUtils.getNowDate());
user.setLoginTime(DateUtils.getCurrentTimestamp());
user.setTime(user.getTime() + 1);
wechatUserMapper.updateWechatUser(user);
}
// 组装token信息 当前登录用户的信息
LoginUser loginUser = new LoginUser();
loginUser.setWxuser(user);
loginUser.setOpenId(openid);
loginUser.setSessionKey(session_key);
String token = tokenService.createToken(loginUser);
AjaxResult ajax = AjaxResult.success();
ajax.put("token", token);
ajax.put("userInfo", user);
return ajax;
/**
* 获取手机号
* @param code
* @return
*/
public AjaxResult getPhoneNumber(String code) {
String openid = tokenService.getOpenidFromToken(tokenService.getToken(request));
AjaxResult accessToken1 = getAccessToken();
String accessToken = (String) accessToken1.get("access_token");
String phoneUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
Map<String, Object> map = new LinkedHashMap<>();
map.put("code", code);
map.put("openid", openid);
String res = HttpUtils.sendPost(phoneUrl, JSONObject.toJSONString(map));
JSONObject jsonObject = JSONObject.parseObject(res);
Integer errcode = jsonObject.getInteger("errcode");
if (errcode == 0) {
JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
String phoneNumber = phoneInfo.getString("phoneNumber");
AjaxResult ajax = AjaxResult.success();
ajax.put("phoneNumber", phoneNumber);
// 放在数据库里面
WechatUser wechatUser = wechatUserMapper.selectWxUserByOpenId(openid);
if (wechatUser != null) {
wechatUser.setPhoneNumber(phoneNumber);
wechatUserMapper.updateWechatUser(wechatUser);
}
return ajax;
} else {
redisTemplate.delete("accessToken");
getAccessToken();
return AjaxResult.error("微信错误" + jsonObject.getString("errmsg"));
}
/**
* getAcessToken方法 经常会使用 则被我封装了
* @param code
* @return
*/
public AjaxResult getAccessToken() {
String accToken = redisTemplate.opsForValue().get("accessToken");
if (StringUtils.isBlank(accToken)) {
String url = "https://api.weixin.qq.com/cgi-bin/token?appid={0}&secret={1}&grant_type=client_credential";
String replaceUrl = url.replace("{0}", appId).replace("{1}", appSecret);
JSONObject jsonObject = JSONObject.parseObject(HttpUtils.sendGet(replaceUrl));
Integer errcode = jsonObject.getInteger("errcode");
if (ObjectUtils.isEmpty(errcode)) {
String accessToken = jsonObject.getString("access_token");
redisTemplate.opsForValue().set("accessToken", accessToken, 7000, TimeUnit.SECONDS);
AjaxResult ajax = AjaxResult.success();
ajax.put("access_token", accessToken);
return ajax;
} else {
return AjaxResult.error("微信错误" + jsonObject.getString("errmsg"));
}
} else {
AjaxResult ajax = AjaxResult.success();
ajax.put("access_token", accToken);
return ajax;
}
}
}
二、controller层
@ApiOperation("小程序登录接口")
@PostMapping("/wxlogin")
public AjaxResult wxLogin(@RequestBody String code) {
return AjaxResult.success(wechatLoginService.wxlogin(code));
}
@ApiOperation("获取用户手机号")
@PostMapping("/getPhoneNumber")
public AjaxResult getPhoneNumber(@RequestBody String code) {
return AjaxResult.success(wechatLoginService.getPhoneNumber(code));
}```