APP呼叫微信授權登入之服務端開發
阿新 • • 發佈:2019-01-02
一直在做微信支付 微信授權登入這塊的APP介面 現在提供一個寫好的微信授權service類給大家參考
import com.pojo.wechat.UserInfoData; import com.utils.ConfigUtil; import com.utils.https.HttpClientUtil; import org.apache.commons.lang.StringUtils; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** * APP呼叫微信授權獲取使用者資訊 * Created by LaoWang on 2017/11/11. */ @Service("WeiXinAuthService") public class WeiXinAuthService { private static final Logger logger = LoggerFactory.getLogger(WeiXinAuthService.class); public static final String WX_AUTH_LOGIN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token"; public static final String WX_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo"; public static final String WX_ACCESS_INVALID = "https://api.weixin.qq.com/sns/auth"; public static final String WX_REFREESH_ACCESS = "https://api.weixin.qq.com/sns/oauth2/refresh_token"; //appid和appSecret 是在公眾平臺上申請的 //AppId public static final String WX_APP_ID = ConfigUtil.getProperty("wx.appid"); //AppSecret public static final String WX_APP_KEY = ConfigUtil.getProperty("wx.appkey"); /** * 獲取使用者資訊 * @param code * @return * @throws JSONException */ public UserInfoData checkLogin(String code) throws JSONException { //第一步:獲取授權 access_token String access_token_url = WX_AUTH_LOGIN_URL+"?appid="+WX_APP_ID+"&secret="+WX_APP_KEY+"&code="+code+"&grant_type=authorization_code"; //使用Https請求微信API介面 String loginRet = HttpClientUtil.doGet(access_token_url,"utf-8"); JSONObject grantObj = new JSONObject(loginRet); String errcode = grantObj.optString("errcode"); if (!StringUtils.isEmpty(errcode)){ logger.error("login weixin error {}",loginRet); return null; } String openId = grantObj.optString("openid"); if (StringUtils.isEmpty(openId)){ logger.error("login weixin getOpenId error {}",loginRet); return null; } String accessToken = grantObj.optString("access_token"); String expiresIn = grantObj.optString("expires_in"); String refreshToken = grantObj.optString("refresh_token"); String scope = grantObj.optString("scope"); //第二步:獲取使用者資訊 String getuserinfo_url = WX_USERINFO_URL+"?access_token="+accessToken+"&openid="+openId; //使用Https請求微信API介面 String userRet = HttpClientUtil.doGet(getuserinfo_url,"utf-8"); JSONObject userObj = new JSONObject(userRet); UserInfoData userInfo = new UserInfoData(); userInfo.setOpenId(openId); userInfo.setAccessToken(accessToken); userInfo.setRefreshToken(refreshToken); userInfo.setScope(scope); userInfo.setExpiresIn(Integer.valueOf(expiresIn)); String nickname = userObj.optString("nickname"); String sex = userObj.optString("sex"); String userImg = userObj.optString("headimgurl"); String unionid = userObj.optString("unionid"); userInfo.setNickname(nickname); userInfo.setUserImg(userImg); userInfo.setSex(sex); userInfo.setUnionid(unionid); return userInfo; } /** * 驗證accessToken是否過期 * @param accessToken * @param openID * @return * @throws JSONException */ public boolean isAccessTokenIsInvalid(String accessToken,String openID) throws JSONException { String url = WX_ACCESS_INVALID+"?access_token=" + accessToken + "&openid=" + openID; String invalidRet = HttpClientUtil.doGet(url,"utf-8"); try { JSONObject grantObj = new JSONObject(invalidRet); String errcode = grantObj.optString("errcode"); if (!StringUtils.isEmpty(errcode)){ logger.error("AccessToken Invalid error {}",grantObj); return false; } int errorCode = grantObj.getInt("errcode"); if (errorCode == 0) { return true; } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } /** * 重新整理refresh_token * @param refreshToken */ public UserInfoData refreshAccessToken(String refreshToken) { String uri = WX_REFREESH_ACCESS+"?appid=" + WX_APP_ID + "&grant_type=refresh_token&refresh_token="+refreshToken; String invalidRet = HttpClientUtil.doGet(uri,"utf-8"); UserInfoData userInfo = new UserInfoData(); try { JSONObject object = new JSONObject(invalidRet); String errcode = object.optString("errcode"); if (!StringUtils.isEmpty(errcode)){ logger.error("Refresh AccessToken error {}",object); return null; } userInfo.setOpenId(object.getString("openid")); userInfo.setAccessToken(object.getString("access_token")); userInfo.setRefreshToken(object.getString("refresh_token")); userInfo.setExpiresIn(Integer.valueOf(object.getString("expires_in"))); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return userInfo; } }
具體使用方法請根據專案需求進行更改