springboot项目实战之获取微信JSDK签名信息

本文介绍了在项目中如何获取微信JSSDK的签名信息,包括初始化配置、获取jsapi_ticket、处理nonceStr、timestamp和URL以构建签名的过程,以及使用Redis缓存和RESTfulAPI进行数据交互的实现。

目标

现实项目的需要,需要获取微信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;
    }

欢迎点赞,转发,留言,批评

所给参考引用中未提及企业微信jsdk的ww.shareWechatMessage在鸿蒙5.0系统下自定义转发到微信的相关内容。不过,一般来说,要使用企业微信jsdk的ww.shareWechatMessage实现自定义转发到微信,可参考以下通用步骤: 首先,要确保已经正确引入并初始化企业微信jsdk。通常需要在页面中引入jsdk的脚本文件,然后通过企业微信提供的接口获取签名等配置信息进行初始化。示例代码如下: ```html <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script> wx.config({ beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,企业微信的corpId timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见 附录-JS-SDK使用权限签名算法 jsApiList: ['ww.shareWechatMessage'] // 必填,需要使用的JS接口列表 }); </script> ``` 接着,在初始化成功后,可以调用ww.shareWechatMessage方法进行自定义转发。示例代码如下: ```javascript wx.ready(function () { wx.invoke('ww.shareWechatMessage', { "title": "自定义标题", "desc": "自定义描述", "link": "自定义链接", "imgUrl": "自定义图片链接", "type": "", // 分享类型,music、video或link,不填默认为link "dataUrl": "", // 如果type是music或video,则要提供数据链接,默认为空 "success": function (res) { // 分享成功的回调 }, "fail": function (res) { // 分享失败的回调 }, "complete": function (res) { // 分享完成的回调 } }); }); ``` 针对鸿蒙5.0系统,可能还需要注意系统的网络权限、应用权限等配置,确保企业微信应用有足够的权限进行分享操作。同时,由于鸿蒙系统的特殊性,可能需要对不同版本的企业微信客户端进行兼容性测试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值