获取用户encryptKey | 微信开放文档 (qq.com)

一、需求

前端传值:encryptedData、iv、code

二、解密用户信息

step1:将code发送给微信服务器,获取openid和session_key

step2:根据encryptedData、iv、session_key(会话密钥),通过AES解密获取到用户所有信息

1.实体类:


import lombok.Data;@Data
@AllArgsConstructor
@NoArgsConstructor
//前端传参字段定义
public class EncryBO {private  String code;private  String iv;private  String encryptedData;
}
public interface Constants {String CODE_200 = "200"; //请求成功String CODE_401 = "401";  // 权限不足String CODE_400 = "400";  // 参数错误String CODE_500 = "500"; // 请求失败String DICT_TYPE_ICON = "icon";String FILES_KEY = "FILES_FRONT_ALL";
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Back {private String code;private String msg;private  Object data;public static Back success() {return new Back(Constants.CODE_200, "请求成功", null);}public static Back success(Object data) {return new Back(Constants.CODE_200, "请求成功", data);}public static Back error(String code, String msg) {return new Back(code, msg, null);}public static Back error() {return new Back(Constants.CODE_500, "请求失败", null);}}

2.工具类

import lombok.extern.slf4j.Slf4j;
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 javax.validation.constraints.NotNull;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;
import java.util.Arrays;/*** @ClassName AESUtils* @Description TODO* @Author 独狼Kiss* @Date 2021/9/14 13:46* @Version 1.0**/@Slf4j
public class AESUtils {// 加密模式private static final String ALGORITHM = "AES/CBC/PKCS7Padding";private static final String CHARSET_NAME = "UTF-8";private static final String AES_NAME = "AES";//解决java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Paddingstatic {Security.addProvider(new BouncyCastleProvider());}/*** 解密** @param content 目标密文* @param key     秘钥* @param iv      偏移量* @return*/public static String decrypt(@NotNull String content, @NotNull String key, @NotNull String iv) {String result = "";// 被加密的数据byte[] dataByte = Base64.decodeBase64(content);// 加密秘钥byte[] keyByte = Base64.decodeBase64(key);// 偏移量byte[] ivByte = Base64.decodeBase64(iv);try {// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要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;}if (ivByte.length % base != 0) {int groups = ivByte.length / base+ (ivByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(ivByte, 0, temp, 0, ivByte.length);ivByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {result = new String(resultByte, "UTF-8");}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidParameterSpecException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();}return result;}}

3.接口

@RestController
@RequestMapping("/scancode")
public class ScanController {@Autowiredprivate UserService userService;JSONObject jsonObject;/*** 解密用户信息** @param encrybo* @return* @throws IOException*/@PostMapping("/authority")public Back detail1(@RequestBody EncryBO encrybo) throws IOException {//将appid和secret填上String url = "https://api.weixin.qq.com/sns/jscode2session?appid=appid&secret=secret&js_code=" + encrybo.getCode() + "&grant_type=authorization_code ";OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();Response response = client.newCall(request).execute();if (response.isSuccessful()) {//获取openid,session_key String body = response.body().string();JSONObject jsonObject = JSON.parseObject(body);String openid = jsonObject.getString("openid");String session_key = jsonObject.getString("session_key");//获取encryptedData,iv(前端传值,根据get方法获取)String encryptedData = encrybo.getEncryptedData();String iv = encrybo.getIv();//解密用户信息,decrypt是json格式String decrypt = AESUtils.decrypt(encryptedData, session_key, iv);//将json格式转换为字符串JSONObject jsonObject2 = JSON.parseObject(decrypt);String nickName = jsonObject2.getString("nickName");String gender = jsonObject2.getString("gender");String avatarUrl = jsonObject2.getString("avatarUrl");}return Back.error();}

微信小程序--解密用户信息相关推荐

  1. 微信小程序解密用户信息--java解密

    1.wx.login()方法获取code,通过code换取session_key 2.wx.getUserInfo()方法获取: encryptedData 包括敏感数据在内的完整用户信息的加密数据 ...

