1. 程式人生 > >小程式開發(1)——授權登入

小程式開發(1)——授權登入

最近公司在做小程式專案,第一次接觸小程式開發,踩了很多坑,整理了一些常見問題,分享給大家。今天先總結一下微信小程式單點登入:

微信官方登陸流程圖:

我的登入流程:

小程式登入主要流程

1小程式發起登陸請求,呼叫wx.login()獲取臨時登陸憑證code。請求至後臺。
2 通過code呼叫微信介面換取使用者唯一標識openid和會話祕鑰session_key
3 自己生成一個唯一標識3rd_session作為key,使用openid和session_key組合加密作為value儲存至快取(可以使用redis作為快取)。
4.根據業務需求處理微信使用者資訊。
5 後臺返回給小程式端key值,作為登入狀態(可以儲存至微信快取,也可以定義成全域性變數)。
6.後續請求如果需要openid,小程式端獲取key,,請求至後臺在後臺快取中獲取openid。

小程式端主要程式碼

 1bindGetUserInfo: function bindGetUserInfo(e) {
 2    var that = this;
 3    if (e.detail.userInfo) {
 4      wx.login({
 5        success: function success(loginRes) {
 6          if (loginRes) {
 7            //獲取使用者資訊
 8            wx.getUserInfo({
 9              withCredentials: true, //非必填  預設為true
10              success: function success(infoRes) {
11                //請求服務端的登入介面
12                wx.request({
13                  url: app.globalData.url + "LoginController",
14                  data: {
15                    code: loginRes.code, //臨時登入憑證
16                    rawData: infoRes.rawData, //使用者非敏感資訊
17                    signature: infoRes.signature, //簽名
18                    encrypteData: infoRes.encryptedData, //使用者敏感資訊
19                    iv: infoRes.iv //解密演算法的向量
20                  },
21                  success: function success(res) {
22                    console.log("login success"); 
24                    app.globalData.sessionid = res.data.sessionId;
26                    wx.setStorageSync("sessionid", res.data.sessionId);
27                    that.util("close");
28                  }
29                });
30              }
31            });
32          }
33        }
34      });
35
36      //授權成功後,跳轉進入小程式首頁
37    } else {
38      //使用者按了拒絕按鈕
39      wx.showModal({
40        title: "提示",
41        content: "拒絕授權,將無法提供部分服務哦!",
42        showCancel: false,
43        success: function success(res) {
44          that.util("close");
45        }
46      });
47    }
48  }

引數解釋:
code:loginRes.code,//臨時登入憑證:必傳,通過code來換取後臺的sessionKey和openId
rawData:infoRes.rawData,//使用者非敏感資訊
signature:infoRes.signature,//簽名
encrypteData:infoRes.encryptedData,//使用者敏感資訊
iv:infoRes.iv//解密演算法的向量

Java後端主要程式碼

1 控制層

 1String iv = request.getParameter("iv");
 2        String encrypteData = request.getParameter("encrypteData");
 3        String APPID = Utility.getSysParameter("WeChatAppID");
 4        String SECRET = Utility.getSysParameter("appSecret");
 5
 6        String grant_type = "authorization_code";
 7        // 微信官方獲取openid介面
 8        String WX_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
 9        String requestUrl = WX_URL.replace("APPID", APPID)
10                .replace("SECRET", SECRET).replace("JSCODE", code)
11                .replace("authorization_code", grant_type);
12        String returnvalue =WxUtils.getDataByUrl(code);
13        JSONObject jo = JSONObject.fromObject(returnvalue);
14        String openid = (String) jo.get("openid");
15        String session_key = (String) jo.get("session_key");
16        //解密使用者資訊
17        byte[] bytes = null;
18        try {
19            bytes = decrypt(Base64.decodeBase64(session_key.getBytes()),
20                    Base64.decodeBase64(iv.getBytes()),
21                    Base64.decodeBase64(encrypteData.getBytes()));
22        } catch (Exception e) {
23            e.printStackTrace();
24        }
25        String userinfo = new String(bytes, "UTF8");    
26        //儲存使用者資訊
27        JSONObject jsonObject = JSONObject.fromObject(userinfo);
28        insertUser(jsonObject, openid);
29        try {
30            Registeredusers(jsonObject,openid);
31        } catch (Exception e) {
32            e.printStackTrace();
33        }
34        Jedis  jedis = redisUtil.getJedis();  
35        //清除以前快取
36        if (jedis.hexists("TODELETE",openid)) {
37            String oldSesssionId = jedis.hget("TODELETE",openid);
38            jedis.hdel("TODELETE",openid);
39            if(jedis.hexists("SessionAndOpenId",oldSesssionId)){
40                jedis.hdel("SessionAndOpenId",oldSesssionId);
41            }
42        }
43        //redis快取openid以及sessionkey
44        String sessionId = UUID.randomUUID().toString().replaceAll("-", "");
45        jedis.hset("TODELETE", openid, sessionId);
46        jedis.hset("SessionAndOpenId", sessionId, openid+sessionId+session_key);
47        JSONObject jsonObject2 = new JSONObject();
48        jsonObject2 .put("sessionId", sessionId);
49        //將使用者資訊返回至小程式端

