java实战之---公众号项目JSSDK初始化及配置

本文讲述了在更新服务后,微信公众号H5遇到签名和验签错误,通过排查发现是由于后台未添加新服务器IP至白名单。作者详细介绍了JSSDK初始化过程,包括获取jsapi_ticket、构建签名等关键步骤。
摘要由CSDN通过智能技术生成

前言

        有个旧项目公众号H5,前期测试没问题都上线了。不过由于更换服务造成了部分功能受限,对于签名和验签都报错。找到问题所在,就是公众号后台白名单没添加最新的服务器IP导致,下面重温下实现微信公众号JSSDK初始化功能

步骤

1. 核心实现代码

public Map initJSSDKConfigInfo(String shareUrl)  {
        //String accessToken = this.getAccessToken();
        try {
            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;
        }catch (Exception e){
            log.info("初始化jssdk",e.getMessage());
        }
        return null;
    }

2. 几个小方法

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();
    }
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;
    }

欢迎点赞、收藏、评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值