前言
作为一个程序员小白要时刻记录自己近期学习成果。最近也是接了一个项目通过微信公众号获取openid拿取微信账号信息绑定
一、微信公众号是什么?
微信公众平台开发概述 | 微信开放文档https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
二、使用步骤
1.申请微信公众号测试号
微信公众平台进入申请测试号然后获取测试号的appID、appsecret,拿到这些信息就可以开始在springboot项目中的application.yml配置
2.springboot配置微信公众号
3.网页授权
1.第一步:用户同意授权,获取code(具体步骤可查看微信开放文档)
公众号拿取微信授权接口地址然后在application中配置,为方便后面我把整个步骤所需要的微信接口都配置进去
wechat:
appid: wx6f59d6140611d9ee
secret: 84cce012e3ccb3f873412b53dfd1c0b2
#微信授权接口地址
api-auth: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
#获取微信授权的access-token的接口地址
api-auth-access-token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
#获取微信用户信息接口地址
api-userinfo: https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
#微信用户授权成功后回调接口地址
auth-call-back: http://xinyushiaolu.oicp.net/edu-user/weChatApi/authCallBack
然后在controller类中写授权接口然后前端调用接口,注意跳转回调redirect_uri这个参数是你授权回调的地址会页面将跳转至 redirect_uri/?code=CODE&state=STATE。拿取code
/**
* 微信授权
*
* @param response
* @param studentNumber
* @param authSucceedSkipUrl
* @return
* @throws IOException
*/
@GetMapping("/getWeChat")
public String getWeChat(HttpServletResponse response, String studentNumber, String authSucceedSkipUrl) throws IOException {
String uRLEncoderAuthCallBack = URLEncoder.encode(weChatConfig.getAuthCallBack(), "utf-8");
// 用户授权跳转地址
String apiAuthUrl = weChatConfig.getApiAuth()
.replace("APPID", weChatConfig.getAppid())
.replace("REDIRECT_URI", uRLEncoderAuthCallBack)
.replace("SCOPE", "snsapi_userinfo")
.replace("STATE", studentNumber + "," + authSucceedSkipUrl);
response.sendRedirect(apiAuthUrl);
log.info("用户授权跳转地址apiAuthUrl = {}", apiAuthUrl);
return "redirect:" + apiAuthUrl;
}
weChatConfig类是为了引入刚才在application配置的微信appid等接口方便调用
第二步:通过code换取网页授权access_token
前端在需要的地方调用一下该接口进行授权,我们为此做一个回调接口让授权直接跳该网址获取code,然后通过code换取access_token和openid
则此时开发者可以通过access_token和openid拉取用户信息了然后保存到数据库,该接口一次把这几步做到位了
/**
* 微信授权回调接口
*
* @param code
* @param state
* @return
* @throws IOException
*/
@GetMapping("/authCallBack")
public Object authCallBack(String code, String state) throws IOException {
if (StringUtils.isEmpty(code)) {
return Result.error(CommonExceptionEnum.PARAMETER_VERIFY_ERROR);
}
log.info("微信授权回调, code = {} ,state = {}", code, state);
//获取微信授权access_token
String apiAuthAccessTokenUrl = weChatConfig.getApiAuthAccessToken()
.replace("APPID", weChatConfig.getAppid())
.replace("SECRET", weChatConfig.getSecret())
.replace("CODE", code);
String result = HttpUtil.get(apiAuthAccessTokenUrl);
log.info("微信授权access_token返回参数:{}", result);
HashMap<String, String> wechatAuthTokenMap = JSON.parseObject(result, HashMap.class);
String accessToken = wechatAuthTokenMap.get("access_token");
String openid = wechatAuthTokenMap.get("openid");
//如果微信的返回access_token为空
if (StringUtils.isBlank(accessToken)) {
return Result.error(CommonExceptionEnum.WECHAT_LOGIN_ERROR);
}
//调用微信通过OPENID和ACCESS_TOKEN获取用户信息接口
String apiUserinfoUrl = weChatConfig.getApiUserinfo()
.replace("ACCESS_TOKEN", accessToken)
.replace("OPENID", openid);
//获取微信用户信息
String resultUserinfo = HttpUtil.get(apiUserinfoUrl);
log.info("微信用户信息:{}", resultUserinfo);
WechatUserInfoDTO wechatUserInfoDTO = JSON.parseObject(resultUserinfo, WechatUserInfoDTO.class);
//更新数据
String[] stateArr = state.split(",");
if (stateArr.length != 2) {
return Result.error(CommonExceptionEnum.WECHAT_LOGIN_ERROR);
}
UpdateWrapper<User> uw = new UpdateWrapper<>();
uw.eq("student_number", stateArr[0]);
log.info("getStuNumber=" + stateArr[0]);
uw.set("openid", wechatUserInfoDTO.getOpenid())
.set("bind", 1)
.set("wechat_avatar", wechatUserInfoDTO.getHeadimgurl())
.set("nick_name" ,wechatUserInfoDTO.getNickname());
boolean updateStatus = userBindService.update(uw);
if(!updateStatus){
return Result.error(CommonExceptionEnum.STUDENT_NO_EXIST_ERROR);
}
log.info("用户授权登录成功跳转地址:{}",stateArr[1]);
return "redirect:"+stateArr[1];
}
总结
该文章只是我对自己这段时间的学习的一个总结和记录,当然有不好的地方请指正!同时希望自己能够坚持向自己目标前进,让自己水平不断提高