日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

微信小程序登錄接口 偶發(fā)性 解密錯誤

作者:醉九月 更新時間: 2024-03-13 編程語言

起因:打開登錄頁面,第一次點擊登錄 請求后端接口會報解密異常,第二次解密正常,再點還是解密正常

解決方法: 把wxcode 在頁面打開時,加載一次,然后由調(diào)用獲取用戶信息接口,把這個code ,encryptedData ,iv 傳遞給后端,后端請求jscode2session獲得sessionKey,把sessionKey,encryptedData ,iv,傳入微信解密工具類,返回解密數(shù)據(jù),剩下的就正常存儲用戶信息,返回信息就行了

前端代碼

export default {
	data() {
		return {
			wxCode: '',
			encryptedData: '',
			iv: ''
		}
	},
	onLoad() {
		let self = this;
		wx.login({
			success(res) {
				if (res.code) {
					self.wxCode = res.code
				}
			}
		})
	},
	methods: {
		wxLogin() {
			const self = this;
			wx.getUserProfile({
				desc: '用于完善會員資料',
				success: (res) => {
					let param = {
						wxCode: this.wxCode,
						encryptedData: res.encryptedData,
						iv: res.iv,
					};
					let _callback = (res) => {
						console.log(res)
					};
					self.ajax('post', '/weChatLogin', param, _callback, self);
				}
			});
		}
	}
}

后端代碼

   /**
     * 解密
     *
     * @param sessionKey
     * @param encryptedData
     * @param iv
     * @return
     */
    public static String decryptWXAppletInfo(String sessionKey, String encryptedData, String iv) {
        String result = null;
        //被加密的數(shù)據(jù)
        byte[] dataByte = java.util.Base64.getDecoder().decode(encryptedData);
        //加密秘鑰
        byte[] keyByte = java.util.Base64.getDecoder().decode(sessionKey);
        //偏移量
        byte[] ivByte = Base64.getDecoder().decode(iv);
        try {
            //如果密鑰不足16位,那么就補足.  這個if 中的內(nèi)容很重要
            int base = 16;
            if (keyByte.length % base != 0) {
                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                keyByte = temp;
            }
            //初始化
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivByte);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            byte[] doFinal = cipher.doFinal(dataByte);
            result = new String(doFinal);
            return result;
        } catch (Exception e) {
            log.error("解密,獲取微信信息錯誤", e);
        }
        return null;
    }

原文鏈接:https://blog.csdn.net/weixin_44832006/article/details/130905705

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新