慕課網-圖片消息的自動回覆

微信公衆號開發者文檔裏面發送消息-被動回覆消息,右邊能夠點擊回覆圖片消息。java

若是是第一次開發微信公衆號的小夥伴第一次看到這麼短一段說明文字的時候可能一會兒就懵逼了,由於根本就不知道如何去獲取這個MediaId。這也是微信公衆號開發文檔的一個比較坑爹的地方,由於單純看這一頁根本就不知道如何去獲取這個參數,並且開發文檔有些地方json

的參數仍是有錯誤的。緩存

     這個時候就須要點擊素材管理-新增臨時素材那裏去看一下相關接口的地址和調用方法。安全

     

 

 

     若是對文件的上傳和下載不是很熟的朋友,能夠參考慕課網中的文件上傳和下載的課程服務器

 這個課程裏面有講文件上傳須要設置的一些什麼像頭文件啊分界符啊微信

運行測試類WeixinTest.java以後控制檯打印出錯誤信息微信開發

得知此錯誤以後返回去看微信公衆號開發文檔裏面的接口返回碼說明,看一看全局返回碼說明app

找到48001錯誤。原來是測試

 

由於我這個微信公衆號是我的訂閱號,因此沒有得到該接口的權限。ui

而後就須要使用咱們以前講過的測試號了,須要把測試號的開發者ID和開發者密鑰替換掉程序中的我的訂閱號的微信開發者ID和開發者密鑰

假如說你手上有一套微信公衆號的代碼,你只須要替換掉appid和appsecret以及tocken。這三個地方代碼裏面和後臺配置只要一致的話就能夠了。

再次運行測試類WeixinTest.java,能夠獲得返回結果media_id

順便把JS接口安全域名也給修改了,填上百度雲服務器上面本應用的域名

 提交代碼以後報錯

估計是token票據失效了,從新獲取token票據和MediaId

仍是報錯。。。

票據能夠有效兩個小時,媒體文件能夠在微信後臺保存3天,即3天后MediaId失效。若是這樣都仍是報報錯,那應該是最複雜的上傳本地媒體文件到微信後臺服務器的代碼有錯誤,圖片根本就沒有發送到微信後臺那裏去。

發現了這一個代碼有錯,把請求頭信息Keep-Aive改爲Keep-Alive以後仍是報錯

原來是回覆圖片消息要先關注本身申請的接口測試號公衆號以後在測試號進行測試才能夠,若是使用本身的我的訂閱號是不能夠提供服務的

哈哈,這個就是微信開發文檔中比較坑爹的一個地方。哈哈哈啊哈啊哈哈哈。。。

 下面貼一下主要的代碼吧:

WeixinUtil.java的媒體文件上傳代碼

//下面寫一個文件上傳的代碼
public static String upload(String filePath,String accessToken,String type) throws IOException{
//這裏須要傳遞三個參數:文件所在的路徑,票據,文件的類型
//首先進來須要對文件路徑進行判斷,是否存在
File file = new File(filePath);
if(!file.exists()||!file.isFile()){
throw new IOException("文件不存在");
}
String url = UPLOAD_URL.replace("ACCESS_TOKEN",accessToken).replace("TYPE",type);//而後須要對接口地址的兩個參數access_tocken和type進行賦值
URL urlObj = new URL(url);
//鏈接
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
//首先是以POST方式進行提交
con.setRequestMethod("POST");
con.setDoInput(true);//進行輸入輸出
con.setDoOutput(true);
con.setUseCaches(false);//若是是POST方式要設置忽略它的緩存

//設置請求頭信息
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");

//設置邊界
String BOUNDARY = "-------"+System.currentTimeMillis();
con.setRequestProperty("Content-Type","multipart/form-data;boundary="+BOUNDARY);

StringBuilder sb = new StringBuilder();
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Dispoistion:form-data;name=\"file\";filename=\""+file.getName()+"\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");

byte[] head = sb.toString().getBytes("utf-8");
//而後經過輸出流的方式進行輸出

