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

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

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 ""
        }
    }
}
目录
相关文章
|
2月前
|
存储 小程序 JavaScript
|
2月前
|
开发工具 Android开发
|
2月前
|
小程序 JavaScript Java
微信小程序的后端开发需要使用什么语言?
【8月更文挑战第22天】微信小程序的后端开发需要使用什么语言?
415 65
|
6天前
|
小程序 前端开发 测试技术
微信小程序的开发完整流程是什么?
微信小程序的开发完整流程是什么?
35 7
ly~
|
17天前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
56 6
|
1天前
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【10月更文挑战第3天】随着移动互联网的发展,微信小程序凭借便捷的用户体验和强大的社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的身份认证与授权机制,包括手机号码验证、微信登录、第三方登录及角色权限控制等方法,并强调了安全性、用户体验和合规性的重要性,帮助开发者更好地理解和应用这一关键技术。
11 5
|
1天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
15 5
|
17天前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
2月前
|
小程序 JavaScript
Taro@3.x+Vue@3.x+TS开发微信小程序,使用轮播图
本文介绍了使用 Taro 和 Vue 创建轮播组件的两种方法:一是通过 `&lt;swiper&gt;` 实现,二是利用 Nut UI 的 `&lt;nut-swiper&gt;` 组件实现。
Taro@3.x+Vue@3.x+TS开发微信小程序,使用轮播图
|
1月前
|
移动开发 小程序 JavaScript
uni-app开发微信小程序
本文详细介绍如何使用 uni-app 开发微信小程序,涵盖需求分析、架构思路及实施方案。主要功能包括用户登录、商品列表展示、商品详情、购物车及订单管理。技术栈采用 uni-app、uView UI 和 RESTful API。文章通过具体示例代码展示了从初始化项目、配置全局样式到实现各页面组件及 API 接口的全过程,并提供了完整的文件结构和配置文件示例。此外,还介绍了微信授权登录及后端接口模拟方法,确保项目的稳定性和安全性。通过本教程,读者可快速掌握使用 uni-app 开发微信小程序的方法。
71 3