本文主要介紹服務器端基于Java語言使用springmvc實現的微信小程序的登錄開發。
登錄功能是小程序必須的一個功能,通過登錄我們可以記錄用戶在我們的小程序里一些行為,在后臺我們也可以模糊的確認出用戶(小程序只提供了用戶的昵稱和頭像這兩個值都不是唯一的而獲取到的openid雖然唯一但是是有微信服務器生成在我們自己服務器的后臺也不能和確定的用戶進行關聯)
微信的官方文檔詳細的介紹了登錄的流程,從流程中我們可以提煉出關鍵的信息:
1小程序的客戶端調用wx.login()接口可以code
2小程序的客戶端可以通過wx.request()來和自己的服務器進行通信
3自己的服務器在獲取到code后要和微信的服務器進行通信,來獲取openid和session_key
3生成一個隨機的值來作為鍵利用openid和session_key作為值來保持用戶的登錄狀態
4服務器返回隨機值到小程序的客戶端,以后小程序的請求附帶返回的隨機值來確保用戶的合法性
首先我們要先構造出一個GET請求來實現我們自己的服務器和微信的服務器的通信:
public static String GET(String url){ String result = ""; BufferedReader in = null; InputStream is = null; InputStreamReader isr = null; try { URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); conn.connect(); Map<String, List<String>> map = conn.getHeaderFields(); is = conn.getInputStream(); isr = new InputStreamReader(is); in = new BufferedReader(isr); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { //異常記錄 }finally{ try { if(in!=null){ in.close(); } if(is!=null){ is.close(); } if(isr!=null){ isr.close(); } } catch (Exception e2) { //異常記錄 } } return result; } |
我們在controller獲取到code的值然后查看appid和secret來把通信接口構造完整通過GET方法來完成自己的服務器和微信服務器的通信。
如果通信正常我們解析result就可以獲得openid和session_key,然后生成一個唯一值作為鍵以openid+session_key作為值來保存用戶的登錄狀態,然后把唯一值來返回到前端
Jedis jedis = new Jedis("localhost"); String openid = openid; String session_key = session_key; String uid = UUID.randomUUID().toString(); StringBuffer sb = new StringBuffer(); sb.append(openid); sb.append(","+session_key); jedis.set(uid, sb.toString()); return uid; |
問題處理:
如果需要獲取登錄用戶的用戶名和昵稱,我們就需要注意一個問題,如果昵稱中有中文就會出現亂碼,這是因為微信對于中文是按照ISO-8859-1來進行編碼的而我們需要的utf8編碼,對于獲取用戶昵稱出現亂碼這個問題我們做一下簡單的處理就可以解決:
String nickNameDecode = new String(nickName.getBytes("ISO-8859-1"),"utf-8");