1. 程式人生 > >微信的jssdk的config介面注入許可權驗證配置--signature的生成

微信的jssdk的config介面注入許可權驗證配置--signature的生成

生成signature有一下幾步:
1、通過 appid + appsecert 獲取公眾號的 access_token
2、根據1的access_token來獲取jsapi_token
3、隨便弄一個字串(長度不太清楚,16位及以內應該都可以)作為nonceStr、
4、生成當前的時間戳(timestamp)
5、使用jssdk的網頁url
6、將這幾個引數按字典序排列,使用SHA-1生成signnature,在wx.config中配置即可


具體如下:
1.訪問 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
,拿到返回值,其中有access-token
其中 grant_type不用改,將 appid和secret修改成自己的就可以了。
訪問網路路徑,那返回引數,我使用的工具類如下【自行修改一下】:
    /**
     * 向指定url,傳送get方式的請求
     */
    public static String sendGet(String url, String param){
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            //開啟和url之間的連線
            URLConnection connection = realUrl.openConnection();
            //設定通用引數
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            //建立實際連線
            connection.connect();
            //獲取所有響應頭欄位
            Map<String, List<String>> map = connection.getHeaderFields();
            for(String key : map.keySet()){
                System.out.println(key+"----"+map.get(key));
            }
            
            // 定義 BufferedReader輸入流來讀取URL的響應
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            
            String line;
            while((line = in.readLine()) != null){
                result += line;
            }
            
        } catch (Exception e) {
            System.out.println("傳送GET請求出現異常");
            e.printStackTrace();
        } finally{
            try {
                if(in != null){
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

2.使用access-token獲取ticket   

-將acess_token替換即可,使用上面的方法獲取返回值 ticket

3.生成signature

public String getSignature(String jsapiTicket,String rand,String timestamp,String url){
//字串的變數順序不能變,然後rand是隨機字串,timestamp=System.currentTimeMillis()/1000
String string1 = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + rand + "&timestamp=" + timestamp + "&url=" + url; System.out.println(string1); return encrypt(string1); } /** * 加密 * @param strSrc * @return */ private String encrypt(String strSrc) { MessageDigest md = null; String strDes = null; byte[] bt = strSrc.getBytes(); try { //////////////使用SHA-1的方式進行加密//////////// md = MessageDigest.getInstance("SHA-1"); //獲取加密方式 md.update(bt);//加密 strDes = bytes2Hex(md.digest()); //返回16進位制字串 //////////////加密過程///////// } catch (NoSuchAlgorithmException e) { System.out.println("Invalid algorithm."); return null; } return strDes; } /** * 對加密後的位元組陣列進行轉換 * @param bts * @return */ public String bytes2Hex(byte[] bts) { String des = ""; String tmp = null; for (int i = 0; i < bts.length; i++) { tmp = (Integer.toHexString(bts[i] & 0xFF)); if (tmp.length() == 1) { des += "0"; } des += tmp; } return des; } 4.將對應的值填入即可

wx.config({

debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。 appId: '', // 必填,公眾號的唯一標識

timestamp: , // 必填,生成簽名的時間戳

nonceStr: '', // 必填,生成簽名的隨機串

signature: '',// 必填,簽名,見附錄1

jsApiList: [] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2});