日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...

發(fā)布時間:2024/9/27 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。