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

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

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 ""
        }
    }
}
目录
打赏
0
0
0
0
3
分享
相关文章
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
1587 12
开发指南059-App实现微信扫描登录
App是用uniapp开发的,打包为apk,上传到安卓平板中使用
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
1368 11
技术小白如何利用DeepSeek半小时开发微信小程序?
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
2033 7
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
1408 1
微信小程序的开发完整流程是什么?
微信小程序的开发完整流程是什么?
1458 7
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
1242 11

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等