All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.zkdcloud.core.Oauth2AuthorizeComponent Maven / Gradle / Ivy

The newest version!
package cn.zkdcloud.core;

import cn.zkdcloud.util.HttpUtil;
import cn.zkdcloud.util.JsonUtil;
import cn.zkdcloud.util.WeChatUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.log4j.Logger;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * 网页授权管理
 *
 * @author zk
 * @version 2017/8/31
 */
public class Oauth2AuthorizeComponent implements Component {

    private static Logger logger = Logger.getLogger(Oauth2AuthorizeComponent.class);

    /**
     * 授权实例
     */
    public static Oauth2AuthorizeComponent authorizeComponent;

    /**
     * scope为snsapi_base 授权
     */
    public static String SNSAPI_BASE_URL;

    /**
     * scope为snsapi_userinfo 授权
     */
    public static String SNSAPI_USERINFO_URL;

    /**
     * 获取用户access token url
     */
    public static String GET_USER_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
            + WeChatUtil.getAppId() + "&secret=" + WeChatUtil.getAppSecret() + "&grant_type=authorization_code&code=";

    /**
     * 刷新yoghurt access token url
     */
    public static String REFRESH_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="
            + WeChatUtil.getAppId() + "&grant_type=refresh_token&refresh_token=";

    /**
     * 获取用户信息(GET)
     */
    public static String GET_USER_INFO = "https://api.weixin.qq.com/sns/userinfo?";

    /**
     * 检验该access_token是否有效
     */
    private static String CHECK_ACCESS_TOKEN = " https://api.weixin.qq.com/sns/auth?";

    /**
     * 可以初始化snsapiUrl
     */
    @Override
    public void init() {
    }

    private Oauth2AuthorizeComponent() {

    }

    /**
     * 设置scope为snsapi_base 和 snsapi_userinfo  授权
     *
     * @param redirect_uri 重定向url,应当使用https链接来确保授权code的安全性。
     * @param state        重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
     */
    public void setSnsapiUrl(String redirect_uri, String state) {
        try {
            redirect_uri = URLEncoder.encode(redirect_uri, "UTF-8");
            SNSAPI_BASE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatUtil.getAppId()
                    + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_base&state=" + state + "#wechat_redirect";
            SNSAPI_USERINFO_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatUtil.getAppId()
                    + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=" + state + "#wechat_redirect";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据code 获取用户信息
     *
     * @param code code 5分钟未被使用自动过期
     * @return userInfo
     */
    public String getUserInfo(String code) {
        String accessTokenJson = getUserAccessToken(code);
        if (null != accessTokenJson) {
            JSONObject accessToken = JSONObject.parseObject(accessTokenJson);
            return getUserInfo(accessToken.getString("access_token"), accessToken.getString("openid"));
        }
        return null;
    }

    /**
     * 根据code获取用户授权的access_token
     *
     * @param code code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期
     * @return jsonStr
     * {
     * "access_token":"ACCESS_TOKEN",
     * "expires_in":7200,
     * "refresh_token":"REFRESH_TOKEN",
     * "openid":"OPENID",
     * "scope":"SCOPE"
     * }
     */
    public String getUserAccessToken(String code) {
        String ret = HttpUtil.doGet(GET_USER_ACCESS_TOKEN + code);
        if (JsonUtil.isError(ret)) {
            logger.info("get user access tocken error!");
            return null;
        }
        return ret;
    }

    /**
     * 刷新拉取用户access token(GET/POST)
     *
     * @param refresh_token refresh token
     * @return jsonStr
     * {
     * "access_token":"ACCESS_TOKEN",
     * "expires_in":7200,
     * "refresh_token":"REFRESH_TOKEN",
     * "openid":"OPENID",
     * "scope":"SCOPE"
     * }
     */
    public String refreshUserAccessToken(String refresh_token) {
        String ret = HttpUtil.doGet(REFRESH_ACCESS_TOKEN + refresh_token);
        if (JsonUtil.isError(ret)) {
            logger.info("refresh user access token fail");
            return null;
        }
        return ret;
    }

    /**
     * 拉取用户信息(需scope为 snsapi_userinfo)
     *
     * @param access_token 网页授权接口调用凭证
     * @param openid       用户的唯一标识
     * @return 用户信息jsonStr
     * {
     * "openid":" OPENID",
     * " nickname": NICKNAME,
     * "sex":"1",
     * "province":"PROVINCE"
     * "city":"CITY",
     * "country":"COUNTRY",
     * "headimgurl":    "http://wx.qlogo.cn/Q1dZuTOgvLLrhJbERQQ,
     * "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
     * "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
     * }
     */
    public String getUserInfo(String access_token, String openid) {
        return getUserInfo(access_token, openid, "zh_CN");
    }

    /**
     * 拉取用户信息(需scope为 snsapi_userinfo)
     *
     * @param access_token 网页授权接口调用凭证
     * @param openid       用户的唯一标识
     * @return 用户信息jsonStr
     * {
     * "openid":" OPENID",
     * " nickname": NICKNAME,
     * "sex":"1",
     * "province":"PROVINCE"
     * "city":"CITY",
     * "country":"COUNTRY",
     * "headimgurl":    "http://wx.qlogo.cn/Q1dZuTOgvLLrhJbERQQ,
     * "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
     * "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
     * }
     */
    public String getUserInfo(String access_token, String openid, String lang) {
        String ret = HttpUtil.doGet(GET_USER_INFO + "access_token=" + access_token + "&openid=" + openid + "&lang=" + lang);
        if (JsonUtil.isError(ret)) {
            logger.info("get userinfo fail");
            return null;
        }
        return ret;
    }

    /**
     * 检查该access是否有效
     *
     * @param access_token access_token
     * @param openid       openid
     * @return is or not effective
     */
    public boolean isEffective(String access_token, String openid) {
        String ret = HttpUtil.doGet(CHECK_ACCESS_TOKEN + "access_token=" + access_token + "&openid=" + openid);
        if(JsonUtil.isError(ret)){
            logger.info("this access is expire");
            return false;
        }
        return true;
    }

    /**
     * 获取授权组件实例
     *
     * @return authorizeComponent
     */
    public static Oauth2AuthorizeComponent getInstance() {
        if (null == authorizeComponent) {
            authorizeComponent = new Oauth2AuthorizeComponent();
        }
        return authorizeComponent;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy