微信授权读取用户信息

来源:互联网 发布:mac上的养成游戏 编辑:程序博客网 时间:2024/06/07 05:03

1. 定义接口常量

   // 凭证获取(GET)
    public final static String token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

    // 用户同意授权,获取code
    public final static String WX_OAUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
    
    // 用户同意授权,回调url
    public final static String WX_REDIRECT_URL = "http://14wj577900.51mypc.cn/showIndex";
    
    // 拉去用户信息url
    public final static String WX_SNSAPI_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
    //微信openId
    public final static String WX_OPEN_ID = "wxd571b8847be86a0f";
    
    //微信appSecret
    public final static String WX_APP_SECRET = "d25f8dfeeac2606a76d649ce8d735518";

2. 获取token,验证是否授权

      微信后台请求接口

       public String home(HttpServletRequest request) {
// 请求获取用户授权
String requestUrl = Constant.WX_OAUTH_URL
.replace("APPID", Constant.WX_OPEN_ID)
.replace("REDIRECT_URI",
CommonMethod.urlEncodeUTF8(Constant.WX_REDIRECT_URL))
.replace("SCOPE", "snsapi_base").replace("STATE", "123");
request.setAttribute("url", requestUrl);
return "url";
}

      //解析编码

     
    public static String urlEncodeUTF8(String source) {
        String result = source;
        try {
            result = java.net.URLEncoder.encode(source, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }

     // 获取TOKEN
Token accessToken = CommonMethod.getToken(Constant.WX_OPEN_ID,
Constant.WX_APP_SECRET, code);
if (!OAuth(request, accessToken.getAccessToken(),
accessToken.getOpenId())) {
return "error";
}

       // 获取接口访问凭证
    
     public static Token getToken(String appid, String appsecret, String code) {
        Token token = null;
        String requestUrl = Constant.token_url.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
        // 发起GET请求获取凭证
        net.sf.json.JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

   if (null != jsonObject) {
            try {
                token = new Token();
                token.setAccessToken(jsonObject.getString("access_token"));
                token.setExpiresIn(jsonObject.getInt("expires_in"));
                token.setOpenId(jsonObject.getString("openid"));
            } catch (JSONException e) {
                token = null;
                // 获取token失败
                System.out.println("获取token失败");
                e.printStackTrace();
                //log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return token;
    }

        //授权

          public boolean OAuth(HttpServletRequest request, String accessToken,
String openId) {
TBaseMember member = null;
// 拼接请求地址
String requestUrl = Constant.WX_SNSAPI_URL.replace("ACCESS_TOKEN",
accessToken).replace("OPENID", openId);
// 获取用户信息
JSONObject jsonObject = CommonMethod.httpsRequest(requestUrl, "GET",
null);


if (null != jsonObject) {
try {
// 根据openid查询判断用户是否存在
TBaseMember tbm = memberService.selectMemberByOpenId(jsonObject
.getString("openid"));
if (null != tbm) {
request.getSession().setAttribute("member", tbm);
} else {
member = new TBaseMember();
member.setmId(AutoGenerationCode.getUUId());
member.setmState("01");
member.setIsValid("01");
member.setCreateDate(new Date());
member.setmOpenid(jsonObject.getString("openid"));
member.setExt2(jsonObject.getString("nickname"));
member.setmSex("0" + jsonObject.getInt("sex"));
member.setExt1(jsonObject.getString("headimgurl"));
memberService.insertSelective(member);
request.getSession().setAttribute("member", member);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return false;
}    

3. 用户授权

   定义接口凭证

   public class Token {
// 接口访问凭证
    private String accessToken;
    // 凭证有效期,单位:秒
    private int expiresIn;

}