1. 程式人生 > >微信轉發帶圖片和描述——JAVA

微信轉發帶圖片和描述——JAVA

  網上看了好多大佬的文章,發現都不太適合我這種小白來操作,so只能結合大部分程式碼來自己操作,搗鼓了2天終於可以實現轉發帶著圖片和描述了,我認為的比較簡單的整個流程是這樣的(哪裡不正確請大佬指教):通過api連接獲得access_token>通過access_token來換取jsapi(ticket)>獲取時間毫秒數/隨即字串/動態獲取的url>把這四個引數放到str中並使用SHA1加密再傳到前臺即可,廢話不多說,開始程式碼(servlet):

獲取token和ticket的類:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


/**
 * 獲取token  獲取ticket
 * @author Administrator
 *
 */
public class JsapiTicketUtil {

public static String sendGet(String url, String charset, int timeout)
    {
      String result = "";
      try
      {
        URL u = new URL(url);
        try
        {
          URLConnection conn = u.openConnection();
          conn.connect();
          conn.setConnectTimeout(timeout);
          BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
          String line="";
          while ((line = in.readLine()) != null)
          {       
            result = result + line;
          }
          in.close();
        } catch (IOException e) {
          return result;
        }
      }
      catch (MalformedURLException e)
      {
        return result;
      }
     
      return result;
    }
   /***
    * 獲取acess_token 
    * @return
    */
   public static String getAccessToken(){
     //獲取token
String acess_token ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你自己的appid";
          String token = sendGet(acess_token, "utf-8", 10000);
          return token;
   }
  /***
    * 獲取jsapiTicket
    */
  public static String getJSApiTicket(){ 
      JsonParser jsonparer = new JsonParser();
      JsonObject json = null;
      JsonObject json2 = null;
      //獲取token
      String acess_token= getAccessToken(); 
      json = jsonparer.parse(acess_token).getAsJsonObject();
      String access_token = json.get("access_token").getAsString();
      
      //獲取JsAPI
      String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";  
      String backData=sendGet(urlStr, "utf-8", 10000);  
      json2 = jsonparer.parse(backData).getAsJsonObject();
      String ticket = json2.get("ticket").getAsString();
      System.out.println(ticket);
      return  ticket;          
  }  
}

獲得隨機字串類:

import java.util.UUID;

/**
 * 獲取隨即字串
 * @author Administrator
 *
 */
public class Create_nonce_str {
public static String create_nonce_str() {
return UUID.randomUUID().toString();
}
}

SHA1加密類

import java.security.MessageDigest;
/**
 * SHA1加密
 * @author Administrator
 *
 */
public class SHA1 {
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',  
             '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  
private static String getFormattedText(byte[] bytes) {  
       int len = bytes.length;  
       StringBuilder buf = new StringBuilder(len * 2);  
       // 把密文轉換成十六進位制的字串形式  
       for (int j = 0; j < len; j++) {  
           buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);  
           buf.append(HEX_DIGITS[bytes[j] & 0x0f]);  
       }  
       return buf.toString();  
   }  
 
   public static String encode(String str) {  
       if (str == null) {  
           return null;  
       }  
       try {  
           MessageDigest messageDigest = MessageDigest.getInstance("SHA1");  
           messageDigest.update(str.getBytes());  
           return getFormattedText(messageDigest.digest());  
       } catch (Exception e) {  
           throw new RuntimeException(e);  
       }  
   }  

}

處理和傳送到前臺的dopost方法

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
String timestamp = Long.toString(System.currentTimeMillis() / 1000);

String nonceStr  =  Create_nonce_str.create_nonce_str();

               //這個url一定要動態獲取,不能寫死

String url="http://"+req.getServerName()+req.getContextPath()+"/";  
System.out.println("當前地址為:"+url);
String jsapi_ticket = JsapiTicketUtil.getJSApiTicket();
System.out.println("時間戳:"+timestamp+"隨即串:"+nonceStr+"ticket:"+jsapi_ticket);
//所有引數必須小寫且有序
String str = "jsapi_ticket=" + jsapi_ticket +
                "&noncestr=" + nonceStr +
                "&timestamp=" + timestamp +
                "&url=" + url;
//sha1加密
        String signature = SHA1.encode(str);
        System.out.println("生成的簽名:"+signature);
        //將三個引數拼接成字串到前臺,再由逗號分割取出
        String data = timestamp+","+nonceStr+","+signature;
        out.print(data);
        out.flush();
        out.close();

}

前臺程式碼(我是寫在body中了):

<script type="text/javascript"
src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">

window.onload=function(){

                //定義全域性變數  接收後臺傳遞的三個引數

var timestamp;
var nonceStr;
var signature;
$.ajax({
type : "POST", 
dataType : "text", 
url : "${ctx}/GainWXServlet.do", 
success : function(data) {
if (data != null) {
var arr=data.split(",");
timestamp = arr[0];
nonceStr = arr[1];
signature = arr[2];
wx.config({
   debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
   appId: '你的id', // 必填,公眾號的唯一標識
   timestamp: timestamp, // 必填,生成簽名的時間戳
   nonceStr: nonceStr, // 必填,生成簽名的隨機串
   signature: signature,// 必填,簽名
   jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS介面列表
});
 wx.checkJsApi({
   jsApiList: ['chooseImage'], // 需要檢測的JS介面列表,所有JS介面列表見附錄2,
   success: function(res) {
   // 以鍵值對的形式返回,可用的api值true,不可用為false
   // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
   }
});
 wx.onMenuShareTimeline({
   title: '分享標題', // 分享標題
   link: '分享連結', // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
   imgUrl: '分享圖示', // 分享圖示
   success: function () {
   // 使用者點選了分享後執行的回撥函式
}});
wx.onMenuShareAppMessage({
title: '', // 分享標題
desc: '', // 分享描述
link: 'http://fifa.dlscanyin.com/', // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
imgUrl: 'http://fifa.dlscanyin.com/images/logo.jpg', // 分享圖示
type: '', // 分享型別,music、video或link,不填預設為link
dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空
success: function () {
// 使用者點選了分享後執行的回撥函式
}
});
} else {
alert("資料沒有獲取到哦~");
}
}
});
};

</script>

PS:如果發生

{errmsg:config: invalid signature}

首先檢查去微信的這個連結:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign,將自己的程式碼中的資料和它的資料做對比,如果還有問題,請檢查url錯誤,可能最後的一個"/"都能引起這個錯誤,最後說下,我的程式碼比較簡單,裡面肯定有很多不合理的地方,請大佬多多指教