广告
返回顶部
首页 > 资讯 > 精选 >微信小程序Java登录流程怎么实现
  • 119
分享到

微信小程序Java登录流程怎么实现

2023-06-26 08:06:45 119人浏览 独家记忆
摘要

这篇“微信小程序Java登录流程怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序Java登录流程怎么实现”文

这篇“微信小程序Java登录流程怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序Java登录流程怎么实现”文章吧。

小程序客户端

doLogin:function(callback = () =>{}){let that = this;wx.login({  success:function(loginRes){    if(loginRes){      //获取用户信息      wx.getUserInfo({        withCredentials:true,//非必填  默认为true        success:function(infoRes){          console.log(infoRes,'>>>');          //请求服务端的登录接口          wx.request({            url: api.loginUrl,            data:{              code:loginRes.code,//临时登录凭证              rawData:infoRes.rawData,//用户非敏感信息              signature:infoRes.signature,//签名              encrypteData:infoRes.encryptedData,//用户敏感信息              iv:infoRes.iv//解密算法的向量            },            success:function(res){              console.log('login success');              res = res.data;              if(res.result==0){                that.globalData.userInfo = res.userInfo;                wx.setStorageSync('userInfo',JSON.stringify(res.userInfo));                wx.setStorageSync('loginFlag',res.skey);                console.log("skey="+res.skey);                callback();              }else{                that.showInfo('res.errmsg');              }            },            fail:function(error){              //调用服务端登录接口失败             // that.showInfo('调用接口失败');              console.log(error);            }          });        }      });    }else{     }  }});}复制代码

微信小程序端发起登录请求,携带的参数主要有:

code:loginRes.code,//临时登录凭证    rawData:infoRes.rawData,//用户非敏感信息    signature:infoRes.signature,//签名    encrypteData:infoRes.encryptedData,//用户敏感信息    iv:infoRes.iv//解密算法的向量复制代码

参数解释: code:loginRes.code,//临时登录凭证: 必传 ,通过code来换取后台的 sessionKey和 openId rawData:infoRes.rawData,//用户非敏感信息 signature:infoRes.signature,//签名 encrypteData:infoRes.encryptedData,//用户敏感信息 iv:infoRes.iv//解密算法的向量

signature,//签名、 encryptedData ,//用户敏感信息、 iv //解密算法的向量:

这三个参数是用来解码用户敏感信息的,比如电话号码等信息。

需要的数据主要有: skey ,用于标志用户的唯一性。

三、Java后台

    @RequestMapping("/login")    @ApiResponses({            @ApiResponse(code = 404, message = "服务器未找到资源"),            @ApiResponse(code = 200, message = "请求成功"),            @ApiResponse(code = 500, message = "服务器错误"),            @ApiResponse(code = 401, message = "没有访问权限"),            @ApiResponse(code = 403, message = "服务器拒绝访问"),    })    @ApiOperation(value = "小程序登录", HttpMethod = "POST", notes = "小程序登录")    public ResponseEntity<LoginDataResult> login(            @ApiParam(required = true, value = "临时登录凭证code", name = "code") String code,            @ApiParam(required = true, value = "用户非敏感信息", name = "rawData")            @RequestParam(value = "rawData", required = true) String rawData,            @ApiParam(required = true, value = "签名", name = "signature")            @RequestParam(value = "signature", required = true) String signature,            @ApiParam(required = true, value = "用户敏感信息", name = "encrypteData")            @RequestParam(value = "encrypteData", required = true) String encrypteData,            @ApiParam(required = true, value = "解密算法的向量", name = "iv")            @RequestParam(value = "iv", required = true) String iv    ) {        ObjectMapper mapper = new ObjectMapper();        logger.info("signature============================================================="+signature);        logger.info("encrypteData=========================================================="+encrypteData);        logger.info("iv========================================================================"+iv);        RawData data = null;        WxMajscode2SessionResult session = null;        String openid = null;        String sessionKey = null;        String phoneNumber = null;        try {            if (rawData != null && !"".equals(rawData)) {                //1、获取用户非敏感信息                data = mapper.readValue(rawData, RawData.class);            }            session = this.wxService.getUserService().getSessionInfo(code);            //获取到openid和sessionkey            openid = session.getOpenid();            sessionKey = session.getSessionKey();            logger.info("sessionkey========================================================="+sessionKey);                  } catch (IOException e) {            e.printStackTrace();            logger.info("获取用户信息失败");            LoginDataResult loginDataResult = new LoginDataResult();            loginDataResult.setCode("2");            loginDataResult.setMsg("请求失败");            return ResponseEntity.status(httpstatus.INTERNAL_SERVER_ERROR).body(loginDataResult);        } catch (WxErrorException e) {            e.printStackTrace();            logger.info("获取用户信息失败");        }        //3、向数据库插入用户信息        String skey = insertUser(data, openid, phoneNumber);        //4、缓存openid, sessionKey, skey到redis        RedisCache(openid, sessionKey, skey);        //5、把新的skey返回给小程序        LoginDataResult loginDataResult = new LoginDataResult();        loginDataResult.setSkey(skey);        loginDataResult.setCode("1");        loginDataResult.setMsg("请求成功");        return ResponseEntity.status(HttpStatus.OK).body(loginDataResult);    }        private void redisCache(String openid, String sessionKey, String skey) {        //根据openid查询skey是否存在        String skey_redis = jedisClient.hget("WEXIN_USER_OPENID_SKEY", openid);        if (StringUtils.isNotBlank(skey_redis)) {            //存在 删除 skey 重新生成skey 将skey返回            jedisClient.hdel("WEXIN_USER_OPENID_SKEY", openid);            jedisClient.hdel("WEIXIN_USER_SKEY_OPENID", skey_redis);            jedisClient.hdel("WEIXIN_USER_SKEY_SESSIONKEY", skey_redis);        }        //  缓存一份新的        jedisClient.hset("WEXIN_USER_OPENID_SKEY", openid, skey);        jedisClient.expire("WEXIN_USER_OPENID_SKEY",432000);//设置5天过期        jedisClient.hset("WEIXIN_USER_SKEY_OPENID", skey, openid);        jedisClient.expire("WEIXIN_USER_SKEY_OPENID",432000);//设置5天过期        jedisClient.hset("WEIXIN_USER_SKEY_SESSIONKEY", skey, sessionKey);        jedisClient.expire("WEIXIN_USER_SKEY_SESSIONKEY",432000);//设置5天过期    }        private String insertUser(RawData data, String openid, String phoneNumber) {        //判断用户数据库是否存在,不存在,入库。        Member user = userService.selectUserByOpenid(openid);        //uuid生成唯一key        String skey = UUID.randomUUID().toString();        if (user == null) {            //入库            user = new Member();            user.setId(skey);            user.setCountry(data.getCountry());            user.setCreatedate(new Date());            user.setDf(1);            user.setGender(data.getGender().equals("1") ? 1 : 2);//1为男,2为女            user.setHeadimg(data.getAvatarUrl());            user.setNickname(data.getNickName());            user.setOpenid(openid);            user.setCitycode(data.getCity());            user.setProvincecode(data.getProvince());            user.setMobileno(phoneNumber);            //插入到数据库            userService.insertUser(user);        } else {            //已存在            logger.info("用户openid已存在,不需要插入");            return user.getId();//返回用户唯一标志skey        }        return skey;    }        @ApiOperation(value = "用户手机号获取", httpMethod = "GET", notes = "用户手机号获取")    public String phone(String sessionKey, String signature, String rawData, String encryptedData, String iv) {        String phoneNumber = null;        try {            byte[] bytes = WxMiniappUtils.decrypt(Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv), Base64.decodeBase64(encryptedData));            String phone = new String(bytes, "UTF8");            logger.info("phone====================================="+phone);        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (NoSuchAlGorithmException e) {            e.printStackTrace();        } catch (InvalidAlgorithmParameterException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        return null;    }复制代码

下面对上面代码进行分析:

3.1获取openid和sessionKey
session = this.wxService.getUserService().getSessionInfo(code);//获取到openid和sessionkeyopenid = session.getOpenid();sessionKey = session.getSessionKey();复制代码

这段代码是不是十分的简洁,这里用到了一个 第三方的sdk(weixin-java-tools) ,通过这个sdk可以非常简便的获取到openid和sessionKey,具体的 demo 。

当然,如果你不想用 第三方的sdk ,也可以自己实现,实现代码如下:

public static JSONObject getSessionKeyOrOpenId(String code){    //微信端登录code    String wxCode = code;    String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";    Map<String,String> requestUrlParam = new HashMap<String, String>(  );    requestUrlParam.put( "appid","你的小程序appId" );//小程序appId    requestUrlParam.put( "secret","你的小程序appSecret" );    requestUrlParam.put( "js_code",wxCode );//小程序端返回的code    requestUrlParam.put( "grant_type","authorization_code" );//默认参数     //发送post请求读取调用微信接口获取openid用户唯一标识    JSONObject jsonObject = JSON.parseObject( UrlUtil.sendPost( requestUrl,requestUrlParam ));    return jsonObject;}复制代码
3.2解密用户敏感数据获取用户信息
3.2.1controller

这个部分自己遇到了好多的坑,由于需要获取用户的手机号码,需要解密用户的信息。

    @ApiOperation(value = "用户手机号获取", httpMethod = "GET", notes = "用户手机号获取")    public String phone(String sessionKey, String signature, String rawData, String encryptedData, String iv) {        String phoneNumber = null;        try {            byte[] bytes = WxMiniappUtils.decrypt(Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv), Base64.decodeBase64(encryptedData));            String phone = new String(bytes, "UTF8");            logger.info("phone====================================="+phone);        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (InvalidAlgorithmParameterException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        return null;    }复制代码
3.2.2decrypt工具

这里调用了 WxMiniappUtils.decrypt 这个工具类,工具类如下:

    public static byte[] decrypt(byte[] sessionkey, byte[] iv, byte[] encryptedData)            throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException,            InvalidKeyException, BadPaddingException, IllegalBlockSizeException {        AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");        SecreTKEySpec keySpec = new SecretKeySpec(sessionkey, "AES");        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);        return cipher.doFinal(encryptedData);    }复制代码

这里用到的 Cipher 类是 javax.crypto 的类。

3.2.3问题

但是这里使用这个 decrypt 工具类的时候,遇到了好多的问题。

第一:AES解密是报错javax.crypto.BadPaddingException: pad block corrupted

这个问题是由于,工具类使用了 Cipher.getInstance("AES/CBC/PKCS5Padding") 。

解决:Cipher cipher = Cipher.getInstance("AES/ECB/ZeroBytePadding");。

第二:java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 这个问题是由于,解码出来的iv不是16位,好像是15位,这个为什么我也不太清楚。

解决:这个怎么解决,自己也没有找到方法,如果有大神解决,望告知!

我的解决方法:其实我发现这个问题并不是这个工具类的问题,我折腾了一天发现,这个工具类并不是不能够解码手机号,有的是可以的,有的解析不到手机号,只有普通的信息,所以我觉得,这个可能是微信用户注册的时候,是不是用手机号注册的,所以会出现有些能够解析,有的不能解析。如果有大神有其他方法,望告知!

3.2.4解析成功数据
{"phoneNumber":"13880684012","purePhoneNumber":"13880684012","countryCode":"86","watermark":{"timestamp":1519460296,"appid":"wx6ede2086ee29a89f"}}复制代码

如果解析到了这样的json数据,说明是成功了的。

3.2.5 另外一种方案
public class AES {    public static final AES instance = new AES();    public static boolean initialized = false;        public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {        initialize();        try {            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");            Key sKeySpec = new SecretKeySpec(keyByte, "AES");            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化            byte[] result = cipher.doFinal(content);            return result;        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        } catch (NoSuchProviderException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    public static void initialize(){        if (initialized) return;        Security.addProvider(new BouncyCastleProvider());        initialized = true;    }    //生成iv    public static AlgorithmParameters generateIV(byte[] iv) throws Exception{        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");        params.init(new IvParameterSpec(iv));        return params;    }}复制代码
3.2.6第三方sdk方法
WxMaPhoneNumberInfo phoneNoInfo = this.wxService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);        phoneNumber = phoneNoInfo.getPurePhoneNumber();复制代码

以上就是关于“微信小程序Java登录流程怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 微信小程序Java登录流程怎么实现

本文链接: https://www.lsjlt.com/news/308358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 微信小程序Java登录流程怎么实现
    这篇“微信小程序Java登录流程怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序Java登录流程怎么实现”文...
    99+
    2023-06-26
  • 微信小程序的登录流程
    一、背景 传统的web开发实现登陆功能,一般的做法是输入账号密码、或者输入手机号及短信验证码进行登录。 服务端校验用户信息通过之后,下发一个代表登录态的 token 给客户端,以便进行后续的交互,每当token过期,用户都需要重新登录。 而...
    99+
    2023-09-10
    微信小程序 小程序 微信
  • 微信小程序中怎么实现登录
    今天小编给大家分享一下微信小程序中怎么实现登录的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。业务流程:首先需要一个按钮触发事...
    99+
    2023-07-02
  • 小程序微信登陆实现流程
    1. 微信登录流程 微信登录官方介绍:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.htm...
    99+
    2023-09-05
    小程序 微信 java 微信小程序登录
  • 【微信小程序】实现微信小程序登录(附源码)
    实现微信小程序登录 文章目录 实现微信小程序登录登录功能简介界面展示代码展示 登录功能简介 通过点击登录按钮,调用微信接口wx.getUserProfile拿到微信的个人信息,先检查是...
    99+
    2023-09-07
    微信小程序 小程序 微信 前端
  • 微信小程序实现token登录
    微信小程序实现token登录 微信小程序登录流程 前端先调用wx.login()接口获取code,再把code发个后端 login() { wx.login({ success: (res)...
    99+
    2023-09-07
    微信小程序 小程序 java
  • 微信小程序实现一键登录
    本文实例为大家分享了微信小程序实现手机号登录的具体代码,供大家参考,具体内容如下 项目需求 点击按钮获取用户电话号码绑定到后台,登录。 实现思路 1、使用微信开放功能为获取用户手机...
    99+
    2022-11-13
  • 微信小程序如何实现登录
    这篇文章主要为大家展示了“微信小程序如何实现登录”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何实现登录”这篇文章吧。微信小程序 实现登录最近一段时...
    99+
    2022-10-19
  • 微信小程序实现登录界面
    微信小程序的登录界面实现,供大家参考,具体内容如下 <view class="container"> <view class="wrapper"> ...
    99+
    2022-11-12
  • Spring Boot实现微信小程序登录
    使用Spring Boot完成微信小程序登录 由于微信最近的版本更新,wx.getUserInfo()的这个接口即将失效,将用wx.getUserProfile()替换,所以近期我也...
    99+
    2022-11-12
  • 微信小程序实现登录页面
    本文实例为大家分享了微信小程序实现登录页面的具体代码,供大家参考,具体内容如下 实现在进入微信小程序首页前的登录验证页面,这里有两种方法,但其实原理都是一样的。 1. 在首页中加入一...
    99+
    2022-11-13
  • 微信小程序API怎么实现登录凭证
    这篇文章主要介绍了微信小程序API怎么实现登录凭证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序API怎么实现登录凭证文章都会有所收获,下面我们一起来看看吧。wx.login(OBJECT)调用接口获...
    99+
    2023-06-26
  • 微信小程序怎样实现登录功能
    这篇文章主要介绍了微信小程序怎样实现登录功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。微信小程序登录一. 小程序不支持cookie会话 ...
    99+
    2022-10-19
  • 怎么授权登录微信小程序
    本篇文章为大家展示了怎么授权登录微信小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。授权登录的基本流程上图是微信小程序官网提供的授权登录基本流程图,这里我只从前端开发的角度来讲解一下该流程。通过...
    99+
    2023-06-08
  • 微信小程序详细登录流程(图解+代码流程)
    💂 个人网站: 【紫陌】【笔记分享网】 💅 想寻找共同学习交流、共同成长的伙伴, 请点击【前端学习交流群】 微信小程序的登录和web端的登录有一点是不同的,小程序需要和微信的服务...
    99+
    2023-08-31
    前端 小程序 微信小程序 Powered by 金山文档
  • 微信小程序实现短信登录的实战
    目录1.界面效果预览2.uView安装3.uView配置3.1 main.js中引入3.2 uni.scss中引入3.3 App.vue中引入3.4 pages.json中配置4.短...
    99+
    2022-11-12
  • 微信小程序怎么实现登录会话效果
    这篇文章主要介绍了微信小程序怎么实现登录会话效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序怎么实现登录会话效果文章都会有所收获,下面我们一起来看看吧。背景微信小程序的使用可以快速的基于场景进行用户...
    99+
    2023-06-26
  • 微信小程序开发登录验证怎么实现
    本篇内容主要讲解“微信小程序开发登录验证怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序开发登录验证怎么实现”吧!需求描述:对于部分页面添加登录验证,用户未登录的情况下,进入页面...
    99+
    2023-06-26
  • 微信小程序怎么实现录音
    今天小编给大家分享一下微信小程序怎么实现录音的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为录音录音中wxml:<!-...
    99+
    2023-07-02
  • 微信小程序微信登录的实现方法详解(JAVA后台)
    目录1. 前提2. 开发流程2.1 小程序端2.2 Java后端接口总结官方文档:https://developers.weixin.qq.com/miniprogram/dev/f...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作