91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信開發中獲取前端jssdk啟調參數的方法

發布時間:2021-06-25 13:45:19 來源:億速云 閱讀:151 作者:chen 欄目:大數據

這篇文章主要介紹“微信開發中獲取前端jssdk啟調參數的方法”,在日常操作中,相信很多人在微信開發中獲取前端jssdk啟調參數的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”微信開發中獲取前端jssdk啟調參數的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在進行微信開發時,微信開發前端要啟調微信jssdk相關服務常常需要使用一些秘密的參數,這些參數暴露在外不是一件好事情,素以需要后端區調取這些jssdk參數,這是我在開發過程中和獲取jssdk參數開發相關的code。

一、編輯jssdk參數類

@Getter
@Setter
@ToString
public class JSSDKConfig {
    private Boolean debug;
    private String appId;
    private Long timestamp;
    private String nonceStr;
    private String signature;
    private List<String> 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<String> 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<String, Object> signParams = new TreeMap<String, Object>();
        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<String, Object> params) {
        return sha1Encrypt(sortParams(params));
    }

    /**
     * 根據參數名稱對參數進行字典排序
     *
     * @param params
     * @return
     */
    private static String sortParams(SortedMap<String, Object> 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<String, String> 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<String, String> 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);
        }
    }

五、登錄微信公眾號進行配置

微信開發中獲取前端jssdk啟調參數的方法

將后端服務器的IP地址添加報名單。

微信開發中獲取前端jssdk啟調參數的方法

將前端頁面的域名配置到該公眾號設置的功能設置中。

到此,關于“微信開發中獲取前端jssdk啟調參數的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗田县| 枣庄市| 通榆县| 邯郸市| 杨浦区| 英吉沙县| 屯昌县| 津市市| 大丰市| 深州市| 新津县| 长丰县| 布拖县| 定州市| 肇庆市| 萨迦县| 抚远县| 安化县| 大方县| 镇远县| 巴楚县| 曲周县| 道真| 库尔勒市| 合肥市| 迁西县| 弥渡县| 泸定县| 虞城县| 无为县| 同心县| 凭祥市| 奈曼旗| 澄迈县| 南安市| 泾源县| 密山市| 吴旗县| 林口县| 长沙县| 高碑店市|