微信小程序
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 调用改接口获取 openid session_key unionid(unionid需要满足某些条件才能获取到,使用unionid的话仅使用该接口是不行的) 所以一般登录需要小程序调用调用 wx.login 获取JSCODE wx.getUserInfo 获取encryptedData encryptedData是加密后的用户信息, 包含openid,unionid,nickName,avatarUrl等信息 encryptedData配合session_key解密获取用户信息
java版解密算法(从网上找的,也看不大懂,主要增加了一些判断,使用基本不会出现异常了)
public class DecryptUtil { // 算法名称 final String KEY_ALGORITHM = "AES"; // 加解密算法/模式/填充方式 final String algorithmStr = "AES/CBC/PKCS7Padding"; // private Key key; private Cipher cipher; public void init(byte[] keyBytes) { // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 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()); // 转化成JAVA的密钥格式 key = new SecretKeySpec(keyBytes, KEY_ALGORITHM); try { // 初始化cipher cipher = Cipher.getInstance(algorithmStr); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } } public NutMap decryptToMap(String encryptedDataStr, String keyBytesStr, String ivStr){ if(Strings.isBlank(encryptedDataStr)){ return null; } if(Strings.isBlank(keyBytesStr)){ return null; } if(Strings.isBlank(ivStr)){ return null; } byte[] buffer = decrypt(encryptedDataStr,keyBytesStr,ivStr); if(buffer == null || buffer.length == 0){ return null; } String result = null; try { result = new String(buffer,"UTF-8"); } catch (UnsupportedEncodingException e) { } if(result == null || result.length() == 0){ return null; } return NutMap.WRAP(result); } /** * 解密方法 * @return */ 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) { //e.printStackTrace(); } return encryptedText; } }
引入 weui.wxss 样式
直接在app.wxss里面引用dist/style/widget
下的组件的wxss
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端