1.微信官方文档 auth.code2Session | 微信开放文档

2.我们来实现这个登录功能, 直接上完整代码

 controller

<!--  工具类-JSONUtil  -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.13</version>
</dependency>
    /*** 解密用户敏感数据** @param encryptedData 明文,加密数据* @param iv            加密算法的初始向量* @param code          用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key* @return*/@ApiOperation("登录")@GetMapping("/login")public Map decodeUserInfo(String encryptedData, String iv, String code) {Map map = new HashMap();//登录凭证不能为空if (code == null || code.length() == 0) {map.put("status", 0);map.put("msg", "code 不能为空");return map;}//小程序唯一标识   (在微信小程序管理后台获取)String wxspAppid = "xxxxxx";//小程序的 app secret (在微信小程序管理后台获取)String wxspSecret = "xxxxxx";//授权(必填)String grant_type = "authorization_code";// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid//请求参数String params = "appid="+wxspAppid+"&secret="+wxspSecret+"&js_code="+code+"&grant_type="+grant_type;//发送请求String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);//解析相应内容(转换成json对象)JSONObject json = JSONUtil.parseObj(sr);//获取会话密钥(session_key)String session_key = json.get("session_key").toString();//用户的唯一标识(openid)String openid = (String) json.get("openid");// 2、对encryptedData加密数据进行AES解密try {String result = WxAesUtils.decryptData(getURLDecoderString(encryptedData), session_key, getURLDecoderString(iv));if (null != result && result.length() > 0) {map.put("status", 1);map.put("msg", "解密成功");JSONObject userInfoJSON = JSONUtil.parseObj(result);Map userInfo = new HashMap();userInfo.put("openId", userInfoJSON.get("openId"));userInfo.put("nickName", userInfoJSON.get("nickName"));userInfo.put("gender", userInfoJSON.get("gender"));userInfo.put("city", userInfoJSON.get("city"));userInfo.put("province", userInfoJSON.get("province"));userInfo.put("country", userInfoJSON.get("country"));userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));userInfo.put("unionId", userInfoJSON.get("unionId"));map.put("userInfo", userInfo);return map;}} catch (Exception e) {e.printStackTrace();}map.put("status", 0);map.put("msg", "解密失败");return map;}

utils

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;public class HttpRequest {/*** 向指定URL发送GET方法的请求** @param url*            发送请求的URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return URL 所代表远程资源的响应结果*/public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** 向指定 URL 发送POST方法的请求** @param url*            发送请求的 URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return 所代表远程资源的响应结果*/public static String sendPost(String url, String param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}return result;}
}
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.Security;
import java.util.Arrays;/*** 微信通讯加解密类*/
public class WxAesUtils {public static void main(String[] args) {decryptData("bmdheU9pKVKVyJOH8CR3mqp4mEeKZ1YOuMsVxXJKjRdc47rolEoe85JKAVEWmP2hl4NZB66qxN/NHHGsy0PqCn7hS4cLKqTgERXcYO0dURt2JuLg1myhG+PYhi0AROwfJytGBv77u8yinmMfyyKx6lSegkqnlIJ6TBIDYe2LCvW3kRVDzNDeWT0hOaLiRI6n3TFQwI0b5Tiu48UbFTHDhAtJ6LaZY+wg+PdtrHDgjWtt46pinENV22GFt77a6iIhdT4GzaW7ln45HuENtzXJLR5yM7SwT2pxKMGEknJGJD3yf/DxnR6a8HpXrwxtXHJfDlUzNS+Af51fOS/Z52LpbtvRecoEz8KKUxJ9lpcK1HrO/RMw/iYf+ce1bu5VIpYyMjTNAoLdffZ7V0HGMrVJUGbQMqk7ZjdCk1eqMyPpuIOuektgKE7K5wHqeo3NVo7A","6pOQ1+4ca2ATDaSg4gauVA==","zzmYGLoLH548Vf0fdJHHvA==");}public static String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {String data = null;try {data = new String(decryptOfDiyIV(Base64.decodeBase64(encryptDataB64),Base64.decodeBase64(sessionKeyB64),Base64.decodeBase64(ivB64)));} catch (Exception e) {e.printStackTrace();}return data;}private static final String KEY_ALGORITHM = "AES";private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";private static Key key;private static Cipher cipher;private static 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 {// 初始化ciphercipher = Cipher.getInstance(ALGORITHM_STR, "BC");} catch (Exception e) {e.printStackTrace();}}/*** 解密方法** @param encryptedData 要解密的字符串* @param keyBytes      解密密钥* @param ivs           自定义对称解密算法初始向量 iv* @return 解密后的字节数组*/private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {byte[] encryptedText = null;init(keyBytes);try {cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));encryptedText = cipher.doFinal(encryptedData);} catch (Exception e) {e.printStackTrace();}return encryptedText;}
}
    /*** 解码* @param str* @return*/public static String getURLDecoderString(String str) {String result = "";if (null == str) {return "";}try {result = java.net.URLDecoder.decode(str, "GBK");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}

获取到的用户信息:

{"nickName":"木笔","gender":0,"language":"zh_CN","city":"","province":"","country":"","avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKDKIibHfOlhMmLib2tU491TpbTzvjHtw2TL38LM30ao5KRZL0A20PIeyhJ8ZGWMvHUDSabatHhic1PQ/132","watermark":{"timestamp":1652235161,"appid":"wx6db597cba4914b30"}}

{"nickName":"木笔","gender":0,"language":"zh_CN","city":"","province":"","country":"","avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKDKIibHfOlhMmLib2tU491TpbTzvjHtw2TL38LM30ao5KRZL0A20PIeyhJ8ZGWMvHUDSabatHhic1PQ/132","watermark":{"timestamp":1652235161,"appid":"wx6db597cba4914b30"}
}

微信小程序实现用户登录授权java代码相关推荐

  1. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  2. 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程)

    本篇记录说明 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程,详细内容可私信交流) (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷 ...

  3. 小程序登录本地服务器,微信小程序实现用户登录模块服务器搭建

    我选用的是node.js来搭建服务器,没有安装的小伙伴可以参考我的node.js其他博客. 服务器安装与配置 初始化项目,将会自动创建package.json配置文件. npm init -y 安装E ...

  4. 微信小程序获取用户手机号授权方法

    微信小程序获取用户手机号方法 首先在 app.json 页面添加一个新的用户授权页面,放在首页index的后面即可 在 app.js 页面中编写如下代码: 这里包含了获取用户信息的相关代码 //app ...

  5. 微信小程序中用户登录和登录态维护

    微信小程序和以前的web项目不同,他是前后端分离的应用,之前我们的传统登录有web服务器提供Session维护, 后端在返回结果给前端web项目时,带上cookie,且以cookie值为key存储用户 ...

  6. 微信小程序,用户拒绝授权后重新授权;uni-app小程序,用户拒绝授权后点击无效;重新进入后拉起位置授权框;

    问题:当用户第一次进入小程序,点击授权按钮后,点了拒绝,再次点击不会出现授权页面,只有再次进入小程序的时候,才会出发请求授权 . 案例: 假如我们获取微信位置,第一次点击的时候弹起授权,用户点击的拒绝 ...

  7. Python 实现微信小程序的用户登录

    小程序可以通过官方提供的登录能力来获取用户身份的标示,具体文档可以参考 这里,通过流程时序可以看到,对于需要和前端配合的服务端开发,主要实现的就是通过小程序提供的 code 换取用户的 openid ...

  8. 微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

    详细代码请见文档最下方,仅供参考,更多需要请查看官方文档 一. 微信官方文档 | 获取手机号 这是服务端的 这是我们前端获取手机号需要给接口传递的两个参数  注意: 参数一:获取access_toke ...

  9. 微信小程序获取用户信息“授权失败”场景的处理

    很多的时候我们在处理小程序功能的时候需要用户获取用户信息,但是呢为了信息安全,用户不授权导致授权失败场景:但是小程序第二次不在启动授权信息弹层,为了用户体验,可以用以下方式处理: function i ...

最新文章

  1. iOS 秒数转换成时间,时,分,秒
  2. 带你一起学kivy第一天
  3. 计算机内存知识txt,计算机新手必备内存实用知识.docx
  4. 【Python基础】Python正则表达式,从入门到实战,精华都在这里!
  5. php 图片上传预览(转)
  6. android model 设计,Android model层设计
  7. html++标签页+界面,CSS+DIV实现多标签页面。
  8. 整理下STL algorithms(3)
  9. 【kafka】kafka 生态系统 Ecosystem
  10. Python抓取2500份招聘需求,数据显示未来最吃香的岗位是这个
  11. (一)PyQt5基础学习
  12. Lodop设置打印维护返回打印语句代码
  13. 纠错码较副本优势与minio纠错码配置
  14. iOS修改手游服务器数据,iOS 教你修改运动步数(基于Healthkit)
  15. HTML网页设计制作大作业 - 绿色环境保护HTML5网站模板(4个页面)
  16. 这个小众副业,一次200,有人月入3万!
  17. sql面试题——手写sql练习案例(一)
  18. Babel 是什么?· Babel 中文文档
  19. PL/SQL-procedure-function-package创建
  20. php 时间戳 星座,十二个星座的时间划分与性格总括

热门文章

  1. 安兔兔android手机性能排行榜,安兔兔公布10月安卓手机性能排行榜单 第一名是它们...
  2. spring整合mybatis 原理
  3. 关于Navicat 报错1251连接不成功Mysql
  4. bim推荐计算机配置,BIM设计师电脑岂能儿戏?做BIM设计电脑配置推荐
  5. was服务器配置文件路径,按步骤详细说明was(applicationWebSphereserver)服务器对cas证书生成,SSL配置,类加载,数据源配置,.docx...
  6. 制作一个舵机云台【内附资料下载链接】
  7. Revit二次开发相关软件安装资源
  8. Java实现定时发送小情话(邮件)
  9. PPT 图标 文案素材
  10. python线程创建对象_Python使用面向对象方式创建线程实现12306售票系统