目录
前言
对于微信的授权的登录流程和实现方式官网文档已说的很清楚了并且是一直迭代的(比如之前能拿到用户的详细信息,现在拿不到了,之前授权方式和现在授权方式不同了),本文档只是做个Java后端实现小程序用户授权的一个流程引导,应当已官方文档为基准。
官网文档:开放能力 / 用户信息 / 小程序登录 (qq.com)
代码实现
1.获取用户openId
//获取用户openid请求地址
private static String LOGIN_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=#{APPID}&secret=#{SECRET}&js_code=#{JSCODE}&grant_type=authorization_code";
//小程序 appId
private static String miniProgramAppId="小程序 appId";
//小程序 appSecret
private static String miniProgramSecret="小程序 appSecret";
//根据code获取用户openid
public Map getOpenIdByCode(String code) {
String url = LOGIN_URL.replace("#{APPID}", miniProgramAppId)
.replace("#{SECRET}", miniProgramSecret)
.replace("#{JSCODE}", code);
log.info("获取openid,url:{}", url);
try {
ResponseEntity<String> res = restTemplate.getForEntity(url, String.class);
String body = res.getBody();
if (com.ruoyi.common.utils.StringUtils.isEmpty(body)) {
throw new Exception("获取openid出错");
}
JSONObject object = JSONObject.parseObject(body);
if (object != null && "0".equals(object.getString("errcode"))) {
String openId = object.getString("openid");
String sessionKey= object.getString("session_key");
Map map = new HashMap();
map.put("openId", openId);
map.put("sessionKey", sessionKey);
return map;
}
} catch (Exception e) {
log.error("获取openid报错", e);
return null;
}
}
2.获取用户手机号
(2.1)获取access_token
/**
* 获取接口调用凭证 access_token
*/
private static final String ACCESSTOKEN_GET = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";
//小程序 appId
private static String miniProgramAppId="小程序 appId";
//小程序 appSecret
private static String miniProgramSecret="小程序 appSecret";
/**
* 获取小程序授权accessToken
*
* @return
*/
public String getAccessToken() {
String wx_access_token = null;
/* 这个是redis缓存的:没有的话去掉*/
wx_access_token = (String) redisTemplate.opsForValue().get("wx_access_token");
if (wx_access_token != null) {
return wx_access_token;
}
String url = ACCESSTOKEN_GET + "appid=" + miniProgramAppId + "&secret=" + miniProgramSecret;
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
try {
JSONObject jsonObject = JSON.parseObject(response);
/* 存储在redis中*/
if (jsonObject.containsKey("access_token")) {
redisTemplate.opsForValue().set("wx_access_token", jsonObject.get("access_token"),
7000, TimeUnit.SECONDS);
wx_access_token = jsonObject.getString("access_token");
}
} catch (Exception e) {
e.getMessage();
}
return wx_access_token;
}
(2.2)获取用户手机号信息
//获取用户手机号
private static final String get_user_phone = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
/**
* 根据手机号授权code获取手机号信息
*
* @param code
* @return
*/
public String getUserWxPhone(String code) {
String url = get_user_phone + getAccessToken();
Map map = new HashMap();
map.put("code", code);
String userWxPhone = HttpUtils.sendPost(url, JSON.toJSONString(map));
Map phonemap = (Map) JSON.parse(userWxPhone);
if (phonemap.containsKey("phone_info")) {
Map phoneinfo = (Map) JSON.parse(phonemap.get("phone_info").toString());
Object purePhoneNumber = phoneinfo.get("purePhoneNumber");
return purePhoneNumber + "";
}
return null;
}
关于头像和昵称是有前端通过按钮触发授权获取
后端出个上传文件接口返回网络路径
小结
该文章只做个适用于现版本(2024-8)简单的流程引导,分为三个步骤(方法)获取openid,获取access_token,获取用户手机号,具体之后是否变更授权方式以官网文档为准。
附:出现错误先排查代码再审查文档,严格按照官方文档来一遍可能问题就解决了。