微文吧

公众号

Java版解密微信小程序的encryptedData

- 微文吧 - 阅 124
米小巴,免费电商小程序

小程序登录的流程是,先通过wx.login获取到一个code,用该code去微信服务器上获取session_key,然后再调用wx.getUserInfo获取一个encryptedData和iv,使用session_key和iv可以得到用户的openId,unionId等信息。注意:调用wx.getUserInfo的时候必须设置withCredentials为true。


/**
     * 根据小程序上的code从微信服务器获取用户的信息
     * @param appId 小程序的AppId
     * @param appSecret 小程序的AppSecret
     * @param code 从小程序上获取到的用户的code
     * @return
     */
    public static JSONObject getUserInfo(String appId, String appSecret, String code) {
        StringBuffer sb = new StringBuffer("https://api.weixin.qq.com/sns/jscode2session?appid=");
        sb.append(appId).append("&secret=").append(appSecret).append("&js_code=").append(code);
        sb.append("&grant_type=authorization_code");
        JSONObject jsonObject = HttpUtil.httpsRequest(sb.toString(), "GET", null, null);
        logger.debug("USER_INFO:" + jsonObject.toString());
        return jsonObject;
    }
    
    /**
     * 解密用户敏感数据获取用户信息
     * @param encryptedData 包括敏感数据在内的完整用户信息的加密数据
     * @param sessionKey 数据进行加密签名的密钥
     * @param iv 加密算法的初始向量
     * @return
     */
    public static JSONObject decryptUserInfo(String encryptedData, String sessionKey, String iv){
        logger.info("{e:" + encryptedData + ", s: " + sessionKey + ", i:" + iv + "}");
        try {
            byte[] dataBytes = new BASE64Decoder().decodeBuffer(encryptedData);
            byte[] keyBytes = new BASE64Decoder().decodeBuffer(sessionKey);
            byte[] ivBytes = new BASE64Decoder().decodeBuffer(iv);
            
            //密钥必须是16位的整数倍
            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];
                java.util.Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
                keyBytes = temp;
            }
            
            //用AES解密算法来解密
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec spec = new SecretKeySpec(keyBytes, "AES");
            cipher.init(Cipher.DECRYPT_MODE, spec, new IvParameterSpec(ivBytes));  
            byte[] resultByte = cipher.doFinal(dataBytes);

            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, "UTF-8");
                logger.info(result);
                return JSONUtil.parseObject(result);
            }
        } catch (Exception ex) {
            logger.error("解密失败", ex);
        }
        return null;
    }

微文吧官方微信公众号 :sz_wwb

相关文章!
  • 高级PM教你定制APP通用元件库
    - 阅 29

    视觉设计师有自己的组件来定义视觉规范,前端工程师有系统SDK自带的UIkit调用,而我们产品经理也应该有一套适合自己的元件库来提升画原型的效率。网上有不少文章叫你如何使用Axure的元件库功能,侧重于讲工具使用。

  • 姑娘,吃俺一记按摩棒
    - 阅 33

    早晨上班,公司门口洗车行的大叔迎着阳光正了正眼镜,我突然惊觉,在这个矮胖子的黑背心上方那张圆扁状油脸上,有一种熟悉的气质:这种大腹便便的油光脸,已经是中国男人配不上中国女人强有力的佐证。“肥胖中年男”,恰好是《欢乐颂》原著中

  • 如果公司的创始人没有理想会怎样?
    - 阅 25

    说来说去,创始人没理想最重要的影响就是没有圈定一个功能范围,对内容型的产品,除了功能外还要确定内容的边界。我在以前的文章中说过创业者创业的动机分两种:一种是创始人自己有个很大的理想,创业做的事情就是实现这个理想(如果接受别人的建议

取消

感谢您的支持,我会继续努力的!

扫码打赏,你说多少就多少
我要打赏

打开微信扫一扫,即可进行扫码打赏哦

会员登录
还没有账号立即注册

手机登录

保持登录
返回

您可以选择以下第三方帐号直接登录微文吧,一分钟完成注册