在后台獲取完微信用戶數據后,對微信名進行UTF-8編碼
URLEncoder.encode(nickName, "utf-8")
,將編碼后的結果儲存到數據庫中,環境為mysql數據庫。
完整代碼:
/** * 解密用戶敏感數據 * @param encryptedData 明文,加密數據 * @param iv 加密算法的初始向量 * @param code 用戶允許登錄后,回調內容會帶上 code(有效期五分鍾),開發者需要將 code 發送到開發者服務器后台,使用code 換取 session_key api,將 code 換成 openid 和 session_key * @return */ @RequestMapping(value = "/decodeUserInfo",method ={ RequestMethod.POST,RequestMethod.GET}) public JSONObject decodeUserInfo(@RequestParam(value = "encryptedData")String encryptedData, @RequestParam(value = "iv")String iv, @RequestParam(value = "code")String code){ JSONObject result=new JSONObject(); try { /** * 如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程序), * 可通過unionid來區分用戶的唯一性,因為只要是同一個微信開放平台帳號下的移動應用、網站應用和公眾帳號(包括小程序),用戶的unionid是唯一的。 * 換句話說,同一用戶,對同一個微信開放平台下的不同應用,unionid是相同的。 * 前提是微信開放平台認證綁定了才可以獲取到unionid否則只有openid */ result=WechatUtil.getDeCodeUserInfo(encryptedData,WechatUtil.getSessionKeyAndOpenid(code,requestUrl,appid,appSecret).getString("session_key"),iv); WechatInfo wechatInfo=new WechatInfo(); wechatInfo.setUserAvatarUrl(result.getString("avatarUrl")); String nickName = result.getString("nickName");//獲取用戶名 wechatInfo.setUserNickName(URLEncoder.encode(nickName, "utf-8"));//將微信昵稱用utf-8編碼后儲存 wechatInfo.setOpenId(result.getString("openId")); result.put("isDept",wechatInfoService.execWechatInfo(wechatInfo)); logger.info("解密后的信息"+result.toString()); }catch (Exception e){ e.printStackTrace(); logger.error(e.getMessage()); } return result; }
讀取微信名的時候,在實體類內定義一個新屬性,用來接收解碼后的微信名,供頁面顯示。
//UTF-8編碼后的字符 private String userNickNameUTF8; public String getUserNickNameUTF8() { try { //UTF-8解碼后的字符 return URLDecoder.decode(userNickName, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return ""; } public void setUserNickNameUTF8(String userNickNameUTF8) { this.userNickNameUTF8 = userNickNameUTF8; }
需要注意的是:存儲時,使用的是實體中與數據庫字段相對應的屬性;而讀取的時候,使用的實體中新定義的屬性。