java后台微信小程序微信运动之AES解密
想解密微信運動用戶的步數,準備步驟:申請一個微信小程序,獲取到小程序的APPID,SECRET秘鑰,成為微信小程序的開發者以后,開始你的代碼搬磚生活。
?
不說廢話上代碼
//@SysLog("獲取用戶openid") @GetMapping("getOpenId") public Result login(String code) {//微信的接口String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+APPID+"&secret="+SECRET+"&js_code="+ code +"&grant_type=authorization_code";RestTemplate restTemplate = new RestTemplate();//進行網絡請求,訪問url接口ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);String sessionKey = null;if(responseEntity != null && responseEntity.getStatusCode() == org.springframework.http.HttpStatus.OK) {String sessionData = responseEntity.getBody();Gson gson = new Gson();//解析從微信服務器獲得的openid和session_key;WeChatSession weChatSession = gson.fromJson(sessionData, WeChatSession.class);//獲取用戶的唯一標識String openid = weChatSession.getOpenid();//獲取會話秘鑰sessionKey = weChatSession.getSession_key();//最后要返回一個自定義的登錄態,用來做后續數據傳輸的驗證System.out.println("open_id:" + openid + " session_key:" + sessionKey);//此處為我保存數據的方法,可以根據自己的需求去處理WX_user wx_user = weChatLoginService.findByOpenId(openid);if (wx_user == null) {Integer num = weChatLoginService.saveUser(openid);if (num == 0) {return Result.fail("存儲失敗");}}}想要拿到用戶的加密步數的數據首先要獲得用戶的openId,sessionKey,這里就是的代碼了,通過前端傳來的用戶code,后端自行調用微信接口過去用戶OpenId,SessionKey
//@SysLog("解密保存微信步數接口") @GetMapping("/decrypt") public Result decrypt(String encryptedData, String iv, String sessionKey, String openId) throws Exception{System.out.println("date: "+encryptedData);System.out.println("iv: "+iv);System.out.println("openId: "+openId);Map map = new HashMap();try {AES aes = new AES();byte[] resultByte = aes.decrypt(encryptedData, sessionKey, iv);if(null != resultByte && resultByte.length > 0){String userInfo = new String(resultByte, "UTF8");map.put("status", "1");map.put("msg", "解密成功");map.put("userInfo", userInfo);//將微信運動的數據,轉換為listJSONObject userinfo = JSONObject.fromObject(userInfo);String stepInfoList = userinfo.getString("stepInfoList");Gson gson = new Gson();List<WxStep> list = gson.fromJson(stepInfoList, new TypeToken<List<WxStep>>() {}.getType());System.out.println(list);}else{map.put("status", "0");map.put("msg", "解密失敗");}} catch (UnsupportedEncodingException e) {e.printStackTrace();}Gson gson = new Gson();String decodeJSON = gson.toJson(map);return Result.success(decodeJSON); }此處的代碼為解密的代碼,AES為封裝好的解密的工具類,調用工具類中的decrypt的方法,接下來是已經解密成功的數據,處理數據,轉換成list
/*** Created by xac on 2018/08/31.*/ public class AES {// 算法名稱final String KEY_ALGORITHM = "AES";// 加解密算法/模式/填充方式final String algorithmStr = "AES/CBC/PKCS7Padding";//private Key key;private Cipher cipher;public void init(byte[] keyBytes) {// 如果密鑰不足16位,那么就補足. 這個if 中的內容很重要int base = 16;if (keyBytes.length % base != 0) {int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);keyBytes = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());// 轉化成JAVA的密鑰格式key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);try {// 初始化ciphercipher = Cipher.getInstance(algorithmStr);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchPaddingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public byte[] decrypt(String encryptedDataStr, String keyBytesStr, String ivStr) {byte[] encryptedText = null;byte[] encryptedData = null;byte[] sessionkey = null;byte[] iv = null;try {sessionkey = Base64.decodeBase64(keyBytesStr);encryptedData = Base64.decodeBase64(encryptedDataStr);iv = Base64.decodeBase64(ivStr);init(sessionkey);cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));encryptedText = cipher.doFinal(encryptedData);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return encryptedText;}這些就是AES工具類解密的代碼了,這里解密需要的參數就是前端調去微信傳回來的data,iv和用戶的sessionKey
?
所以解密并沒有想象中那么難,但是有幾個坑,解密的時候要注意看微信的開發者文檔,文檔中已經明確說明加密填充方式
還有一點需要注意的就是用戶的sessionKey,開發文檔中沒有明確聲明sessionKey的過期時間,但是!!!他真的會過期,我后來又仔細看了他的過期機制貌似是用戶進來小程序一定時間不點擊小程序他就會過期,如果用戶一直點擊小程序sessionKey就不會過期,對于這個問題的解決辦法我們就要交給前端了,當他們調用后端接口之前是要先用微信提供的一個方法檢驗用戶的sessionKey是否過期,如果過期就需要重新調取,保證每一次調接口的sessionKey都是有效的就可以了。這樣微信運動的解密就完成啦,并且微信的解密是通用的。
總結
以上是生活随笔為你收集整理的java后台微信小程序微信运动之AES解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 播放视频文件
- 下一篇: 2021年T电梯修理考试及T电梯修理模拟