微信授权接口

混江龙づ霸主 提交于 2020-01-07 17:44:07
package cn.com.connext.scrm.web.rest.util;
import cn.com.connext.scrm.domain.master.UserInfoEntity;
import cn.com.connext.scrm.utils.HttpUtils;
import cn.com.connext.scrm.web.rest.ThirdResource;
import cn.com.connext.scrm.web.rest.vm.ThirdInfo;
import cn.com.connext.scrm.web.rest.vm.WechatUserInfo;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URLEncoder;
public class WeixinUtil {
//获取code,若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
private final static String GET_CODE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsa        pi_userinfo&state=STATE#wechat_redirect";
// 通过code换取网页授权access_token
private final static String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

// 刷新access_token(如果需要)
public final static String REFRESH_ACCESS_TTOKEN =	"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";

// 获取网页授权微信用户信息地址
private final static String sns_userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESSTOKEN&openid=OPENID&lang=zh_CN";

// 拉取用户信息(需scope为 snsapi_userinfo)
public final static String USER_INFO_URL =	"https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";


private final static  Logger logger = LoggerFactory.getLogger(ThirdResource.class);


/**
 * 根据微信授权获取用户信息
 */
public static JSONObject getWechatUserInfo(String appId,String redirectUrl) {
    //根据appId获取code
    JSONObject codeJson = getCode(appId, redirectUrl);
    //根据code获取accessToken
    JSONObject accessTokenJson = getAccessToken(codeJson.getString("code"), appId, null);
    WechatUserInfo userInfo = getWechatUserUnionIDInfo(accessTokenJson.getString("openid"), accessTokenJson.getString("access_token"));
    return (JSONObject) JSONObject.toJSON( userInfo);
}
/**
 * 根据微信授权获取用户信息
 */
public static JSONObject getUserInfoByWechatAndThird(String appId,String redirectUrl,String clientId, String clientSecret, String grandType,String thirdUrl) {
    JSONObject thirdAccessToken = getThirdAccessToken(clientId, clientSecret, grandType, thirdUrl);
    //获取第三方access_token
    String access_token = thirdAccessToken.getString("access_token");
    //根据appId获取code
    JSONObject codeJson = getCode(appId, redirectUrl);
    //根据code获取accessToken
    String code=codeJson.getString("code");
    StringBuilder url=new StringBuilder("https://api-wechat.lorealchina.com/api/weixin/get_auth_access_token?");
    url.append("access_token="+access_token+"&code="+code);
    UserInfoEntity userInfoEntity = JSONObject.parseObject(HttpUtils.doGet(url.toString()), UserInfoEntity.class);
    return (JSONObject) JSONObject.toJSON(userInfoEntity);
}


/**
 * 通过用户appid获取code
 */
public static JSONObject getCode(String appid, String redirectUrl) {
    try {
        String parseUrl = urlEnodeUTF8(redirectUrl);
        String url = GET_CODE.replace("APPID",appid).replace("REDIRECT_URI",parseUrl);
        String code = HttpUtils.doGet(url);
        return  JSONObject.parseObject(code);
    }catch(Exception e){
        logger.error("该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限!", e);
    }
    return null;
}

/**
 * 通过用code获取access_token
 */
public  static JSONObject getAccessToken (String code ,String appId,String secret) {
    try {
        if(StringUtils.isEmpty(secret)){
            secret="SECRET";
        }
        String url = GET_ACCESS_TOKEN.replace("APPID",appId).replace("CODE",code).replace("SECRET",secret);
        String accessToken = HttpUtils.doGet(url);
        return  JSONObject.parseObject(accessToken);
    }catch(Exception e){
        logger.error("Code无效错误!", e);
    }
    return null;
}

/**
 * 刷新accessToken
 */
public  JSONObject refreshAccessToken (String appid) {
    try {
        String url = REFRESH_ACCESS_TTOKEN.replace("APPID",appid);
        String accessToken = HttpUtils.doGet(url);
        return  JSONObject.parseObject(accessToken);
    }catch(Exception e){
        logger.error("Code无效错误!", e);
    }
    return null;
}

/**
 * 获取网页授权微信用户信息
 */
public static JSONObject getUserInfo(String token, String openId) {
    try {
        // 通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。
        String url = sns_userinfo_url.replace("ACCESSTOKEN", token).replace(
                "OPENID", openId);
        String res = HttpUtils.doGet(url);
        return JSONObject.parseObject(res);
    } catch (Exception e) {
        logger.error("用户授权获取用户信息失败!", e);
    }
    return null;
}


/**
 * 拉取用户信息
 */
public static WechatUserInfo getWechatUserUnionIDInfo(String openId, String accessToken) {
    String userUrl = USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).
            replace("OPENID", openId);
    String userInfo = HttpUtils.doGet(userUrl);
    if(StringUtils.isBlank(userInfo)) {
        return null;
    }
    JSONObject user = (JSONObject) JSONObject.toJSON(userInfo);
    if (null != user) {
        if ("40003".equals(user.get("errcode"))) {
            logger.error("网页授权失败 errcode:{} errmsg:{}"+ user.getInteger("errcode")+ user.getString("errmsg"));
            return null ;
        }
    }
    WechatUserInfo wechatUserInfo = new WechatUserInfo();
    wechatUserInfo.setOpenid(user.getString("openid"));
    wechatUserInfo.setNickname(user.getString("nickname"));
    wechatUserInfo.setSex(user.getInteger("sex"));
    wechatUserInfo.setCity(user.getString("city"));
    wechatUserInfo.setCountry(user.getString("country"));
    wechatUserInfo.setProvince(user.getString("province"));
    wechatUserInfo.setHeadimgurl(user.getString("headimgurl"));
    return wechatUserInfo;
}


