微信小程序---授权登录

简介: 微信小程序---授权登录

1、小程序登录授权,前端需要传入的参数:


code==登录授权的


rawData==计算签名使用


encryptedData==包括敏感数据在内的完整用户信息的加密数据


iv == 加密算法的初始向量


signature == 字符串[sha1(rawData+sessionkey)]


2、根据传入的参数进行

String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+appId+"&secret="+secret+"&js_code="+authLoginReq.code+"&grant_type=authorization_code"
RestTemplate restTemplate = new RestTemplate()
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class)
WxUser wx = new WxUser()
if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK){
 
    String sessionData = responseEntity.getBody()
    logger.info("sessionData = "+ sessionData)
    JSONObject jsonObj = JSON.parseObject(sessionData)
    String openId = jsonObj.getString("openid")
    String sessionKey = jsonObj.getString("session_key")
 
    logger.info("openId = "+ openId+"||sessionKey:"+sessionKey)
    String signature = HmacUtil.SHA1(authLoginReq.rawData+sessionKey)
    if(!signature.equals(authLoginReq.signature)){
        logger.info("req signature="+authLoginReq.getSignature()+"||"+" java          signature="+authLoginReq.getSignature())
    }
    byte[] resultByte = null
    Base64Url base64Url = new Base64Url()
    try {
        resultByte = decrypt(base64Url.base64UrlDecode(authLoginReq.encryptedData), base64Url.base64UrlDecode(sessionKey), base64Url.base64UrlDecode(authLoginReq.getIv()))
    } catch (Exception e){
        logger.error("数据异常:"+e)
    }
    if(null != resultByte && resultByte.length > 0){
        String userInfoStr = ""
        try {
            userInfoStr = new String(resultByte, "UTF-8")
        }catch (UnsupportedEncodingException e){
            logger.error(e.getMessage())
        }
        logger.info("userInfo返回 = "+ userInfoStr)
 
        //{"openId":"oH1yH5J3Medgyr44EdPAYcxvrVCI","nickName":"小何&电话й15900844809","gender":1,"language":"zh_CN","city":"Yichun","province":"Jiangxi","country":"China","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKvtG0bAIJaK2ibsttXsFjjMoR5Nf7gCG0mLqpAXGckVjico6tNJ8KaibbN2qm8X9SOz1dLRnqleYPAw/132","watermark":{"timestamp":1543371577,"appid":"wxf964790ef2cc3120"}}
 
        JSONObject userInfoObj = JSON.parseObject(userInfoStr)
        wx.openId= openId
        wx.sex = userInfoObj.getString("gender") as Integer
        wx.nickname = userInfoObj.getString("nickName")
        wx.city = userInfoObj.getString("city")
        wx.province = userInfoObj.getString("province")
        wx.country = userInfoObj.getString("country")
        wx.headImgUrl = userInfoObj.getString("avatarUrl")

算法:

/**
 * 小程序解密方法
 * @param content
 * @param keyByte
 * @param ivByte
 * @return
 * @throws InvalidAlgorithmParameterException
 */
private 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;
}

算法:

class HmacUtil {
 
    public static boolean initialized = false
 
    public static String SHA1(String str){
        try {
            //指定sha1算法
            MessageDigest digest = MessageDigest.getInstance("SHA-1")
            digest.update(str.getBytes())
            //获取字节数组
            byte[] messageDigest = digest.digest()
            // Create Hex String
            StringBuffer hexString = new StringBuffer()
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF)
                if (shaHex.length() < 2) {
                    hexString.append(0)
                }
                hexString.append(shaHex)
            }
            return hexString.toString().toLowerCase()
 
        } catch (NoSuchAlgorithmException e) {
            return ""
        }
    }
}
目录
相关文章
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
3980 12
|
小程序 前端开发 算法
|
移动开发 前端开发 Android开发
开发指南059-App实现微信扫描登录
App是用uniapp开发的,打包为apk,上传到安卓平板中使用
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
443 0
在线课堂+工具组件小程序uniapp移动端源码
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
846 0
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
487 1
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
4937 3
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
883 0
微信小程序更新提醒uniapp
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
593 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序