微信開放平臺----微信掃碼登入
告知:所有操作是基於域名已備案,並且具有企業級微信公眾號!
1.準備工作
1.1.註冊微信開放平臺帳號
1.2.建立應用(網站應用),填寫資料
注意:
!填寫的域名與備案號必須一致.
!!授權回撥域名必須與微信公共號的授權域名一致
微信開放平臺:
微信公共平臺: 許可權介面(修改) ---> 設定 ----> 填寫域名 !需要將xxx.txt檔案上傳到伺服器根目錄
!!!整個微信開放平臺填寫資訊的最好是一致的,比如說域名,聯絡人郵箱,
1.3.申請成為開發者(不申請,沒有許可權呼叫微信掃碼登入介面)
1.3.1.申請開通
1.3.2.填寫資料
!保證資料真實就OK了
1.3.3.拿命來!,....哦不,是交錢,300大洋
2.微信掃碼登入流程 圖(自己畫的...)
可以去看官網啦,這裡自己的理解,還有個問題,這個二維碼對於使用者來說是一個請求到我們伺服器,然後我們伺服器就 會返回一個二維碼給他,但是對於開發人員就不是了,這裡不要給我誤帶了,看看官網就知道了.
3.實現
首先,前端肯定是有一個請求到後臺的,這個請求就是用於獲取微信登入二維碼的.
3.1.1.前端請求
例如:<a href="/wexinlogin/xxx">微信登入</a>,當然,後臺肯定是要進行對映的.
3.2.1.組裝URL,傳送請求到微信
3.2.1.1.怎麼組裝?
!這個是伺服器向微信開放平臺傳送的,目的就是返回二維碼,供使用者掃.
3.2.1.2.怎麼發,拿什麼發?
居然是在伺服器上向其它網路獲取資源,那麼必定就是HttpClient(原諒我見識短,大家補充...)
package weixinlogin;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
/***
* 微信掃碼登入:工具類
*/
public class wexinUtils {
//引數
public static final String APPID = "";
public static final String APPSECRETID = "";
//回撥地址
public static final String CALLBACK = "";
/***
*
* @param url : 組裝傳送請求的URL
* @return
* 該方法用於傳送請求到微信開放平臺,將返回值轉化為json
*/
public static JSONObject getjson(String url) throws IOException {
//初始化JSONObject
JSONObject jsonObject = null;
//初始化HttpClient(該物件用於在伺服器內部發送請求)
DefaultHttpClient client = new DefaultHttpClient();
//GET請求
HttpGet httpGet = new HttpGet(url);
//傳送請求
HttpResponse response = client.execute(httpGet);
//獲取返回結果
HttpEntity entity = response.getEntity();
//內容不為null
if(entity!=null){
//轉化字元為為JSON
String result = EntityUtils.toString(entity,"UTF-8");
//轉化為Json
jsonObject = jsonObject.fromObject(result);
}
//釋放
httpGet.releaseConnection();
return jsonObject;
}
}
!這裡回撥地址,跟之前稽核的哪個沒有一點關係,這個URL是伺服器真實存在的,並且能夠訪問得該資源.而哪個只是一個字串,沒有太多的作用(這是我的看法啦...,真實的希望各位大佬解釋一下啦...)
3.3.1. 回撥資料怎麼獲取?
經歷上次請求後,如果使用者選擇了登入授權,那麼微信開放平臺就會將請求發到之前我們指定的URL去.這個時候就會有CODE返回了,通過這個Code與AppID\SecretID獲取Access_token,就可以獲取到OPENID,這個OPENID就是微信使用者唯一標識,通過這個標識,我們又可以組裝URL,進而獲取當前微信使用者資訊.
package weixinlogin;
import io.cite.CiteRuntime;
import io.cite.plugin.cookie.cookie;
import io.cite.plugin.database.db;
import net.sf.json.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;
/***
* 微信登入成功回撥,獲取access_token
*/
public class weixincallback {
public void execute(CiteRuntime runtime) throws IOException, SQLException {
//請求,響應物件
HttpServletRequest request = runtime.getRequest();
HttpServletResponse response = runtime.getResponse();
//獲取Code
String Code = request.getParameter("code");
//通過Code/AppID/SecretID獲取access_token
String url ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wexinUtils.APPID +
"&secret=" + wexinUtils.APPSECRETID +
"&code=" + Code +
"&grant_type=authorization_code";
//傳送請求獲取access_token
JSONObject jsonobject = wexinUtils.getjson(url);
//微信登入使用者標識(用於處理業務)
String openid = jsonobject.getString("openid");
//獲取access_token
String access_token = jsonobject.getString("access_token");
//組裝獲取使用者資訊URL
String userinfor ="https://api.weixin.qq.com/sns/userinfo/access_token?appid=" + access_token + "&openid="+ openid
+ "&lang=zh_CN";
//傳送請求,獲取使用者資訊
JSONObject userinforobj = wexinUtils.getjson(userinfor);
//業務處理...
}
}
最終結果: