微信oauth2的认证

注意

 @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;
	}
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值