/**
 * 把网址里的特殊字符转换,如http://转换成http:%3A%2F%2F
 */
public static String urlEnodeUTF8(String str){
    String result = str;
    try {
        result = URLEncoder.encode(str,"UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

/**https://www.baidu.com/
 * 微信重定向url判定
 */

public String getWeChatUrl(String appId,String urlOrIp, String openId, String masterId,String getWeChatUrl,
                           String returnUrl, String ext) {
    if((null==masterId) || (null == openId)){
        return "redirect:"+getWeChatUrl(appId, urlOrIp, getWeChatUrl);
    }else{

        return returnUrl+masterId+ext;
    }
}



/**
 * 微信授权链接
 */
public String getWeChatUrl(String appid, String urlOrIp ,String url){
    StringBuffer weChatUrl = new StringBuffer("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
    weChatUrl.append(appid);
    weChatUrl.append("&redirect_uri=");
    weChatUrl.append(urlOrIp);
    weChatUrl.append("%2Fcard%2Fweixin%2Fopenid.htm&response_type=code&scope=snsapi_userinfo&state=");
    weChatUrl.append(WeixinUtil.urlEnodeUTF8(url));
    weChatUrl.append("#wechat_redirect");
    System.out.println("授权地址:"+weChatUrl.toString());
    return weChatUrl.toString();
}

/**
 * 调用第三方获取access_token
 */
public static JSONObject getThirdAccessToken(String clientId,String clientSecret,String grantType,String url){
   StringBuilder sb=new StringBuilder();
   sb.append("grant_type="+grantType);
   sb.append("&client_id="+clientId);
   sb.append("&client_secret=" + clientSecret);
   String result = HttpUtils.doPost(url, sb.toString());
   ThirdInfo thirdEntity = JSONObject.parseObject(result, ThirdInfo.class);
   if(thirdEntity.getErrcode()== -1){
       logger.error(thirdEntity.getErrmsg());
       return null;
   }else{
       return JSONObject.parseObject(result);
   }

}
//http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

   /**
 * 检验授权凭证(access_token)是否有效
 */
public static JSONObject getThirdAccessToken(String appId,String accessToken,String openId){
   String url="https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID";
   url.replace("ACCESS_TOKEN",accessToken).replace("OPENID",openId);
   String result = HttpUtils.doGet(url);
   JSONObject obj=JSONObject.parseObject(result);
   if(obj.getInteger("errcode")!= 0){
     JSONObject obj2 = refreshAccessToken(appId);
	 return obj2;
   }
     return null
   }
}

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!