日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java后台微信小程序微信运动之AES解密

發(fā)布時(shí)間:2024/1/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java后台微信小程序微信运动之AES解密 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

想解密微信運(yùn)動(dòng)用戶(hù)的步數(shù),準(zhǔn)備步驟:申請(qǐng)一個(gè)微信小程序,獲取到小程序的APPID,SECRET秘鑰,成為微信小程序的開(kāi)發(fā)者以后,開(kāi)始你的代碼搬磚生活。

?

不說(shuō)廢話上代碼

//@SysLog("獲取用戶(hù)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();//進(jìn)行網(wǎng)絡(luò)請(qǐng)求,訪問(wèn)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();//解析從微信服務(wù)器獲得的openid和session_key;WeChatSession weChatSession = gson.fromJson(sessionData, WeChatSession.class);//獲取用戶(hù)的唯一標(biāo)識(shí)String openid = weChatSession.getOpenid();//獲取會(huì)話秘鑰sessionKey = weChatSession.getSession_key();//最后要返回一個(gè)自定義的登錄態(tài),用來(lái)做后續(xù)數(shù)據(jù)傳輸?shù)尿?yàn)證System.out.println("open_id:" + openid + " session_key:" + sessionKey);//此處為我保存數(shù)據(jù)的方法,可以根據(jù)自己的需求去處理WX_user wx_user = weChatLoginService.findByOpenId(openid);if (wx_user == null) {Integer num = weChatLoginService.saveUser(openid);if (num == 0) {return Result.fail("存儲(chǔ)失敗");}}}

想要拿到用戶(hù)的加密步數(shù)的數(shù)據(jù)首先要獲得用戶(hù)的openId,sessionKey,這里就是的代碼了,通過(guò)前端傳來(lái)的用戶(hù)code,后端自行調(diào)用微信接口過(guò)去用戶(hù)OpenId,SessionKey

//@SysLog("解密保存微信步數(shù)接口") @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);//將微信運(yùn)動(dòng)的數(shù)據(jù),轉(zhuǎn)換為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為封裝好的解密的工具類(lèi),調(diào)用工具類(lèi)中的decrypt的方法,接下來(lái)是已經(jīng)解密成功的數(shù)據(jù),處理數(shù)據(jù),轉(zhuǎn)換成list

/*** Created by xac on 2018/08/31.*/ public class AES {// 算法名稱(chēng)final String KEY_ALGORITHM = "AES";// 加解密算法/模式/填充方式final String algorithmStr = "AES/CBC/PKCS7Padding";//private Key key;private Cipher cipher;public void init(byte[] keyBytes) {// 如果密鑰不足16位,那么就補(bǔ)足. 這個(gè)if 中的內(nèi)容很重要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());// 轉(zhuǎn)化成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工具類(lèi)解密的代碼了,這里解密需要的參數(shù)就是前端調(diào)去微信傳回來(lái)的data,iv和用戶(hù)的sessionKey

?

所以解密并沒(méi)有想象中那么難,但是有幾個(gè)坑,解密的時(shí)候要注意看微信的開(kāi)發(fā)者文檔,文檔中已經(jīng)明確說(shuō)明加密填充方式

還有一點(diǎn)需要注意的就是用戶(hù)的sessionKey,開(kāi)發(fā)文檔中沒(méi)有明確聲明sessionKey的過(guò)期時(shí)間,但是!!!他真的會(huì)過(guò)期,我后來(lái)又仔細(xì)看了他的過(guò)期機(jī)制貌似是用戶(hù)進(jìn)來(lái)小程序一定時(shí)間不點(diǎn)擊小程序他就會(huì)過(guò)期,如果用戶(hù)一直點(diǎn)擊小程序sessionKey就不會(huì)過(guò)期,對(duì)于這個(gè)問(wèn)題的解決辦法我們就要交給前端了,當(dāng)他們調(diào)用后端接口之前是要先用微信提供的一個(gè)方法檢驗(yàn)用戶(hù)的sessionKey是否過(guò)期,如果過(guò)期就需要重新調(diào)取,保證每一次調(diào)接口的sessionKey都是有效的就可以了。這樣微信運(yùn)動(dòng)的解密就完成啦,并且微信的解密是通用的。

總結(jié)

以上是生活随笔為你收集整理的java后台微信小程序微信运动之AES解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。