微信轉發帶圖片和描述——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一定要動態獲取,不能寫死
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 +
"×tamp=" + 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 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錯誤,可能最後的一個"/"都能引起這個錯誤,最後說下,我的程式碼比較簡單,裡面肯定有很多不合理的地方,請大佬多多指教