package com.github.ouyangbob.wechat.authorize;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.github.ouyangbob.http.HttpUtil;
import com.github.ouyangbob.wechat.WechatConstants;
import com.github.ouyangbob.wechat.vo.UserInfo;
import com.google.common.collect.Maps;
/**
* 微信授权工具类
* @author ouyangbotao
*
*/
public class WechatAuthorizeUtil {
private static final Logger logger = LoggerFactory.getLogger(WechatAuthorizeUtil.class);
/**
* 生成授权URL
* https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
* @return
*/
public static String generateAuthorizeUrl(String callBackUrl){
StringBuilder sb=new StringBuilder(WechatConstants.AUTHORIZE_URL);
sb.append("?appid=");
sb.append(WechatConstants.APPID);
sb.append("&redirect_uri=");
try {
sb.append(URLEncoder.encode(callBackUrl,"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sb.append("&response_type=code");
sb.append("&scope=snsapi_userinfo#wechat_redirect");
return sb.toString();
}
/**
* 通过code获取accessToken
* https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
* @param code
* @return
*/
public static AccessToken getAccessToken(String code){
Map<String,String> paramMap=Maps.newHashMap();
paramMap.put("appid", WechatConstants.APPID);
paramMap.put("secret", WechatConstants.APPSECRET);
paramMap.put("code", code);
paramMap.put("grant_type", "authorization_code");
String body=HttpUtil.getRequest(WechatConstants.AUTHORIZE_GET_ACCESSTOKEN_URL,paramMap);
AccessToken accessToken=JSONObject.parseObject(body, AccessToken.class);
if(StringUtils.isNotEmpty(accessToken.getErrCode())){
logger.error("getAccessToken param:{},error:{}",paramMap,accessToken);
}
return accessToken;
}
/**
* 通过code获取accessToken
http:GET(请使用https协议)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
* @param code
* @return
*/
public static UserInfo getUserInfo(AccessToken accessToken){
Map<String,String> paramMap=Maps.newHashMap();
paramMap.put("access_token", accessToken.getAccessToken());
paramMap.put("openid", accessToken.getOpenid());
paramMap.put("lang", "zh_CN");
String body=HttpUtil.getRequest(WechatConstants.AUTHORIZE_GET_USERINFO_URL,paramMap);
UserInfo userInfo=JSONObject.parseObject(body, UserInfo.class);
if(StringUtils.isNotEmpty(userInfo.getErrCode())){
logger.error("getUserInfo param:{},error:{}",paramMap,accessToken);
}
return userInfo;
}
}