微信的jssdk的config介面注入許可權驗證配置--signature的生成
阿新 • • 發佈:2019-02-11
生成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;
}
-將acess_token替換即可,使用上面的方法獲取返回值 ticket
//字串的變數順序不能變,然後rand是隨機字串,timestamp=System.currentTimeMillis()/1000
String string1 = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + rand + "×tamp=" + 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.將對應的值填入即可
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
其中 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
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 + "×tamp=" + 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});