微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...
1. 第三方發(fā)起微信授權(quán)登錄請求,微信用戶允許授權(quán)第三方應(yīng)用后,微信會拉起應(yīng)用或重定向到第三方網(wǎng)站,并且?guī)鲜跈?quán)臨時票據(jù)code參數(shù);
2. 通過code參數(shù)加上AppID和AppSecret等,通過API換取access_token;
3. 通過access_token進行接口調(diào)用,獲取用戶基本數(shù)據(jù)資源或幫助用戶實現(xiàn)基本操作。
獲取access_token時序圖:
微信網(wǎng)站應(yīng)用授權(quán)登錄接口對接代碼實現(xiàn):
需用的配置文件:
需用的vo類:
代碼:
package?com.thinkwin.common.vo;
/**
*?類名:?WechatAccessTokenVo??*?描述:?授權(quán)關(guān)系接口的調(diào)用憑證模型?*?開發(fā)人員:?weining??*?創(chuàng)建時間:??2017/5/5??*/
public?class?WechatAccessTokenVo{
//?網(wǎng)頁授權(quán)接口調(diào)用憑證
private?String?accessToken?;
//?憑證有效時長
private?int?expiresIn;
//?用于刷新憑證
private?String?refreshToken;
//?用戶標(biāo)識
private?String?openId;
//?用戶授權(quán)作用域
private?String?scope;
//?用戶全局唯一標(biāo)識??unionid
private?String?unionid;
public?String?getAccessToken()?{
return?accessToken;
}
public?void?setAccessToken(String?accessToken)?{
this.accessToken?=?accessToken;
}
public?int?getExpiresIn()?{
return?expiresIn;
}
public?void?setExpiresIn(int?expiresIn)?{
this.expiresIn?=?expiresIn;
}
public?String?getRefreshToken()?{
return?refreshToken;
}
public?void?setRefreshToken(String?refreshToken)?{
this.refreshToken?=?refreshToken;
}
public?String?getOpenId()?{
return?openId;
}
public?void?setOpenId(String?openId)?{
this.openId?=?openId;
}
public?String?getScope()?{
return?scope;
}
public?void?setScope(String?scope)?{
this.scope?=?scope;
}
public?String?getUnionid()?{
return?unionid;
}
public?void?setUnionid(String?unionid)?{
this.unionid?=?unionid;
}
}
package?com.thinkwin.common.vo;
import?java.util.List;
/**
*?類名:?WechatSNSUserInfoVo??*?描述:?通過網(wǎng)頁授權(quán)獲取的用戶信息??*?開發(fā)人員:?weining??*?創(chuàng)建時間:??2017/4/27??*/
public?class?WechatSNSUserInfoVo?{
//?用戶標(biāo)識
private?String?openId;
//?用戶昵稱
private?String?nickname;
//?性別(1是男性,2是女性,0是未知)
private?int?sex;
//?國家
private?String?country;
//?省份
private?String?province;
//?城市
private?String?city;
//?用戶頭像鏈接
private?String?headImgUrl;
//?用戶特權(quán)信息
private?List?privilegeList;
//?用戶全局唯一標(biāo)識??unionid
private?String?unionid;
public?String?getOpenId()?{
return?openId;
}
public?void?setOpenId(String?openId)?{
this.openId?=?openId;
}
public?String?getNickname()?{
return?nickname;
}
public?void?setNickname(String?nickname)?{
this.nickname?=?nickname;
}
public?int?getSex()?{
return?sex;
}
public?void?setSex(int?sex)?{
this.sex?=?sex;
}
public?String?getCountry()?{
return?country;
}
public?void?setCountry(String?country)?{
this.country?=?country;
}
public?String?getProvince()?{
return?province;
}
public?void?setProvince(String?province)?{
this.province?=?province;
}
public?String?getCity()?{
return?city;
}
public?void?setCity(String?city)?{
this.city?=?city;
}
public?String?getHeadImgUrl()?{
return?headImgUrl;
}
public?void?setHeadImgUrl(String?headImgUrl)?{
this.headImgUrl?=?headImgUrl;
}
public?List?getPrivilegeList()?{
return?privilegeList;
}
public?void?setPrivilegeList(List?privilegeList)?{
this.privilegeList?=?privilegeList;
}
public?String?getUnionid()?{
return?unionid;
}
public?void?setUnionid(String?unionid)?{
this.unionid?=?unionid;
}
}
需要的工具類:
代碼 :
package?com.thinkwin.common.utils.wechat;
import?com.alibaba.fastjson.JSONObject;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?javax.net.ssl.HttpsURLConnection;
import?javax.net.ssl.SSLContext;
import?javax.net.ssl.SSLSocketFactory;
import?javax.net.ssl.TrustManager;
import?java.io.BufferedReader;
import?java.io.InputStream;
import?java.io.InputStreamReader;
import?java.io.OutputStream;
import?java.net.ConnectException;
import?java.net.URL;
/**
*?類名:?WechatCommonUtil??*?描述:?微信登錄通用工具類?*?開發(fā)人員:?weining??*?創(chuàng)建時間:??2017/5/5??*/
public?class?WechatCommonUtil?{
private?static?Logger?log?=?LoggerFactory.getLogger(WechatCommonUtil.class);
/**
*?發(fā)送https請求
*
*?@param?requestUrl?請求地址
*?@param?requestMethod?請求方式(GET、POST)
*?@param?outputStr?提交的數(shù)據(jù)
*?@return?JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值)
*/
public?static?JSONObject?httpsRequest(String?requestUrl,?String?requestMethod,?String?outputStr)?{
JSONObject?jsonObject?=?null;
try?{
//?創(chuàng)建SSLContext對象,并使用我們指定的信任管理器初始化
TrustManager[]?tm?=?{?new?WechatX509TrustManager()?};
SSLContext?sslContext?=?SSLContext.getInstance("SSL",?"SunJSSE");
sslContext.init(null,?tm,?new?java.security.SecureRandom());
//?從上述SSLContext對象中得到SSLSocketFactory對象
SSLSocketFactory?ssf?=?sslContext.getSocketFactory();
URL?url?=?new?URL(requestUrl);
HttpsURLConnection?conn?=?(HttpsURLConnection)?url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
//?設(shè)置請求方式(GET/POST)
conn.setRequestMethod(requestMethod);
//?當(dāng)outputStr不為null時向輸出流寫數(shù)據(jù)
if?(null?!=?outputStr)?{
OutputStream?outputStream?=?conn.getOutputStream();
//?注意編碼格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
//?從輸入流讀取返回內(nèi)容
InputStream?inputStream?=?conn.getInputStream();
InputStreamReader?inputStreamReader?=?new?InputStreamReader(inputStream,?"utf-8");
BufferedReader?bufferedReader?=?new?BufferedReader(inputStreamReader);
String?str?=?null;
StringBuffer?buffer?=?new?StringBuffer();
while?((str?=?bufferedReader.readLine())?!=?null)?{
buffer.append(str);
}
//?釋放資源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream?=?null;
conn.disconnect();
jsonObject?=?JSONObject.parseObject(buffer.toString());
}?catch?(ConnectException?ce)?{
log.error("連接超時:{}",?ce);
}?catch?(Exception?e)?{
log.error("https請求異常:{}",?e);
}
return?jsonObject;
}
}
package?com.thinkwin.common.utils.wechat;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?java.io.IOException;
import?java.io.InputStream;
import?java.util.Properties;
/**
*?類名:?WechatConfigLoader??*?描述:?微信初始化配置信息?*?開發(fā)人員:?weining??*?創(chuàng)建時間:??2017/5/5??*/
public?class?WechatConfigLoader?{
//日志記錄對象
private?static?Logger?log?=?LoggerFactory.getLogger(WechatConfigLoader.class);
//配置文件路徑
private?static?String?wechatPath?=?"wechat.properties";
//開發(fā)平臺應(yīng)用唯一標(biāo)識
private?static?String?appId;
//開放平臺應(yīng)用密鑰
private?static?String?appSecret;
//微信第三方回調(diào)地址
private?static?String?backUrl;
static?{
//?類初始化后加載配置文件
InputStream?in?=?WechatConfigLoader.class.getClassLoader()
.getResourceAsStream(wechatPath);
Properties?props?=?new?Properties();
try?{
props.load(in);
}?catch?(IOException?e)?{
log.error("load?wechat?setting?error,pleace?check?the?file?path:"
+?wechatPath);
log.error(e.toString(),?e);
}
appId?=?props.getProperty("wechat.appId");
appSecret?=?props.getProperty("wechat.appSecret");
backUrl?=?props.getProperty("wechat.backUrl");
log.debug("load?wechat?setting?success,file?path:"?+?wechatPath);
}
public?static?String?getAppId()?{
return?appId;
}
public?static?String?getAppSecret()?{
return?appSecret;
}
public?static?String?getBackUrl()?{
return?backUrl;
}
public?static?void?setWechatPath(String?wechatPath)?{
WechatConfigLoader.wechatPath?=?wechatPath;
}
public?static?String?getWechatPath()?{
return?wechatPath;
}
public?static?void?setAppId(String?appId)?{
WechatConfigLoader.appId?=?appId;
}
public?static?void?setAppSecret(String?appSecret)?{
WechatConfigLoader.appSecret?=?appSecret;
}
public?static?void?setBackUrl(String?backUrl)?{
WechatConfigLoader.backUrl?=?backUrl;
}
}
package?com.thinkwin.lehui.common.wechatUtil;
import?com.alibaba.fastjson.JSONArray;
import?com.alibaba.fastjson.JSONObject;
import?com.thinkwin.lehui.common.wechatVo.WechatAccessTokenVo;
import?com.thinkwin.lehui.common.wechatVo.WechatSNSUserInfoVo;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
import?java.io.IOException;
import?java.net.URLEncoder;
import?java.util.List;
/**
*?類名:?WXOAuthProcess??*?描述:?微信第三方登錄授權(quán)流程工具類?*?開發(fā)人員:?weining??*?創(chuàng)建時間:??2017/5/5??*/
public?class?WechatOAuthProcessUtil?{
private?static?Logger?log?=?LoggerFactory.getLogger(WechatOAuthProcessUtil.class);
/**
*?1.獲取授權(quán)code
*?@param?req
*?@param?resp
*/
public?static?void?getOAuthCode(HttpServletRequest?req,?HttpServletResponse?resp){
String?appId?=?WechatConfigLoader.getAppId();
String?backUrl?=?WechatConfigLoader.getBackUrl();
String?url="https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
url?=?url.replace("APPID",appId);
url?=?url.replace("REDIRECT_URI",URLEncoder.encode(backUrl));
try?{
resp.sendRedirect(url);
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
/**
*?2.獲取授權(quán)調(diào)用token
*?@param?appId???????開發(fā)平臺應(yīng)用唯一標(biāo)識
*?@param?appSecret???開放平臺應(yīng)用密鑰
*?@param?code????????授權(quán)臨時票據(jù)?根據(jù)code來換取accessToken
*/
public?static?WechatAccessTokenVo?getOauthAccessToken(String?appId,?String?appSecret,?String?code){
WechatAccessTokenVo?wechatAccessTokenVo?=?null;
//拼接微信獲取accessToken請求的鏈接
String?url?=?"https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
url?=?url.replace("APPID",appId);
url?=?url.replace("SECRET",appSecret);
url?=?url.replace("CODE",code);
//?獲取網(wǎng)頁授權(quán)憑證?發(fā)送https請求
JSONObject?jsonObject?=?(WechatCommonUtil.httpsRequest(url,?"GET",?null));
if?(null?!=?jsonObject)?{
try?{
wechatAccessTokenVo?=?new?WechatAccessTokenVo();
wechatAccessTokenVo.setAccessToken(jsonObject.getString("access_token"));
wechatAccessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));
wechatAccessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));
wechatAccessTokenVo.setOpenId(jsonObject.getString("openid"));
wechatAccessTokenVo.setScope(jsonObject.getString("scope"));
wechatAccessTokenVo.setUnionid(jsonObject.getString("unionid"));
}?catch?(Exception?e)?{
wechatAccessTokenVo?=?null;
int?errorCode?=?jsonObject.getInteger("errcode");
String?errorMsg?=?jsonObject.getString("errmsg");
log.error("獲取網(wǎng)頁授權(quán)憑證失敗?errcode:{}?errmsg:{}",?errorCode,?errorMsg);
}
}
return?wechatAccessTokenVo;
}
/**
*?3.通過網(wǎng)頁授權(quán)獲取用戶信息
*
*?@param?accessToken?網(wǎng)頁授權(quán)接口調(diào)用憑證
*?@param?openId?用戶標(biāo)識
*?@return?SNSUserInfo
*/
@SuppressWarnings(?{?"deprecation",?"unchecked"?})
public?static?WechatSNSUserInfoVo?getSNSUserInfo(String?accessToken,?String?openId)?{
WechatSNSUserInfoVo?snsUserInfo?=?null;
//?拼接請求地址?發(fā)送https請求
String?url?=?"https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
url?=?url.replace("ACCESS_TOKEN",?accessToken);
url?=?url.replace("OPENID",?openId);
//?通過網(wǎng)頁授權(quán)獲取用戶信息
JSONObject?jsonObject?=?WechatCommonUtil.httpsRequest(url,?"GET",?null);
if?(null?!=?jsonObject)?{
try?{
snsUserInfo?=?new?WechatSNSUserInfoVo();
//?用戶的標(biāo)識
snsUserInfo.setOpenId(jsonObject.getString("openid"));
//?昵稱
snsUserInfo.setNickname(jsonObject.getString("nickname"));
//?性別(1是男性,2是女性,0是未知)
snsUserInfo.setSex(jsonObject.getInteger("sex"));
//?用戶所在國家
snsUserInfo.setCountry(jsonObject.getString("country"));
//?用戶所在省份
snsUserInfo.setProvince(jsonObject.getString("province"));
//?用戶所在城市
snsUserInfo.setCity(jsonObject.getString("city"));
//?用戶頭像
snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
//?用戶特權(quán)信息
snsUserInfo.setPrivilegeList(JSONArray.toJavaObject(jsonObject.getJSONArray("privilege"),?List.class));
}?catch?(Exception?e)?{
snsUserInfo?=?null;
int?errorCode?=?jsonObject.getInteger("errcode");
String?errorMsg?=?jsonObject.getString("errmsg");
log.error("獲取用戶信息失敗?errcode:{}?errmsg:{}",?errorCode,?errorMsg);
}
}
return?snsUserInfo;
}
/**
*?刷新授權(quán)調(diào)用token
*?@param?appId???????開發(fā)平臺應(yīng)用唯一標(biāo)識
*?@param?refreshToken????通過access_token獲取到的refresh_token參數(shù)
*/
public?static?WechatAccessTokenVo?refreshAccessToken(String?appId,?String?refreshToken){
WechatAccessTokenVo??wechatAccessTokenVo?=?null;
//拼接微信刷新accessToken請求的鏈接
String?url?=?"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
url?=?url.replace("APPID",appId);
url?=?url.replace("REFRESH_TOKEN",refreshToken);
//?獲取網(wǎng)頁授權(quán)憑證?發(fā)送https請求
JSONObject?jsonObject?=?WechatCommonUtil.httpsRequest(url,?"GET",?null);
if?(null?!=?jsonObject)?{
try?{
wechatAccessTokenVo?=?new?WechatAccessTokenVo();
wechatAccessTokenVo.setAccessToken(jsonObject.getString("access_token"));
wechatAccessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));
wechatAccessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));
wechatAccessTokenVo.setOpenId(jsonObject.getString("openid"));
wechatAccessTokenVo.setScope(jsonObject.getString("scope"));
}?catch?(Exception?e)?{
wechatAccessTokenVo?=?null;
int?errorCode?=?jsonObject.getInteger("errcode");
String?errorMsg?=?jsonObject.getString("errmsg");
log.error("獲取網(wǎng)頁授權(quán)憑證失敗?errcode:{}?errmsg:{}",?errorCode,?errorMsg);
}
}
return?wechatAccessTokenVo;
}
}
package?com.thinkwin.common.utils.wechat;
import?javax.net.ssl.X509TrustManager;
import?java.security.cert.CertificateException;
import?java.security.cert.X509Certificate;
/**
*?類名:?MyX509TrustManager??*?描述:?信任管理器???*?開發(fā)人員:?weining??*?創(chuàng)建時間:??2017/5/5??*/
public?class?WechatX509TrustManager?implements?X509TrustManager?{
//?檢查客戶端證書
public?void?checkClientTrusted(X509Certificate[]?x509Certificates,?String?s)?throws?CertificateException?{
}
//?檢查服務(wù)器端證書
public?void?checkServerTrusted(X509Certificate[]?x509Certificates,?String?s)?throws?CertificateException?{
}
//?返回受信任的X509證書數(shù)組
public?X509Certificate[]?getAcceptedIssuers()?{
return?new?X509Certificate[0];
}
}
最后就是controller控制層代碼:
/**
*?確認(rèn)請求來自微信服務(wù)器??微信的回調(diào)
*/
@RequestMapping(value?=?"/oauthtest",?method?=?RequestMethod.GET)
public?String?OAuthTest(HttpServletRequest?request,?HttpServletResponse?response,?Model?model)?throws?ServletException,?IOException?{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter?out?=?response.getWriter();
//?用戶同意授權(quán)后,能獲取到code
String?code?=?request.getParameter("code");
String?state?=?request.getParameter("state");
//?用戶同意授權(quán)
if?(!"authdeny".equals(code))?{
//?獲取網(wǎng)頁授權(quán)access_token
WechatAccessTokenVo?wechatAccessTokenVo?=?WechatOAuthProcessUtil.getOauthAccessToken(code);
if(null?==?wechatAccessTokenVo){
if(state.equals("register")){
return?"redirect:/system/wechatregisterpage";
}
return?"redirect:/system/loginpage";
}
//?網(wǎng)頁授權(quán)接口訪問憑證
String?accessToken?=?wechatAccessTokenVo.getAccessToken();
//?用戶標(biāo)識
String?openId?=?wechatAccessTokenVo.getOpenId();
//?獲取用戶信息
WechatSNSUserInfoVo?snsUserInfo?=?WechatOAuthProcessUtil.getSNSUserInfo(accessToken,?openId);
Map?map?=?new?HashMap<>();
map.put("wechatAccessTokenVo",wechatAccessTokenVo);
map.put("snsUserInfo",snsUserInfo);
String?s?=?JSON.toJSONString(map);
//?用戶unionid
String?unionId?=?snsUserInfo.getUnionid();
//把字符串存redis里面
RedisUtil.set("WeChat"+unionId,s);
//訪問數(shù)據(jù)庫操作
//直接登錄
return?"登錄頁";
}
return?null;
}
到這里java基于微信開放平臺的授權(quán)登錄功能就完成了。
總結(jié)
以上是生活随笔為你收集整理的微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5怎么改为vue_Vue实战——
- 下一篇: dedecms联动筛选_DEDECMS分