查看微信公众号开发文档
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
5 第五步:检验授权凭证(access_token)是否有效
简单的微信登录授权获取openId存入数据库
1、扫码二维码,二维码的文本内容是vue中的页面方法的url地址。
return{
id: this.$route.query.id //获取url地址上的拼接的id
}
2、先调用用户授权获取code,调用之后微信接口会回调传入的回调url地址,通过获取url地址中的code和需要的参数值,调用controller方法。
methods: {
getCode() { // 非静默授权,第一次有弹框
this.code = '';
var local = window.location.href; // 获取页面url
const appid = 'wx123456789123456789';//微信公号的开发者ID
const secret = '123456789abcdefghjklmn';//微信公众号的开发者密码
const url = "http://域名/方法名";//回调方法的url地址
//回调回来的的url地址后面会拼接上code和你传入的一直参数值
const UrlEncode = encodeURIComponent(url);//js的urlencode编码
this.code = this.getUrlCode().code;// 截取code
this.state = this.getUrlCode().state;//我需要的参数值
if (this.code == null || this.code === '') { // 如果没有code,则去请求
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri=' + UrlEncode + '&response_type=code&scope=snsapi_base&state=' + this.merId + 'M' + this.exhiId + '#wechat_redirect'
} else {
getGainOpenId(this.code,this.state).then(response => {
const msg = response.msg;
if (msg == "授权成功"){//授权成功
window.location.href = '提醒页面';
}else if (msg == "授权失败"){//授权失败
window.location.href = '提醒页面';
}
});
}
},
getUrlCode() { // 截取url中的code方法
var url = location.search;
this.winUrl = url;
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
var strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1]);
}
}
return theRequest;
}
}
3、调用微信accessToken接口获取openid
//appid是微信公众号开发者ID,appSecret是微信公众号开发者密码
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+appSecret+"&code=" + code + "&grant_type=authorization_code";
String info = restTemplate.getForObject(url, String.class);//调用方法
ObjectMapper mapper = new ObjectMapper();
try {
Map<?, ?> accessToken = mapper.readValue(info, Map.class);
if (accessToken.get("access_token") == null) {//未获取access_token
return AjaxResult.success("授权失败");
}
String openId = (String) accessToken.get("openid");
//将openId存入数据库
xxMapper.update(id,openId);
return AjaxResult.success("授权成功");
} catch (JsonProcessingException e) {//返回结果转换map失败
return AjaxResult.success("授权失败");
}
}