最近工作中,接触到微信开发(公众号服务号开发)。
由于第一次接触微信开发,所以第一步先去看微信开发文档。
接下来,我们要使用微信来进行授权登录。
微信授权的话,获取用户信息有两种:
1.静默获取用户信息、
2.弹出授权界面,用户确认之后获取用户信息(这种方法能够获取到更多信息)。
开发准备,登录微信公众平台后台->基本配置->公众号开发信息:
1.获取到AppID
2.AppSecret
3.设置IP白名单
4.添加网页授权域名
公众号设置->功能设置
这一步,小伙伴本地开发的话没有域名,可以使用内网穿透软件,这里我用的是NATAPP,这样我们就能得到一个域名了,
然后按照微信的流程来绑定授权域名就好了。
获取用户信息,需要openid,然而获取openid的话要通过这个接口先获得一个code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
这里我们用的是弹出授权页面snsapi_userinfo
后台授权接口代码
@RequestMapping("/")
public void login(HttpServletResponse response) {
//这里是回调的url
String redirect_uri = URLEncoder.encode("http://回调页面的路径", "UTF-8");
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=APPID" +
"&redirect_uri=REDIRECT_URI"
"&response_type=code" +
"&scope=SCOPE" +
"&state=123#wechat_redirect";
response.sendRedirect(url.replace("APPID","你的APPID").replace("REDIRECT_URL",redirect_url).replace("SCOPE","snsapi_userinfo"));
}
使用微信web开发工具访问该接口,会弹出授权确认界面
用户点击确认登录之后跳转到我们的回调接口,并携带上code参数
redirect_uri/?code=CODE&state=STATE
,那我们就通过code来获取openid了。
获取code后,请求以下链接获取access_token与openid:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
后台回调接口代码
@RequestMapping("/index")
public void index(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
//开始请求url地址,第一次请求通过code获取openid与access_token
UrlConnUtils.get(url.replace("APPID", "你的APPID").replace("SECRET", "你的SECRET")
.replace("CODE", code), new GetDataUrlConnListener() {
@Override
public void onSuccess(HttpURLConnection connection) throws IOException {
String data = MyUtils.inputStreamToString(connection.getInputStream());
JSONObject jsonObject = JSONObject.parseObject(data);
if (jsonObject.getString("openid") != null) {
//拉取用户信息
String openid = jsonObject.getString("openid");
String access_token = jsonObject.getString("access_token");
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
//第二次请求,用openid与access_token获取用户的信息
UrlConnUtils.get(url.replace("OPENID", openid).replace("ACCESS_TOKEN", access_token), new GetDataUrlConnListener() {
@Override
public void onSuccess(HttpURLConnection connection) throws IOException {
String data = MyUtils.inputStreamToString(connection.getInputStream());
System.out.println(data);//输出微信返回的用户信息
}
}
});
}
第一次返回的数据:
{
"access_token":"9_zB3*****************w",
"expires_in":7200,
"refresh_token":"9_Uze***************9WTQ",
"openid":"o*************ug",
"scope":"snsapi_userinfo"
}
第二次返回的数据:(用户的信息)
{
"openid":"o***********g",
"nickname":"Smile",
"sex":1,
"language":"zh_CN",
"city":"厦门",
"province":"福建",
"country":"中国",
"headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTLs8SZLLWjyib0Q\/132",
"privilege":[]
}
这样就大功告成了!