  2. usercity 小程序_微信小程序API 用户信息

    微信小程序API 用户信息 wx.getUserInfo(OBJECT) 微信小程序获取用户信息,需要先调用wx.login接口 OBJECT参数说明: success返回参数说明: 示例代码:wx. ...

  3. PHP 微信小程序获取用户信息

    小程序授权应用场景:先拿到用户信息(先wx.login获取code,code换取用户session_key,再wx.getuserInfo获取到用户的encryptedData iv ,再通过调用官方 ...

  4. 微信小程序获取用户信息(含服务端)

    本文获取用户信息方式需要服务端配合,纯前端的可查看 微信小程序获取用户信息(纯前端) 若需获取 openid 和用户信息,可使用 wx.getUserInfo() 获取加密后的信息,传给服务端后解密. ...

  5. 微信小程序 获取用户信息并保存登录状态

    微信小程序 获取用户信息并保存登录状态:http://www.360doc.com/content/18/0124/11/9200790_724662071.shtml 转载于:https://www ...

  6. 微信小程序获取用户信息

    微信小程序获取用户信息 微信小程序获取用户信息接口做了调整: 2021年4月28日24时后发布的小程序新版本,无法通过wx.getUserInfo与获取用户个人信息(头像.昵称.性别与地区),将直接获 ...

  7. 微信小程序获取用户信息-头像、昵称......

    微信小程序获取用户信息-头像.昵称等,并出现弹窗提示授权 目录 微信小程序获取用户信息-头像.昵称等,并出现弹窗提示授权 1.wx.getUserProfile文档 2.代码演示 3.演示过程(图示) ...

  8. 微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ

    微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ 一.获取用户信息 1.首先我们需要了解什么是微信用户的OpenID 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密 ...

  9. 微信小程序获取用户信息流程(2022年版)

     开门见山地说,本文主要讲述微信小程序在2022年以后获取用户信息的主要方法,如果想要了解2022年之前微信小程序获取用户信息的相关知识或者是微信小程序之前这部分的设计思想的话,推荐博主的下面这篇博客 ...

最新文章

  1. Android换肤逻辑
  2. 剑指offer: 不用加减乘除做加法
  3. k8s pod应用升级回滚(set image/rollout)和弹性伸缩(scale)示例
  4. h2 不能访问localhost_个人学习系列 - Spring Boot 整合 H2
  5. masm中常用的伪指令
  6. C# WPF MVVM开发框架Caliburn.Micro常用功能指南②
  7. 使用 Git Extensions 简单入门 Git
  8. 对象交互 空调与摇控器 0107
  9. div默认外边距是多少_CSS 外边距
  10. 95-910-335-源码-FlinkSQL-Calcite-FlinkSQL解析
  11. ORACLE因为字符集不同,进行中文条件查询,查询结果为空
  12. 图像拼图:HTML游戏
  13. 使用layui框架时,select的onchange事件没有生效。
  14. C++写OpenCV图像灰度化
  15. cdr多页面排版_CDR排版跨页图片的制作方法
  16. groovy脚本执行与优化
  17. cuda10.2安装失败方案汇总
  18. W5500 使用总结
  19. 车辆计数系统 python实现
  20. 网络拓扑结构可视化呈现方案

热门文章

  1. spring使用中applicationContext.xml文件头部声明
  2. 用计算机弄音乐,视频剪辑添加音乐,如何在电脑上給视频添加音乐,什么添加音乐软件比较好用...
  3. java中如何将十进制转换为二进制
  4. slite 存储图片
  5. wordpress备份和还原和迁移
  6. Android 设置应用启动动画
  7. 逆向破解之160个CrackMe —— 023-024
  8. 计算机英语领域有哪些构词法,计算机专业英语的构词方法(共2969字).doc
  9. 图表美化设置圆角——《超级处理器》应用
  10. 饥荒联机版专属服务器建立和后续mod更新