使用redis維護sessionid

維護3rd_session需要一個記憶體資料庫,這裡我選用了redis
維護會話態是記憶體資料庫的典型應用場景,畢竟量小,並且要求速度快,這麼一個小應用,當然也可以自己在記憶體中維護一個物件來進行會話id的處理,但是肯定難以跟一個成熟的系統相媲美
拋開程式碼實現,這似乎就是一句話可以概括的事情,生成一個唯一的隨機串sessionid,以此為key,openid和微信方的session_key為value存入redis,並把sessionid傳回給客戶端。

2工具類

 1/**
 2     * <p>Title: getDataByUrl</p>  
 3     * <p>Description:使用微信開放介面獲取openid和sessionkey </p>  
 4     * @param url
 5     * @return
 6     */
 7    public static String getDataByUrl(String url) {
 8        String result = "";
 9        BufferedReader in = null;
10        InputStream is = null;
11        InputStreamReader isr = null;
12        try {
13            URL realUrl = new URL(url);
14            URLConnection conn = realUrl.openConnection();
15            conn.connect();
16            is = conn.getInputStream();
17            isr = new InputStreamReader(is);
18            in = new BufferedReader(isr);
19            String line;
20            while ((line = in.readLine()) != null) {
21                result += line;
22            }
23        } catch (Exception e) {
24            e.printStackTrace();
25        } finally {
26            try {
27                if (in != null)in.close();
28                if (is != null)is.close();
29                if (isr != null)isr.close();
30            } catch (Exception ex) {
31                ex.printStackTrace();
32            }
33        }
34        return result;
35    }
36    /**
37     * <p>Title: decrypt</p>  
38     * <p>Description: 解密微信使用者敏感資訊 </p>  
39     * @param sessionkey
40     * @param iv
41     * @param encryptedData
42     * @return
43     * @throws Exception
44     */
45    public static byte[] decrypt(byte[] sessionkey, byte[] iv,byte[] encryptedData) throws Exception {
46        AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
47        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
48        SecretKeySpec keySpec = new SecretKeySpec(sessionkey, "AES");
49        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
50        return cipher.doFinal(encryptedData);
51    }

一結語

小程式登入相對靈活,可根據自己實際業務需求,進行程式碼設計。

                                                  掃一掃,關注Java開發之美,獲取更多書籍視訊資料

                                                              

相關推薦

程式開發1——授權登入

最近公司在做小程式專案,第一次接觸小程式開發,踩了很多坑,整理了一些常見問題,分享給大家。今天先總結一下微信小程式單點登入: 微信官方登陸流程圖: 我的登入流程: 小程式登入主要流程 1小程式發起登陸請求,呼叫wx.login()獲取臨時登陸憑證code

微信程式learning - 1簡易教程

官方連結:https://developers.weixin.qq.com/miniprogram/dev/ 學習微信小程式,重點標記,只做記錄,自行看官方文件       全域性配置 小程式根目錄下的 app.json 檔案用來對微信

微信遊戲開發1

一、安裝開發工具 前往開發者工具下載頁面,網址:https://developers.weixin.qq.com/minigame/dev/devtools/download.html,根據自己的作業系統下載對應的安裝包進行安裝。 二、建立小遊戲專案 1、開啟微信開發者工具,選擇小程式

從零開始學微信程式開發

從我學習開發小程式到現在,已經有好幾款上線了。雖然都是一些益智類的小程式,不難,但是也從裡面學到了一些知識。 1.準備工作 首先需要去官網註冊一個小程式的帳號。註冊好賬號以後,就可以設定補充小程式的資訊

微信程式入門1:簡單介面的實現

原始碼我已經放在GitHub上了https://github.com/A666AHL/pupil 1.安裝 微信web開發者工具 不多BB,直接從安裝IDE開始 首先,你得進入微信公眾平臺官網(https://mp.weixin.qq.com) 點選底部的小程式並檢視詳情

程式開發

