思路:用户在手机端同意授权登陆了,访问我们设置好的回调域名,我们开始用代码来一步一步的实现获取到用户信息。
步骤:
1、获取code(code我们做的是数据库存取)
2、通过code获取网页授权的access_token(access_token我们做的是数据库存取)
3、通过access_token拉取用户信息
回调域名:
/**
* 微信网页授权回调
*
* @param code
* @param state
* @param httpServletResponse
*/
@RequestMapping("wxdneglu")
public String wxAuthorize(String code, String state, HttpServletResponse httpServletResponse) {
try {
//1、验证数据库中的code是否有效的代码(省略)
/**
* 2、获取code后,请求以下链接获取access_token
*/
String getaccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=${APPID}&secret=${SECRET}&code=${CODE}&grant_type=authorization_code";
getaccessTokenUrl = getaccessTokenUrl.replace("${APPID}", APPID).replace("${SECRET}", SECRET).replace("${CODE}", code);
String accessTokenStr = BSNetwork.Get(getaccessTokenUrl);
JSONObject accessTokenJsonObject = JSONObject.parseObject(accessTokenStr);
if (accessTokenJsonObject.containsKey("errcode")) {
log.error("");
return "";
} else {
// 3、获取返回的信息
String access_token = accessTokenJsonObject.getString("access_token");
String openid = accessTokenJsonObject.getString("openid");
String expires_in = accessTokenJsonObject.getString("expires_in");
String refresh_token = accessTokenJsonObject.getString("refresh_token");
// 4、添加openid到cookie(省略,可加可不加)
/* 5、保存token信息的代码(省略) */
// 6、验证用户是否已存在(省略)
if (true) {
// 不存在创建用户
/**
* 7、获取用户信息
*/
String getuserinfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=${ACCESS_TOKEN}&openid=${OPENID}&lang=zh_CN";
getuserinfoUrl = getuserinfoUrl.replace("${ACCESS_TOKEN}", access_token).replace("${OPENID}", openid);
String userinfoJsonStr = BSNetwork.Get(getuserinfoUrl);
JSONObject userinfoJsonObject = JSONObject.parseObject(userinfoJsonStr);
if (userinfoJsonObject.containsKey("errcode")) {
log.error("");
} else {
String nickname = userinfoJsonObject.getString("nickname");
String sex = userinfoJsonObject.getString("sex");
String province = userinfoJsonObject.getString("province");
String city = userinfoJsonObject.getString("city");
String country = userinfoJsonObject.getString("country");
String headimgurl = userinfoJsonObject.getString("headimgurl");
//8、操作数据库,储存用户信息
}
}
}
return redirectTo(state);
} catch (Exception e) {
log.error("", e);
return "";
}
}
网络请求工具类
package com.XXXX.XX.common.util;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* 微信网络请求
*/
public class BSNetwork {
private static Logger log = LoggerFactory.getLogger(BSNetwork.class);
/**
* GET请求
*
* @param api
* @return
* @throws IOException
*/
public static String Get(String api) throws IOException {
log.info("BS发起Get请求 api -> " + api);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(api).build();
Response response = client.newCall(request).execute();
String json = response.body().string();
log.info("BS请求结束 response -> " + json);
response.close();
return json;
}
/**
* GET请求(附带accessToken)
*
* @param api
* @param accessToken
* @return
* @throws IOException
*/
public static String Get(String api, String accessToken) throws IOException {
api = api.replace("${TOKEN}", accessToken);
log.info("BS发起Get请求 api -> " + api);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(api).build();
Response response = client.newCall(request).execute();
String json = response.body().string();
log.info("BS请求结束 response -> " + json);
response.close();
return json;
}
}
关于网络请求的一些学习网址。
okHTTP:
http://square.github.io/okhttp/
https://blog.csdn.net/admans/article/details/79784543
https://blog.csdn.net/m0_37711172/article/details/79724560 *
https://www.jianshu.com/p/da4a806e599b
https://m.2cto.com/kf/201606/521457.html *
https://www.cnblogs.com/jianyungsun/p/6648390.html *
三种请求的对比:
https://blog.csdn.net/sjitayuyan/article/details/71272746?utm_source=itdadao&utm_medium=referral