首先 騰訊那麼大的公司 文檔寫的那麼low 微信那麼火 demo寫的那麼差 我就想說一句
微信簡直就是在歧視Java
我這邊自己整合了下 微信支付和微信登錄 java的代碼 我打包出來了
不是讓你們直接使用的 是需要你們自己看看 借鑑的
http://download.csdn.net/download/qq_36020545/10129501
網頁版的微信登錄
獲取APPID和AppSecret
1.從前臺默認發起靜默授權
2.然後回調地址是後臺處理方法 會自動帶有參數進入後臺 微信的那邊回調會帶有code和state 我給出我的案例 : http://ghs.daivd.com/auth?code=XZXXXXXX&state=123 這是個GET請求
3.回調到我們後臺方法 然後截取code 然後通過code獲取用戶基礎信息 我們主要需要就是 openid 和 用戶access_token
4.獲取我們公衆號token(因爲獲取公衆號token有限制 最好是存在緩存當彙總) 然後結合我們獲取到的用戶openid 來判斷用戶是否有關注我們公衆號 如果沒有我們就返回微信公衆號關注頁面 如果我們就可以進行獲取用戶信息 然後存在我們數據中
5.然後返回我們前臺頁面
一.授權
微信有兩種網頁授權
第一種是靜默授權:不會給用戶任何提示直接返回用戶code 但是如果用戶內有關注我們的公衆號那麼我們就沒有辦法拿到用戶很全的信息
1、以snsapi_base爲scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(往往是業務頁面)
第二種是手動授權:會給用戶彈出頁面卻要用戶點擊確認,用戶點擊後我們就能拿到用戶的信息
2、以snsapi_userinfo爲scope發起的網頁授權,是用來獲取用戶的基本信息的。但這種授權需要用戶手動同意,並且由於用戶同意過,所以無須關注,就可在授權後獲取該用戶的基本信息。
下面是例子 注意是GET請求
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=XXXXX 這個是appid 可以在你微信公衆平臺中的 基礎配置中找到
&
redirect_uri=這裏填寫的是回調地址 也就是微信登錄後 返回訪問的地址 一般會填寫後臺地址 因爲回調是會帶有code值然後後臺可以通過code拿到用戶access_token *重點是你的回調地址需要使用urlEncode進行連接處理 直接百度urlEncode 有網頁版幫忙處理
&
response_type=code 這個是返回類型 不要改 返回類型,請填寫code
&
scope=這裏填寫登錄類別 也就是我們上面說的 靜默授權或者是手動授權 snsapi_base(靜默)/snsapi_userinfo(手動)
&
state=123 我們可以自定義參數 重定向後會帶上state參數,可以填寫a-zA-Z0-9的參數值,最多128字節
#wechat_redirect 這個是微信必填參數 不能改變
下面是給出的案例
靜默 https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXX&redirect_uri=http%3a%2f%2fghs.david.com%2fauth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
手動 https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXX&redirect_uri=http%3a%2f%2fghs.david.com%2fauth&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
這兩個就是從前臺發起的授權請求
二.回調方法
通過我們填寫的回調url他會進入我們後臺回調方法
public void weixinLogin(HttpServletRequest request,HttpServletResponse response) throws Exception {
Map<String, String[]> params = request.getParameterMap();//針對get獲取get參數
String[] codes = params.get("code");//拿到的code的值
String code = codes[0];//code
//這一步就是拼寫微信api請求地址並 通過微信的appid 和 微信公衆號的AppSecret 以及我們獲取到的針對用戶授權回調的code 拿到 這個用戶的 openid和access_token
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code".replace("APPID", 填寫微信APPID).replace("APPSECRET", 填寫微信公衆號的AppSecret).replace("CODE", code);
String requestResult = HttpTookit.doGet(requestUrl);//我們需要自己寫或者在網上找一個 doGet 方法 發送doGet請求
JSONObject getCodeResultJson = JSON.parseObject(requestResult);//把請求成功後的結果轉換成JSON對象
if(getCodeResultJson == null || getCodeResultJson.getInteger("errcode") != null || getCodeResultJson.getString("openid") == null) {
throw 這裏需要拋異常 如果返回值沒有 或者 出現錯誤返回errcode 或者 沒有拿到openid
}
String openid = getCodeResultJson.getString("openid");//拿到openid
//我們需要獲取當前公衆號通用的access_token 和用戶的access_token是不一樣的
//這裏我爲了讓大家可以方便就沒有寫太複雜 因爲微信他那邊獲取微信公衆號的通用access_token每天只能取2000次 每次token有效期是7200S 所以在自己動手寫最好放在緩存中 我的項目放在redis中
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET".replace("APPID", 填寫微信APPID).replace("APPSECRET", 填寫微信公衆號的AppSecret);
String requestResult = HttpTookit.doGet(requestUrl);
JSONObject weixinToken = JSON.parseObject(requestResult);
if(jsonObject == null){
throw 這裏需要拋異常 獲取我們公衆號token失敗
}
String wxgzhToken = accessToken.setToken(jsonObject.getString("access_token"));
//這裏是獲取用戶在我們公衆裏面的信息 如果沒有關注公衆號那麼就沒有辦法獲取詳細信息 參數需要 微信公衆號通用token 和 用戶openid
String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN".replace("ACCESS_TOKEN", wxgzhToken).replace("OPENID", openid);
String requestResult = HttpTookit.doGet(requestUrl);
JSONObject user = JSON.parseObject(requestResult);
if(user == null || user.getInteger("errcode") != null ) {
拋異常
}
Integer subscribe = user.getInteger("subscribe");//是否有關注我們公衆號
if(subscribe == 0){//沒有關注我們公衆號
response.sendRedirect("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzIyNTc1MDQ2Mw==&scene=110#wechat_redirect");//跳到我們公衆號關注頁面 url地址需要你麼你自己去截取
}else{//關注了
如果關注了
user中就會有詳細的信息 我們既可以把這些信息存在我們的數據庫中
然後跳轉到我們前臺頁面
}
}
這裏講一下這些apiurl返回的json
一
//獲取微信公衆號的通用access_token每天只能取2000次 每次token有效期是7200S 所以在自己動手寫最好放在緩存中 我的項目放在redis中
//grant_type=獲取access_token填寫client_credential(必填) appid=填寫我們的appid(必填) secret=填寫微信公衆號的AppSecret(必填)
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET".replace("APPID", 填寫微信APPID).replace("APPSECRET", 填寫微信公衆號的AppSecret);
返回的JSON
{
"access_token":"ACCESS_TOKEN",//獲取到的憑證
"expires_in":7200 //憑證有效時間,單位:秒
}
二
//通過微信的appid 和 微信公衆號的AppSecret 以及我們獲取到的針對用戶授權回調的code 拿到 這個用戶的 openid和access_token appid=填寫我們的appid(必填) secret=填寫微信公衆號的AppSecret(必填) grant_type=獲取access_token填寫authorization_code(必填)
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code".replace("APPID", 填寫微信APPID).replace("APPSECRET", 填寫微信公衆號的AppSecret).replace("CODE", code);
返回的JSON
{
"access_token":"ACCESS_TOKEN", //用戶的access_token 官網解釋:網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同
"expires_in":7200, //access_token接口調用憑證超時時間,單位(秒)
"refresh_token":"REFRESH_TOKEN", //用戶刷新access_token(不知道)
"openid":"OPENID", //用戶唯一標識,請注意,在未關注公衆號時,用戶訪問公衆號的網頁,也會產生一個用戶和公衆號唯一的OpenID (這個是重點 我們主要就是爲了這個)
"scope":"SCOPE" //用戶授權的作用域,使用逗號(,)分隔(不知道)
}
三
//這裏是獲取用戶在我們公衆裏面的信息 如果沒有關注公衆號那麼就沒有辦法獲取詳細信息 參數需要 微信公衆號通用token 和 用戶openid 還有 lang =返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語
String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN".replace("ACCESS_TOKEN", wxgzhToken).replace("OPENID", openid);
返回的JSON
{
"subscribe": 1, //用戶是否訂閱該公衆號標識,值爲0時,代表此用戶沒有關注該公衆號,拉取不到其餘信息。
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", //用戶的標識,對當前公衆號唯一
"nickname": "Band", //用戶的暱稱
"sex": 1, // 用戶的性別,值爲1時是男性,值爲2時是女性,值爲0時是未知
"language": "zh_CN", // 用戶的語言,簡體中文爲zh_CN
"city": "廣州", // 用戶所在城市
"province": "廣東", // 用戶所在省份
"country": "中國", // 用戶所在國家
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", //用戶頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項爲空。若用戶更換頭像,原有頭像URL將失效
"subscribe_time": 1382694957,//用戶關注時間,爲時間戳。如果用戶曾多次關注,則取最後關注時間
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL", // 只有在用戶將公衆號綁定到微信開放平臺帳號後,纔會出現該字段 (這個我也沒有搞清楚)
"remark": "",//公衆號運營者對粉絲的備註,公衆號運營者可在微信公衆平臺用戶管理界面對粉絲添加備註
"groupid": 0 // 用戶所在的分組ID
}
希望我的分享可以幫助到大家避免一些坑