千家信息网

微信开发中获取前端jssdk启调参数的方法

发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,这篇文章主要介绍"微信开发中获取前端jssdk启调参数的方法",在日常操作中,相信很多人在微信开发中获取前端jssdk启调参数的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2025年12月04日微信开发中获取前端jssdk启调参数的方法

这篇文章主要介绍"微信开发中获取前端jssdk启调参数的方法",在日常操作中,相信很多人在微信开发中获取前端jssdk启调参数的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"微信开发中获取前端jssdk启调参数的方法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在进行微信开发时,微信开发前端要启调微信jssdk相关服务常常需要使用一些秘密的参数,这些参数暴露在外不是一件好事情,素以需要后端区调取这些jssdk参数,这是我在开发过程中和获取jssdk参数开发相关的code。

一、编辑jssdk参数类

@Getter@Setter@ToStringpublic class JSSDKConfig {    private Boolean debug;    private String appId;    private Long timestamp;    private String nonceStr;    private String signature;    private List jsApiList;}

二、获取jssdk中signature的工具类

参数url是前端起吊当前location.herf(注意:url不能转码)
参数appid......
参数jsapiTicket是微信jsapiticket票据,需要另外获得。

import java.security.MessageDigest;import java.util.*;public class JSSDKSignatureUtil {    /**     * 获取JSSDKConfig对象     *     * @param url     * @param appid     * @param jsapiTicket     * @return     */    public static JSSDKConfig createJSSDKConfig(String url, String appid, String jsapiTicket) {        String noncestr = getRandomStr();        Long timestamp = getTimeStamp();        JSSDKConfig jssdkConfig = new JSSDKConfig();        jssdkConfig.setDebug(false);        jssdkConfig.setAppId(appid);        jssdkConfig.setTimestamp(timestamp);        jssdkConfig.setNonceStr(noncestr);        jssdkConfig.setSignature(createSignature(jsapiTicket, url, noncestr, timestamp));        List jsApiList = new ArrayList<>();        jssdkConfig.setJsApiList(jsApiList);        return jssdkConfig;    }    /**     * 创建SHA1签名     * l     *     * @param jsapiTicket     * @param url     * @return     */    private static String createSignature(String jsapiTicket, String url, String noncestr, Long timestamp) {        SortedMap signParams = new TreeMap();        signParams.put("noncestr", noncestr);        signParams.put("jsapi_ticket", jsapiTicket);        signParams.put("timestamp", timestamp);        signParams.put("url", url);        return createSignature(signParams);    }    /**     * 创建SHA1签名     *     * @param params     * @return SHA1签名     */    private static String createSignature(SortedMap params) {        return sha1Encrypt(sortParams(params));    }    /**     * 根据参数名称对参数进行字典排序     *     * @param params     * @return     */    private static String sortParams(SortedMap params) {        StringBuffer sb = new StringBuffer();        for (String key : params.keySet()) {            sb.append(key).append("=").append(params.get(key)).append("&");        }        return sb.substring(0, sb.lastIndexOf("&"));    }    /**     * 使用SHA1算法对字符串进行加密     *     * @param str     * @return     */    private static String sha1Encrypt(String str) {        if (str == null || str.length() == 0) {            return null;        }        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',                'a', 'b', 'c', 'd', 'e', 'f'};        try {            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");            mdTemp.update(str.getBytes("UTF-8"));            byte[] md = mdTemp.digest();            int j = md.length;            char buf[] = new char[j * 2];            int k = 0;            for (int i = 0; i < j; i++) {                byte byte0 = md[i];                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];                buf[k++] = hexDigits[byte0 & 0xf];            }            return new String(buf);        } catch (Exception e) {            return null;        }    }    /**     * 生成时间戳     *     * @return     */    private static Long getTimeStamp() {        return System.currentTimeMillis() / 1000;    }    /**     * 生成6位随机字符串     *     * @return     */    private static String getRandomStr() {        int length = 6;        String base = "abcdefghijklmnopqrstuvwxyz0123456789";        Random random = new Random();        StringBuffer sb = new StringBuffer();        for (int i = 0; i < length; i++) {            int number = random.nextInt(base.length());            sb.append(base.charAt(number));        }        return sb.toString();    }}

三、获取jsapiTicket票据

jsapiTicket参数不会过期,所以可以放入缓存中 参数包括access_token(该参数隔一段时间刷新,所以要也需要放入缓存) 其中appendParameterToUrl()是将map参数拼接到url后

    public String getJsapiTicket() {        String jsapiTicket = redisService.get("jsapi_ticket");        if (StringUtils.isBlank(jsapiTicket)) {            try {                Map map = new HashMap<>(2);                map.put("access_token", this.getAccessToken());                map.put("type", "jsapi");                String result = restTemplate.getForObject(this.appendParameterToUrl(weiXinConfig.jsapiTicketUrl, map), String.class);                jsapiTicket = JsonUtils.parse(result, new String[]{"ticket"});                Integer expires = JsonUtils.parseInteger(result, new String[]{"expires_in"});                this.saveValueToRedisAndSetexpiresIn("jsapi_ticket", jsapiTicket, expires);            } catch (IOException e) {                e.printStackTrace();                log.error(Arrays.toString(e.getStackTrace()));                throw new RuntimeException("获取jsapi_ticket时的结果,json解析失败");            }        }        return jsapiTicket;    }

appendParameterToUrl():

    /**     * 将map拼接到url后面     *     * @param url     * @param map     * @return     */    private String appendParameterToUrl(String url, Map map) {        StringBuilder sb = new StringBuilder(url);        sb.append("?");        for (Object o : map.keySet()) {            sb.append(o.toString()).append("=").append(map.get(o).toString()).append("&");        }        return sb.toString().substring(0, sb.length() - 1);    }

四、获取access_token参数

通过微信公众平台开发者模式中的,appid和appSecret来获access_token(注意:注意调用时的参数名称)

    public String getAccessToken() {        String accessToken = (String) redisService.get("access_token");        if (StringUtils.isBlank(accessToken)) {            try {                Map map = new HashMap<>(3);                map.put("grant_type", "client_credential");                map.put("appid", weiXinConfig.appid);                map.put("secret", weiXinConfig.appsecret);                String accessTokenResult = restTemplate.getForObject(this.appendParameterToUrl(weiXinConfig.accessTokenUrl, map), String.class);                accessToken = JsonUtils.parse(accessTokenResult, new Object[]{"access_token"});                Integer expiresIn = JsonUtils.parseInteger(accessTokenResult, new Object[]{"expires_in"});                this.saveValueToRedisAndSetexpiresIn("access_token", accessToken, expiresIn);            } catch (IOException e) {                e.printStackTrace();                log.error(Arrays.toString(e.getStackTrace()));                throw new RuntimeException("获取access_token时的结果,json解析失败");            }        }        return accessToken;    }

并给access_token添加缓存,并给key加上过期时间

    /**     * 将value保存起来,并且设置过期时间     *     * @param key     * @param value     * @param expiresIn     */    private void saveValueToRedisAndSetexpiresIn(String key, String value, Integer expiresIn) {        if (StringUtils.isNotBlank(key) && expiresIn != null) {            redisService.set(key, value);            redisService.expire(key, expiresIn);        }    }

五、登录微信公众号进行配置

将后端服务器的IP地址添加报名单。

将前端页面的域名配置到该公众号设置的功能设置中。

到此,关于"微信开发中获取前端jssdk启调参数的方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0