总结项目的过程中,这是一个自己探索的点,项目用到了微信授权登录的功能,因为之前没有做过,所以自己也是在网上搜集了很多资料,现在分享给大家。
其实类似于微信授权登录的其他三方登陆,原理是一样的。
现在我们就来看一下这是怎么实现的,其实很简单。
- 首先我们在访问登录页面的时候,就去调用微信官方给我们提供的接口,我们需要提供几个参数,分别是 openid、appid、redirect_uri(重定向链接)
- 下面看返回登录界面的controller代码
- 一开始这一部分是我用到的一些跟业务相关的代码,大家可以略过,主要看返回的openid、appid、wxUrl
- openid我在这里是存到了session里面,我们只需要将open入库即可存取用户信息,因为这个openid是唯一的。
- 还需要注意的就是获取openid的时候,参数code是规定死的,不能改变
//获取openid和access_token的连接
private static String getOpenId = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
//获取用户基本信息的连接
private static String getUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
@Value("${pay.wxpay.appId}")
private String appId;
@Value("${easy.server.path}")
private String rootUrl;
@Value("${pay.wxpay.appSecret}")
private String appSecret;
/**
* 返回登录页面
*/
@RequestMapping("phoneIndex")
public String phoneIndex(Model model, Project project, ProjectType projectType, @RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo, @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize){
project.setStart((pageNo - 1) * pageSize);
project.setPageSize(pageSize);
List<Project> list = projectService.selectAll1(project);
if (project.getTypeId() == null) {
project.setTypeId(0L);
}
if (project.getProjectStatus() == null) {
project.setProjectStatus(-1);
}
List<Project> projectList = projectService.selectByTypeId(project);
List<ProjectType> projectTypeList = projectTypeService.list();
ProjectType projectType1 = null;
if (project.getTypeId() != null && project.getTypeId() > 0) {
projectType1 = projectTypeService.getById(project.getTypeId());
}
String production=project.getProjectProduction();
model.addAttribute("projectModel", project);
model.addAttribute("projectList", projectList);
model.addAttribute("projectTypeList", projectTypeList);
model.addAttribute("typeFlag", project.getTypeId());
model.addAttribute("project", project);
model.addAttribute("projectType", projectType);
model.addAttribute("projectType1", projectType1);
model.addAttribute("pageNo", pageNo);
model.addAttribute("pageSize", pageSize);
model.addAttribute("length", list.size());
model.addAttribute("openId",httpSession.getAttribute(HbuJzConstants.SESSION_OPEN_ID));
model.addAttribute("headImg",httpSession.getAttribute(HbuJzConstants.SESSION_HEAD_IMG));
model.addAttribute("appId",appId);
model.addAttribute("wxUrl",rootUrl+"/getOpentId");
return perfix+"/phone/index_1";
}
/**
* @Description: 获取openId
* @param code 这个参数名称是死的,是微信那边规定好的
* @return: java.lang.String
* @Author: zte
* @Date: 2020/11/19 16:03
*/
@RequestMapping("getOpentId")
public String getOpentId(String code){
String getOpenIdUrl = getOpenId.replace("APPID", appId).replace("APPSECRET", appSecret).replace("CODE", code);
String response = HttpClientUtil.doGet(getOpenIdUrl);
log.info("响应response => {}", response);
JSONObject jsonObject = JSONObject.parseObject(response);
String accessToken = jsonObject.get("access_token") == null ? null :jsonObject.get("access_token").toString();
String openId = jsonObject.get("openid") == null ? null : jsonObject.get("openid").toString();
httpSession.setAttribute(HbuJzConstants.SESSION_OPEN_ID,openId);
httpSession.setAttribute(HbuJzConstants.SESSION_HEAD_IMG,getHeadImg(openId,accessToken));
return "redirect:/phoneIndex";
}
/**
* 根据access_token和openid获取用户头像信息
* @param openId
* @param accessToken
* @return
*/
private String getHeadImg(String openId,String accessToken){
String userInfoUrl = getUserInfo.replace("ACCESS_TOKEN",accessToken).replace("OPENID", openId);
log.info("userInfoUrl => {}", userInfoUrl);
String userInfo = HttpClientUtil.doGet(userInfoUrl);
log.info("userInfo => {}", userInfo);
JSONObject jsonObject = JSONObject.parseObject(userInfo);
return jsonObject.get("headimgurl").toString();
}
- 接下来我们看前端是如何调取的
- 我们可以看到,当获取到的openId为空的时候,这就说明我们还未授权,这个时候就需要去调取微信授权登录的页面,这个是微信官方给我们定义好了的,我们只需要将对应的参数传进去,就可以拉取微信授权的页面(一开始的授权页面)
- 我们只需要保留用户的openid(入库),就能获取用户的信息,很方便
- 到这里我们的微信授权就完成了。