简介
微信公众号开发中,必不少可少的一环:公众号授权登录、获取微信用户信息。
本地完整运行环境准备
内网渗透=>生成本地指定端口映射的外网域名
传送门:内网渗透工具Natapp使用详解
域名生成之后修改配置文件:
注册并配置微信测试公众号
-
注册地址:微信公众平台 测试账号申请,扫码登录,并关注该测试号
-
获取测试号appid和appsecret
3…配置网页授权域名**(使用通过Natapp生成的域名)**
下载微信开发者工具
下载: 微信开发者工具
流程
文字简述
- 进入公众号首页,判断是否已经授权
- 未授权,则重定向到微信授权页面,拉起授权弹框,传入回调路径,回调路径必须是外网可访问同时对应域名以在微信公众号后台配置
- 点击允许授权,微信服务器回调上一步传入的回调路径,传入code参数
- 后台根据code参数和appid、appsecret调用微信api,获取openId、access_token,授权成功!
- 微信用户信息获取:根据openId、access_token获取微信用户信息
代码
1.首页判断是否已授权
Java后台跳转登录页面,返回配置和回调路径信息
@Autowired
private WxConfig wxConfig;
@RequestMapping
public String index(Model model) throws UnsupportedEncodingException {
model.addAttribute("wxConfig",wxConfig);
// 进行编码
model.addAttribute("redirectUri", URLEncoder.encode(wxConfig.getServer()+"/webAuthLogin/getCode","UTF-8"));
return "login";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>微信授权登录示例</title>
<script src="http://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body style="text-align: center;">
<h2>欢迎您:[[${session.userInfo?.nickname}]]!</h2>
<hr/>
<span>用户信息:[[${session.userInfo}]]</span>
<script th:inline="javascript">
var sceneStr;
var t;
var userInfo = [[${session.userInfo}]];
var appId = [[${wxConfig.appId}]];
var openId = [[${session.openId}]];
var redirectUri = [[${redirectUri}]];
console.log("======用户信息 开始=========");
console.log(userInfo);
if(userInfo != null){
alert("您好:"+userInfo.nickname);
}
console.log("======用户信息 结束=========");
$(function () {
if (openId == null) {
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId +
'&redirect_uri='+redirectUri +
'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
}else{
alert("您好:"+userInfo.nickname+",已经授权成功!");
}
})
</script>
</body>
</html>
2.回调方法,接受code参数返回openId和用户信息,重定向到首页
@Controller
@RequestMapping("webAuthLogin")
public class WebAuthLoginController {
//获取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";
@Autowired
private WxConfig wxConfig;
@Autowired
private HttpSession httpSession;
/**
* 微信网页授权回调
* @param code
* @return
*/
@RequestMapping("getCode")
public String getCode(String code){
String getOpenIdUrl = getOpenId.replace("APPID", wxConfig.getAppId()).replace("APPSECRET", wxConfig.getAppSecret()).replace("CODE", code);
String response = HttpClientUtil.doGet(getOpenIdUrl);
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("accessToken",accessToken);
httpSession.setAttribute("openId",openId);
httpSession.setAttribute("userInfo",getUserInfo(openId,accessToken));
return "redirect:/";
}
/**
* 获取微信用户信息
* @param openId
* @param accessToken
* @return
*/
private JSONObject getUserInfo(String openId,String accessToken){
String userInfoUrl = getUserInfo.replace("ACCESS_TOKEN",accessToken).replace("OPENID", openId);
String userInfo = HttpClientUtil.doGet(userInfoUrl);
JSONObject jsonObject = JSONObject.parseObject(userInfo);
return jsonObject;
}
}