注意
@RequestMapping("/wxLoginInit")
public void loginInit(HttpServletRequest request,HttpServletResponse response) throws IOException {
/**
*这儿一定要注意!!首尾不能有多的空格(因为直接复制往往会多出空格),其次就是参数的顺序不能变动
**/
//CommonUtil.APPID微信公众号的appId
String url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+CommonUtil.APPID+
"&redirect_uri=" + URLEncoder.encode("http://hehehxixixx.free.idcfengye.com/wxLogin","UTF-8")+
"&response_type=code" +
"&scope=snsapi_userinfo" +
"&state=STATE#wechat_redirect";
//重定向到重定向地址
response.sendRedirect(url);
}
@RequestMapping("/wxLogin")
public String wxLogin(HttpServletRequest request,HttpServletResponse response){
//微信公众号的APPID和APPSECRET
String code=request.getParameter("code");
System.out.println("****************code:"+code);
// 获取网页授权access_token openid 等
Oauth2Token oauth2Token = getOauth2AccessToken(code);
System.out.println("***********************************oauth2Token信息");
// 网页授权接口访问凭证
String accessToken = oauth2Token.getAccessToken();
// 用户标识s
String openId = oauth2Token.getOpenId();
System.out.println(openId);
// 获取用户信息
WxUserDO wxUserInfo = getWxUserInfo(accessToken, openId);
//保存用户信息
OssSnsuser ossuser = new OssSnsuser();
ossuser.setOpenid(wxUserInfo.getOpenId());
ossuser.setNickname(wxUserInfo.getNickname());
ossuser.setHeadImgurl(wxUserInfo.getHeadimgurl());
ossSnsuserService.insertOssSnsuser(ossuser);
System.out.println("***********************************用户信息unionId:" + wxUserInfo.getUnionid() + "***:" + wxUserInfo.getNickname());
//具体业务start
Map<String, Object> map = new HashMap<>();
map.put("openId", wxUserInfo.getOpenId().toString());
//int num = wxuserService.count(map);
//if (num == 0) {
//保存用户信息
// wxuserService.save(wxUserInfo);
//}
//具体业务end
//返回你想要的地址
try {
response.sendRedirect("http://hehehxixixx.free.idcfengye.com/firsthome?openid="+wxUserInfo.getOpenId()+"&nickname="+ URLEncoder.encode(wxUserInfo.getNickname(),"UTF-8")+"&headimgurl="+wxUserInfo.getHeadimgurl());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map.toString();
}
/**
* 获取网页授权凭证
*
* @param appId 公众账号的唯一标识
* @param appSecret 公众账号的密钥
* @param code
* @return WeixinAouth2Token
*/
public static Oauth2Token getOauth2AccessToken(String code) { //optimize
Oauth2Token wat = null;
// 获取网页授权凭证
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(NetUtil.get(CommonUtil.REQUEST_URL.replace("APPID", CommonUtil.APPID).replace("SECRET", CommonUtil.APPSECRET).replace("CODE", code)));
if (null != jsonObject) {
try {
wat = new Oauth2Token();
wat.setAccessToken(jsonObject.getString("access_token"));
wat.setExpiresIn(jsonObject.getInteger("expires_in"));
wat.setRefreshToken(jsonObject.getString("refresh_token"));
wat.setOpenId(jsonObject.getString("openid"));
wat.setScope(jsonObject.getString("scope"));
} catch (Exception e) {
wat = null;
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
return wat;
}
/**
* 通过网页授权获取用户信息
*
* @param accessToken 网页授权接口调用凭证
* @param openId 用户标识
* @return SNSUserInfo
*/
public static WxUserDO getWxUserInfo(String accessToken, String openId) {
WxUserDO wxUserInfo = null;
// 通过网页授权获取用户信息
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(NetUtil.get(CommonUtil.USERINFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId)));
if (null != jsonObject) {
try {
wxUserInfo = new WxUserDO();
// 用户的标识
wxUserInfo.setOpenId(jsonObject.getString("openid"));
// 昵称
wxUserInfo.setNickname(jsonObject.getString("nickname"));
// 性别(1是男性,2是女性,0是未知)
wxUserInfo.setSex(jsonObject.getInteger("sex"));
// 用户所在国家
wxUserInfo.setCountry(jsonObject.getString("country"));
// 用户所在省份
wxUserInfo.setProvince(jsonObject.getString("province"));
// 用户所在城市
wxUserInfo.setCity(jsonObject.getString("city"));
// 用户头像
wxUserInfo.setHeadimgurl(jsonObject.getString("headimgurl"));
// 用户特权信息
List<String> list = JSON.parseArray(jsonObject.getString("privilege"),String.class);
wxUserInfo.setPrivilegeList(list);
//与开放平台共用的唯一标识,只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
wxUserInfo.setUnionid(jsonObject.getString("unionid"));
} catch (Exception e) {
wxUserInfo = null;
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
return wxUserInfo;
}
public class NetUtil {
public static CloseableHttpClient httpClient = HttpClientBuilder.create().build();
/**
* get请求获取String类型数据
* @param url 请求链接
* @return
*/
public static String get(String url){
StringBuffer sb = new StringBuffer();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(httpGet); //1
HttpEntity entity = response.getEntity();
InputStreamReader reader = new InputStreamReader(entity.getContent(),"utf-8");
char [] charbufer;
while (0<reader.read(charbufer=new char[10])){
sb.append(charbufer);
}
}catch (IOException e){//1
e.printStackTrace();
}finally {
httpGet.releaseConnection();
}
return sb.toString();
}
/**
* post方式请求数据
* @param url 请求链接
* @param data post数据体
* @return
*/
@SuppressWarnings("unchecked")
public static String post(String url, Map<String,String> data){
StringBuffer sb = new StringBuffer();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> valuePairs = new ArrayList<NameValuePair>();
if(null != data) {
for (String key : data.keySet()) {
valuePairs.addAll((Collection<? extends NameValuePair>) new BasicNameValuePair(key, data.get(key)));
}
}
try {
// httpPost.setEntity(new UrlEncodedFormEntity((List<? extends org.apache.http.NameValuePair>) valuePairs));
HttpResponse response = httpClient.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
BufferedInputStream bis = new BufferedInputStream(httpEntity.getContent());
byte [] buffer;
while (0<bis.read(buffer=new byte[128])){
sb.append(new String(buffer,"utf-8"));
}
}catch (UnsupportedEncodingException e){//数据格式有误
e.printStackTrace();
}catch (IOException e){//请求出错
e.printStackTrace();
}finally {
httpPost.releaseConnection();
}
return sb.toString();
}
}
public class Oauth2Token {
// 网页授权接口调用凭证
private String accessToken;
// 凭证有效时长
private int expiresIn;
// 用于刷新凭证
private String refreshToken;
// 用户标识
private String openId;
// 用户授权作用域
private String scope;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
public String getRefreshToken() {
return refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}