摘要:來自微信小程序聯盟如果大家使用小程序的同時還在使用公眾號的話,可能會用到這種功能,由于公司業務需要,我們需要使用,具體使用方法,請參考微信開放平臺的說明,但是在微信小程序的文檔中只給出了部分語言實現的源碼,竟然沒有的,小程序的開發人員是有多
來自:微信小程序聯盟
如果大家使用小程序的同時還在使用公眾號的話,可能會用到unionId這種功能,由于公司業務需要,我們需要使用unionId,具體使用方法,請參考微信開放平臺的說明,但是在微信小程序的文檔中只給出了部分語言實現的源碼,竟然沒有java的,小程序的開發人員是有多么懶。難道大家都不用java寫后臺???
什么鬼,然后開始了各種AES踩坑之路,其實參考了很多的網上的教程,再次不能一一列出來給大家了,(因為我寫這篇文章的時候,已經是解決問題一周以后了),也收到管理員的很多幫助,再次寫個帖子回饋大家吧,在此只列出unionId的解密方式,如果有什么問題,聯系我或者回帖都可以。
另外稍加吐槽一下,
https 不要用startcom提供的免費證書!
https 不要用startcom提供的免費證書!
https 不要用startcom提供的免費證書!
重要的事情說三遍!!!!
AES.java
import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.*; public class AES { public static boolean initialized = false; /** * AES解密 * @param content 密文 * @return * @throws InvalidAlgorithmParameterException * @throws NoSuchProviderException */ public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException { initialize(); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); Key sKeySpec = new SecretKeySpec(keyByte, "AES"); cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化 byte[] result = cipher.doFinal(content); return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void initialize(){ if (initialized) return; Security.addProvider(new BouncyCastleProvider()); initialized = true; } //生成iv public static AlgorithmParameters generateIV(byte[] iv) throws Exception{ AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); params.init(new IvParameterSpec(iv)); return params; } }
WxPKCS7Encoder.java
import java.nio.charset.Charset; import java.util.Arrays; /** * Created by Kevin Dong on 2017/1/5. */ public class WxPKCS7Encoder { private static final Charset CHARSET = Charset.forName("utf-8"); private static final int BLOCK_SIZE = 32; /** * 獲得對明文進行補位填充的字節. * * @param count 需要進行填充補位操作的明文字節個數 * @return 補齊用的字節數組 */ public static byte[] encode(int count) { // 計算需要填充的位數 int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); if (amountToPad == 0) { amountToPad = BLOCK_SIZE; } // 獲得補位所用的字符 char padChr = chr(amountToPad); String tmp = new String(); for (int index = 0; index < amountToPad; index++) { tmp += padChr; } return tmp.getBytes(CHARSET); } /** * 刪除解密后明文的補位字符 * * @param decrypted 解密后的明文 * @return 刪除補位字符后的明文 */ public static byte[] decode(byte[] decrypted) { int pad = decrypted[decrypted.length - 1]; if (pad < 1 || pad > 32) { pad = 0; } return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); } /** * 將數字轉化成ASCII碼對應的字符,用于對明文進行補碼 * * @param a 需要轉化的數字 * @return 轉化得到的字符 */ public static char chr(int a) { byte target = (byte) (a & 0xFF); return (char) target; } }
調用方法解密如下:
WechatOpenIdRes wechatInfo = getWehatInfoByCode(code); if(wechatInfo != null && wechatInfo.isOk()){ boolean isNew = true; try { AES aes = new AES(); byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(wechatInfo.getSession_key()), Base64.decodeBase64(iv)); if(null != resultByte && resultByte.length > 0){ String userInfo = new String(WxPKCS7Encoder.decode(resultByte)); WxInfo wxInfo = GsonUtil.fromGson(userInfo, WxInfo.class); if(wxInfo != null) { logger.debug("xxxxxunionid===="+wxInfo.getUnionId()); } } } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
編譯環境為java1.8
另外我引入的support 包為
bcprov-jdk16-139.jar 此包已上傳附件,
順帶附上我試用的小程序js中的代碼吧,
var code =""; wechat.login() .then(function(res){ code = res.code; }) .then(function(){ return wechat.getUserInfo(); }) .then(function(res){ var encryptedData = res.encryptedData var iv = res.iv; return userservice.getUserToken(code,encryptedData,iv); })
上面的代碼使用了promise,其中最后一句userservice.getUserToken為請求服務器的方法,參數為獲取到的code+加密內容+初始化向量
有什么問題可以聯系我。
qq:403125094
源碼下載地址:http://www.wxapp-union.com/po...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81295.html
摘要:來自微信小程序聯盟如果大家使用小程序的同時還在使用公眾號的話,可能會用到這種功能,由于公司業務需要,我們需要使用,具體使用方法,請參考微信開放平臺的說明,但是在微信小程序的文檔中只給出了部分語言實現的源碼,竟然沒有的,小程序的開發人員是有多 來自:微信小程序聯盟 如果大家使用小程序的同時還在使用公眾號的話,可能會用到unionId這種功能,由于公司業務需要,我們需要使用unionId,...
摘要:小程序登錄微信網頁授權版首先呢,登錄授權授權登錄,是一樣的意思,不用糾結。寫小程序授權登錄的代碼前,需要了解清楚與的區別,這里再簡單介紹一下騰訊有個微信開放平臺,只有企業才能注冊賬號,可理解為微信體系里,最頂級的賬號。 小程序登錄、微信網頁授權(Java版) 首先呢,登錄、授權、授權登錄,是一樣的意思,不用糾結。 寫小程序授權登錄的代碼前,需要了解清楚openid與unionid的區別...
摘要:注沒有在微信開放平臺做開發者資質認證的就不要浪費時間了,沒認證無法獲取,認證費用元年,微信授權登錄流程第一步獲取用戶臨時登錄憑證第二步獲取加密過的數據和解密參數第三步把步驟一二中的傳到開發者自己服務端第三步服務端獲取到之后用方法請求如下微信 注:沒有在微信開放平臺做開發者資質認證的就不要浪費時間了,沒認證無法獲取unionId,認證費用300元/年,emmmm.... 微信授權登錄流程...
摘要:文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號好好學,獲取優質學習資源。一登錄流程圖二小程序客戶端獲取用戶信息非必填默認為請求服務端的登錄接口臨時登錄憑證用戶非敏感信息簽名用戶敏感信息解密算法的向量調用服務端登錄接口 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。 一、登錄流程圖 showImg(htt...
閱讀 2418·2021-10-11 10:57
閱讀 1274·2021-10-09 09:59
閱讀 1986·2019-08-30 15:53
閱讀 3206·2019-08-30 15:53
閱讀 1000·2019-08-30 15:45
閱讀 727·2019-08-30 15:44
閱讀 3432·2019-08-30 14:24
閱讀 946·2019-08-30 14:21