springboot获取微信JSDK签名信息的实现示例

 更新时间:2023年11月27日 14:43:30   作者:sccd2009  
本文介绍了如何在Spring Boot应用中获取微信JSDK的签名信息,包括获取接口URL、参数设置、签名算法和获取签名结果的步骤,具有一定的参考价值,感兴趣的可以了解一下

目标

现实项目的需要,需要获取微信jssdk签名信息

步骤

1.  初始化配置信息

public Map initJSSDKConfigInfo(String shareUrl) throws Exception {
        //String accessToken = this.getAccessToken();
        String jsapiTicket = this.getJsApiTicket();
        String timestamp = Long.toString(System.currentTimeMillis() / 1000);
        String nonceStr = UUID.randomUUID().toString();
        String signature = this.buildJSSDKSignature(jsapiTicket,timestamp,nonceStr,shareUrl);

        Map<String,String> map = new HashMap<String,String>();
        map.put("shareUrl", shareUrl);
        map.put("jsapi_ticket", jsapiTicket);
        map.put("nonceStr", nonceStr);
        map.put("timestamp", timestamp);
        map.put("signature", signature);
        map.put("appid", WeChatConfig.appId);
        return map;
    }

2. ticket信息获取

private String getJsApiTicket() {
        String jsApiTicket =redisCache.getCacheObject(JS_API_TICKET);
        if (!StrUtil.isNotEmpty(jsApiTicket)){
            //获取全局的access_token,唯一票据
            String accessToken = redisCache.getCacheObject(ACCESS_TOKEN_KEY);
            //log.info("getJsApiTicket"+accessToken);
            if (StringUtils.isNotBlank(accessToken)) {
                //获取jsapi_ticket
                String url = WeChatConfig.getTicketUrl+"access_token="+accessToken+"&type=jsapi";
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                //请求
                RestTemplate restTemplate = new RestTemplate();
                HttpEntity<String> request = new HttpEntity<>(headers);
                ResponseEntity<String> responseString = restTemplate.postForEntity(url, request, String.class);
                JSONObject json = JSONObject.parseObject(responseString.getBody());
                jsApiTicket = json.getString("ticket");
                redisCache.setCacheObject(JS_API_TICKET, jsApiTicket, 115, TimeUnit.MINUTES);
            }else {
                //access为空打印
                log.info("accessToken","重新获取");
                this.creatAccessToken();
                accessToken = redisCache.getCacheObject(ACCESS_TOKEN_KEY);
                String url = WeChatConfig.getTicketUrl+"access_token="+accessToken+"&type=jsapi";
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                //请求
                RestTemplate restTemplate = new RestTemplate();
                HttpEntity<String> request = new HttpEntity<>(headers);
                ResponseEntity<String> responseString = restTemplate.postForEntity(url, request, String.class);
                JSONObject json = JSONObject.parseObject(responseString.getBody());
                jsApiTicket = json.getString("ticket");
                redisCache.setCacheObject(JS_API_TICKET, jsApiTicket, 115, TimeUnit.MINUTES);

            }
        }
        log.info("getJsApiTicket jsApiTicket: {}", jsApiTicket);
        return jsApiTicket.trim();
    }

3. 信息处理封装

public static String buildJSSDKSignature(String ticket,String timestamp,String nonceStr ,String url) throws Exception {

        String orderedString = "jsapi_ticket=" + ticket
                + "&noncestr=" + nonceStr + "&timestamp=" + timestamp
                + "&url=" + url;
        return sha1(orderedString);
    }
    public static String sha1(String orderedString) throws Exception {
        String ciphertext = null;
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] digest = md.digest(orderedString.getBytes());
        ciphertext = byteToStr(digest);
        return ciphertext.toLowerCase();
    }
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];

        String s = new String(tempArr);
        return s;
    }

到此这篇关于springboot获取微信JSDK签名信息的实现示例的文章就介绍到这了,更多相关springboot获取微信JSDK签名信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA导出WAR包详细过程

    IntelliJ IDEA导出WAR包详细过程

    这篇文章主要介绍了IntelliJ IDEA导出WAR包全指南,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2026-01-01
  • SpringCloud Nacos服务分级存储模型详解

    SpringCloud Nacos服务分级存储模型详解

    Nacos服务分级存储模型是Nacos存储服务注册信息和配置信息的核心模型之一,本文将对 Nacos 服务分级存储模型进行深入解析,感兴趣的朋友一起看看吧
    2024-02-02
  • java实现简易聊天功能

    java实现简易聊天功能

    这篇文章主要为大家详细介绍了java实现简易聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 浅谈Java对象禁止使用基本类型

    浅谈Java对象禁止使用基本类型

    本文主要介绍了浅谈Java对象禁止使用基本类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Activiti常用类简介

    Activiti常用类简介

    这篇文章主要介绍了Activiti常用类,需要的朋友可以参考下
    2014-08-08
  • Java中使用JavaMail多发邮件及邮件的验证和附件实现

    Java中使用JavaMail多发邮件及邮件的验证和附件实现

    这篇文章主要介绍了Java中使用Java Mail多发邮件及邮件的验证和附件实现,包括在邮件中加入图片等功能的实现讲解,需要的朋友可以参考下
    2016-02-02
  • spring AOP自定义注解方式实现日志管理的实例讲解

    spring AOP自定义注解方式实现日志管理的实例讲解

    下面小编就为大家分享一篇spring AOP自定义注解方式实现日志管理的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • java中文转全拼工具类分享

    java中文转全拼工具类分享

    这篇文章主要介绍了一个JAVA将汉字转换为全拼的工具类,大参考使用吧
    2014-01-01
  • springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    这篇文章主要介绍了springboot + rabbitmq 如何实现消息确认机制,本文给大家分享小编实际开发中的一点踩坑经验,内容简单易懂,需要的朋友可以参考下
    2020-07-07
  • Java中怎样使用JSON进行文件解析

    Java中怎样使用JSON进行文件解析

    这篇文章主要介绍了Java中怎样使用JSON进行文件解析问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论