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
}
}
}
来源:CSDN
作者:╰╮◇经年错、不诉离伤
链接:https://blog.csdn.net/weixin_42230479/article/details/103876373