//獲取輸出流
OutputStream out = new DataOutputStream(con.getOutputStream());

//輸出表頭
out.write(head);

//文件正文部分
//把文件以流文件的方式 推入到url中
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while((bytes = in.read(bufferOut))!=-1){
out.write(bufferOut, 0, bytes);
}
in.close();

//結尾部分
byte[] foot = ("\r\n--"+ BOUNDARY +"--\r\n").getBytes("utf-8");//定義最後數據分隔線

out.write(foot);

out.flush();
out.close();

StringBuffer buffer = new StringBuffer();
BufferedReader reader = null;
String result = null;

//定義BufferedReader輸入流來讀取URL的響應
//請求成功之後咱們要在輸入流裏面去拿它的響應結果
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line = null;
try{
while((line = reader.readLine())!=null){
buffer.append(line);
}
if(result == null){
result = buffer.toString();

}
}catch(IOException e){
e.printStackTrace();
}finally{
if(reader!=null){
reader.close();
}
}
JSONObject jsonObj = JSONObject.fromObject(result);//把結果轉成JSON格式
System.out.println(jsonObj);
String mediaId = jsonObj.getString("media_id");
return mediaId;


}

WeixinTest.java  測試代碼

package com.imooc.test;

import java.io.IOException;

import com.imooc.po.AccessTocken;
import com.imooc.util.WeixinUtil;

public class WeixinTest {
public static void main(String[] args) {
AccessTocken token = WeixinUtil.getAccessTocken();
System.out.println("票據:"+token.getToken());
System.out.println("有效時間:"+token.getExpiresIn());

String path = "D:/imooc.jpg";
try {
String mediaId = WeixinUtil.upload(path,token.getToken(),"image");
System.out.println(mediaId);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Image.java

package com.imooc.po;

public class Image {
private String MediaId;//和發送消息-被動回覆消息-回覆圖片消息的返回的一段XML代碼裏面的一個字段MediaId同樣

public String getMediaId() {
return MediaId;
}

public void setMediaId(String mediaId) {
MediaId = mediaId;
}

}

ImageMessage.java

package com.imooc.po;

public class ImageMessage extends BaseMessage{
//private Image image;//這裏的大小寫是很重要的 不然後面將javabean轉爲XML的時候沒法識別
private Image Image;
public Image getImage() {
return Image;
}

public void setImage(Image image) {
//this.Image = image;
Image = image;
}
}

Messageutil.java的組裝圖片消息

/**
*
* 圖片消息的組裝
* @param toUserName
* @param fromUserName
* @return
*/
public static String initImageMessage(String toUserName,String fromUserName){//接收方和發送方
String message = null;
Image image = new Image();
//image.setMediaId("idKpa1NXpmkbUpntpH8nMwPj3cTTiH02-B_ZE57LOt9fWOPVKvrxp5BKokk8wUNi");
image.setMediaId("aycSC7SSzXpVnz45Li_Qg1nUl4pHZpyNeHKVg70Ih7z9RmvUBA4yyT72FjFjOiu_");//再次上傳圖片,實際上是從新獲取票據,從新獲取MediaId
ImageMessage imageMessage = new ImageMessage();
imageMessage.setFromUserName(toUserName);
imageMessage.setToUserName(fromUserName);
imageMessage.setMsgType(MESSAGE_IMAGE);//使用常量而不是字符串,這樣可維護性比較強 消息的類型是圖片
imageMessage.setCreateTime(new Date().getTime());//仍是咱們的當前時間
imageMessage.setImage(image);
message = imageMessageToXml(imageMessage);//將JavaBean轉爲XML
return message;

}

以及

/**
* 圖片消息轉爲XML
* @param imageMessage
* @return
*/
public static String imageMessageToXml(ImageMessage imageMessage){
XStream xstream = new XStream();
xstream.alias("xml", imageMessage.getClass());
return xstream.toXML(imageMessage);
}

最後就在Servlet寫業務邏輯

相關文章
相關標籤/搜索