小程式開發(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() 這
微信小程式開發(一)——使用ssh(struts2+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:一些微信小程式的全