在做微信小程式開發前會遇到一個大問題,就是所有請求都必須是https,這對於業餘開發者來說算是個大問題了,網上也介紹了本地除錯的方法,具體分為以下兩種:第一種是在開發時選擇不填寫appid第二種是設定中專案設定的不校驗合法域名。。。勾選上即可咯!

微信程式實戰---實現登入介面

昨天小程式第一天公測,就下載個小程式自帶IDE玩了玩,看了看API,擼出了個登入介面給大家分享下。 下面是主介面和程式碼。 index.wxml <view class="container"> <view class="usermotto">

跨平臺C++伺服器程式開發 1瞭解跨平臺開發

跨平臺伺服器程式的作用 所謂跨平臺,主要指Windows和Linux兩個主要平臺。如今絕大多數伺服器後端程式執行在Linux平臺,這是因為Linux具有免費、開源、遠端操控方便、易於大規模運維管理等優點,相比之下,Windows平臺更適用於個人使用者的辦公和娛

微信程式開發- 顯示 loading 提示框

首先看一張圖片,就是要做成的效果。 當我們點選查詢時,就會有一個請選擇地點的彈出框。 這個狀態我們只能去看微信開發文件了。 這個在API-介面-互動反饋-wx.hideLoading() 這

微信程式開發——使用sshstruts2+hibernate+spring框架實現後臺與微信前臺進行通訊

使用ssh框架實現對微信小程式前臺的通訊,做到前後臺分離,後臺頁面都為靜態頁面,通過用json來現實與前臺通訊(面向介面程式設計)。在這次因為只為了實現通訊所以沒有用hibernate。只用了struts2+spring,也是ssh框架中struts和spring整合。實現了

微信程式開發2---APP()函式

App({ onLaunch: function(options) { // Do something initial when launch. }, onShow: function(options) { // Do something when show. }, onHide: function() {

微信程式開發

快速學習的能力是碼農的核心競爭力 話說這幾天突然被微信小程式刷屏了,趁著還在內測階段,趕緊先把技能學到手吧。好在之前有過開發前端工程的經驗,這樣的話上起手來應該不會太難吧,呵呵。(手動傲嬌臉) 工欲善其事必先有其器 開發者工具安裝完成後,開啟並使用微信

java實現程式開發

上次Token(令牌和訊息祕鑰獲取到了); 現在就是開發小程式:首先就是要將小程式繫結在開發平臺下,同時指定自己伺服器的一個回撥地址這樣微信會定時每隔10分鐘向指定的伺服器傳送資料。如圖 同時配置你授權的一些資訊: 這裡指定伺服器接收微信推送過來的

微信程式開發

POST請求的坑 使用wx.request向伺服器提交資料時遇到的坑 1、header wx.request 預設的是使用GET方法,content-type為application/json,但是對於普通的POST方法向伺服器提交資料,我們需要修改hea

微信程式開發-類似於tab切換

效果圖和微信小程式圖吧公交中的一樣,只是樣式不一樣罷了,感興趣的可以用自己的手機檢視。 效果圖如下: 這是搜尋框,主要目的用於搜尋 這是搜尋到的資料,進行渲染 這是渲染路線的詳情頁,線路

微信程式開發圖片上傳+服務端接收

上次介紹了小程式開發中的微信登入。文章: 微信小程式開發(一) 微信登入流程, 這次介紹下小程式當中常用的圖片上傳。 前幾天做了圖片上傳功能,被坑了一下。接下來我們來看一下微信的上傳api。 這裡的filePath就是圖片的儲存路徑,型別居然是個

微信程式開發技術篇

技術篇,有些是我自己學的,有些是我們公司的全棧大神教的,還有些就是各種百度的。 會持續更新,每天寫一點。 -----------------------------------------------

Ok6410裸板程式開發1-開發環境搭建

廢話不都說,直接進去正題。本人的開發環境如下: @system:Ubuntu12.04 @串列埠工具:minicom @交叉工具鏈:arm-linux-gcc4.3.2 @開發板:Forlinx OK6410 開發裸板程式時,沒有選擇Jlink,主要原因就是它不好用,而且

微信程式開發--資料儲存

二. 同步儲存 (1)wx.setStorageSync(KEY,DATA) 將 data 儲存在本地快取中指定的 key 中,會覆蓋掉原來該 key 對應的內容,這是一個同步介面。 wx.setStorageSync('key', 'val

微信程式學習1——程式專案檔案及資料夾的功能介紹

因為工作的需要所以開始接觸微信小程式了,特此來記錄自己的學習過程和遇到的一些問題。 在新建一個微信小程式專案時主要會有如下幾個資料夾和檔案,主要就是介紹一下他們的主要功能。 檔案: app.js:主要就是註冊微信小程式應用 app.json:一些微信小程式的全