呼叫微信分享介面,自定義分享內容(2)-呼叫分享介面(java開發)

呼叫微信分享介面,自定義分享內容(2)-呼叫分享介面(java開發)

   在上一篇文章中我們已經繫結好域名了,接下來最主要的任務就是第三個步驟:通過config介面注入許可權驗證配置

    下圖是微信公眾平臺

     wx.config({

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

      appId: ”, // 必填,公眾號的唯一標識

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

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

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

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

});

  這幾個值主要就是生成簽名複雜一點,其他的引數都好取,我們主要講解如何獲取簽名(示例中獲取的 AccessToken並沒有進行快取):

   底層dao方法:

   //獲取簽名需要用到的一系列方法
//獲取AccessToken
public static String getAccessToken() {  // runBatch(){
   String access_token = “”;  
   String grant_type = “client_credential”;//獲取access_token填寫client_credential   
   //這個url連結地址和引數皆不能變  
   String url = “https://api.weixin.qq.com/cgi-bin/token?grant_type=” grant_type “&appid=” Constants.APP_ID “&secret=” Constants.APPSECRET;  
      
   try {  
       URL urlGet = new URL(url);  
       HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
       http.setRequestMethod(“GET”); // 必須是get方式請求  
       http.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded”);  
       http.setDoOutput(true);  
       http.setDoInput(true);  
       System.setProperty(“sun.net.client.defaultConnectTimeout”, “30000”);// 連線超時30秒  
       System.setProperty(“sun.net.client.defaultReadTimeout”, “30000”); // 讀取超時30秒  
       http.connect();  
       InputStream is = http.getInputStream();  
       int size = is.available();  
       byte[] jsonBytes = new byte[size];  
       is.read(jsonBytes);  
       String message = new String(jsonBytes, “UTF-8”);  
       JSONObject demoJson = JSONObject.fromObject(message);  
       System.out.println(“JSON字串:” demoJson);  
       access_token = demoJson.getString(“access_token”);  
       
   } catch (Exception e) {  
           e.printStackTrace();  
   }  
   return access_token;  
}  

//獲取Ticket
public static String getTicket(String access_token) {  
   String ticket = null;  
   String url = “https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=” access_token “&type=jsapi”;//這個url連結和引數不能變  
   try {  
       URL urlGet = new URL(url);  
       HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
       http.setRequestMethod(“GET”); // 必須是get方式請求  
       http.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded”);  
       http.setDoOutput(true);  
       http.setDoInput(true);  
       System.setProperty(“sun.net.client.defaultConnectTimeout”, “30000”);// 連線超時30秒  
       System.setProperty(“sun.net.client.defaultReadTimeout”, “30000”); // 讀取超時30秒  
       http.connect();  
       InputStream is = http.getInputStream();  
       int size = is.available();  
       byte[] jsonBytes = new byte[size];  
       is.read(jsonBytes);  
       String message = new String(jsonBytes, “UTF-8”);  
       JSONObject demoJson = JSONObject.fromObject(message);  
       System.out.println(“JSON字串:” demoJson);  
       ticket = demoJson.getString(“ticket”);  
       is.close();  
   } catch (Exception e) {  
           e.printStackTrace();  
   }  
   return ticket;  
}  

//拿到了jsapi_ticket之後就要引數名排序和拼接字串,並加密了。以下為sha1的加密演算法
public static String SHA1(String decript) {  
   try {  
       MessageDigest digest = java.security.MessageDigest.getInstance(“SHA-1”);  
       digest.update(decript.getBytes());  
       byte messageDigest[] = digest.digest();  
       // Create Hex String  
       StringBuffer hexString = new StringBuffer();  
       // 位元組陣列轉換為 十六進位制 數  
           for (int i = 0; i < messageDigest.length; i ) {  
               String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);  
               if (shaHex.length() < 2) {  
                   hexString.append(0);  
               }  
               hexString.append(shaHex);  
           }  
           return hexString.toString();  
  
       } catch (NoSuchAlgorithmException e) {  
           e.printStackTrace();  
       }  
       return “”;  
}  

//獲取簽名
public  static String getQianMing(String accessToken,String jsapi_ticket,String noncestr,String timestamp,String url){
String str= “jsapi_ticket=” jsapi_ticket “&noncestr=” noncestr “&timestamp=” timestamp “&url=” url;  
   System.out.println(“str” str); 
   //6、將字串進行sha1加密  
   String signature =SHA1(str);  
   System.out.println(“引數:” str “\n簽名:” signature);  
return signature;
}

control層寫的方法:

// 呼叫微信介面 需要用到的配置引數 
@SuppressWarnings({ “rawtypes”, “unchecked” })
@RequestMapping(“pageConfig.jspx”)
public void pageConfig(String url, HttpServletRequest request,
HttpServletResponse response, ModelMap model) {
Map map = new HashMap();
String appId=Constants.APP_ID;
String accessToken=WeixinUtil.getAccessToken();           //access_token
String jsapi_ticket=WeixinUtil.getTicket(accessToken);    //jsapi_ticket
   String noncestr = UUID.randomUUID().toString().replace(“-“, “”).substring(0, 16);  //隨機字串  
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);  //時間戳  
String signature=WeixinUtil.getQianMing(accessToken, jsapi_ticket, noncestr, timestamp, url); //生成簽名
try {
    map.put(“appId”, appId);
    map.put(“timestamp”, timestamp);
    map.put(“nonceStr”, noncestr);
    map.put(“signature”, signature);
map.put(“success”, Boolean.valueOf(true));
map.put(“message”, “正確”);

} catch (Exception e) {
e.printStackTrace();
map.put(“message”, “錯誤”);
}
ResponseUtils.renderJson(response, StrUtils.toJsonStr(map));
}

html頁面上呼叫的部分關鍵程式碼:

  

分享到朋友圈方法要注意兩點:

 link中的redirect_uri中的值必須進行轉義,類似:&  //都是不認的,必須進行轉義才能用;還有一點,連結中帶的引數只能有一個,有兩個以上的話轉發之後也會丟失的,只會攜帶一個引數,建議需要用多個引數的話,可以把值拼串,用到的時候在分解。

後臺方法都寫好以後,我們就開始進行測試了,要呼叫微信分享介面的連結必須是用域名進行訪問,微信客戶端訪問的時候會彈出提示資訊的,如果看到 config:ok 的提示的時候,說明配置已經成功了,分享到朋友圈也就成功了一大半,點選分享到朋友圈介面,看一下分享的內容是不是自定義的方法。