之前我們在做消息回復的時候我們對回復的消息簡單做了分類,前面也有講述如何回復【普通消息類型消息】,這里將講述多媒體消息的回復方法,【多媒體消息】包含回復圖片消息/回復語音消息/回復視頻消息/回復音樂消息,這里以圖片消息的回復為例進行講解!
還記得之前將消息分類的標準就是一種是不需要上傳多媒體資源到騰訊服務器的而另外一種是需要的,所以在這里我們所需要做的第一步就是上傳資源到騰訊服務器,這里我們調用【素材管理】接口(后面將會有專門的章節講述)進行圖片的上傳,同樣的這個接口可以提供我們對語音、視頻、音樂等消息的管理,這里以圖片為例(文檔地址:http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html )。在文檔中我們可以發現這里上傳的方式是模擬表單的方式上傳,然后返回給我們我們需要在回復消息中需要用到的參數:media_id!
(一)素材接口圖片上傳
按照之前我們的約定將接口請求的url寫入到配置文件interface_url.properties中:
1
2
3
4
|
#獲取token的url tokenUrl=https: //api.weixin.qq.com/cgi-bin/token #永久多媒體文件上傳url mediaUrl=http: //file.api.weixin.qq.com/cgi-bin/media/upload?access_token= |
然后我在這里寫了一個模擬表單上傳的工具類HttpPostUploadUtil.java,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
package com.cuiyongzhi.wechat.util; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Iterator; import java.util.Map; import javax.activation.MimetypesFileTypeMap; import com.cuiyongzhi.web.util.GlobalConstants; /** * ClassName: HttpPostUploadUtil * @Description: 多媒體上傳 * @author dapengniao * @date 2016年3月14日 上午11:56:55 */ public class HttpPostUploadUtil { public String urlStr; public HttpPostUploadUtil(){ urlStr = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" +GlobalConstants.getInterfaceUrl( "access_token" )+ "&type=image" ; } /** * 上傳圖片 * * @param urlStr * @param textMap * @param fileMap * @return */ @SuppressWarnings ( "rawtypes" ) public String formUpload(Map<String, String> textMap, Map<String, String> fileMap) { String res = "" ; HttpURLConnection conn = null ; String BOUNDARY = "---------------------------123821742118716" ; //boundary就是request頭和上傳文件內容的分隔符 try { URL url = new URL(urlStr); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout( 5000 ); conn.setReadTimeout( 30000 ); conn.setDoOutput( true ); conn.setDoInput( true ); conn.setUseCaches( false ); conn.setRequestMethod( "POST" ); conn.setRequestProperty( "Connection" , "Keep-Alive" ); conn .setRequestProperty( "User-Agent" , "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)" ); conn.setRequestProperty( "Content-Type" , "multipart/form-data; boundary=" + BOUNDARY); OutputStream out = new DataOutputStream(conn.getOutputStream()); // text if (textMap != null ) { StringBuffer strBuf = new StringBuffer(); Iterator<?> iter = textMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String inputName = (String) entry.getKey(); String inputValue = (String) entry.getValue(); if (inputValue == null ) { continue ; } strBuf.append( "\r\n" ).append( "--" ).append(BOUNDARY).append( "\r\n" ); strBuf.append( "Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n" ); strBuf.append(inputValue); } out.write(strBuf.toString().getBytes()); } // file if (fileMap != null ) { Iterator<?> iter = fileMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String inputName = (String) entry.getKey(); String inputValue = (String) entry.getValue(); if (inputValue == null ) { continue ; } File file = new File(inputValue); String filename = file.getName(); String contentType = new MimetypesFileTypeMap() .getContentType(file); if (filename.endsWith( ".jpg" )) { contentType = "image/jpg" ; } if (contentType == null || contentType.equals( "" )) { contentType = "application/octet-stream" ; } StringBuffer strBuf = new StringBuffer(); strBuf.append( "\r\n" ).append( "--" ).append(BOUNDARY).append( "\r\n" ); strBuf.append( "Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n" ); strBuf.append( "Content-Type:" + contentType + "\r\n\r\n" ); out.write(strBuf.toString().getBytes()); 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 [] endData = ( "\r\n--" + BOUNDARY + "--\r\n" ).getBytes(); out.write(endData); out.flush(); out.close(); // 讀取返回數據 StringBuffer strBuf = new StringBuffer(); BufferedReader reader = new BufferedReader( new InputStreamReader( conn.getInputStream())); String line = null ; while ((line = reader.readLine()) != null ) { strBuf.append(line).append( "\n" ); } res = strBuf.toString(); reader.close(); reader = null ; } catch (Exception e) { System.out.println( "發送POST請求出錯。" + urlStr); e.printStackTrace(); } finally { if (conn != null ) { conn.disconnect(); conn = null ; } } return res; } } |
我們將工具類寫好之后就需要在我們消息回復中加入對應的響應代碼,這里為了測試我將響應代碼加在【關注事件】中!
(二)圖片回復
這里我們需要修改的是我們的【事件消息業務分發器】的代碼,這里我們將我們的回復加在【關注事件】中,簡單代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
String openid = map.get( "FromUserName" ); // 用戶openid String mpid = map.get( "ToUserName" ); // 公眾號原始ID ImageMessage imgmsg = new ImageMessage(); imgmsg.setToUserName(openid); imgmsg.setFromUserName(mpid); imgmsg.setCreateTime( new Date().getTime()); imgmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_Image); if (map.get( "Event" ).equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 關注事件 System.out.println( "==============這是關注事件!" ); Image img = new Image(); HttpPostUploadUtil util= new HttpPostUploadUtil(); String filepath= "H:\\1.jpg" ; Map<String, String> textMap = new HashMap<String, String>(); textMap.put( "name" , "testname" ); Map<String, String> fileMap = new HashMap<String, String>(); fileMap.put( "userfile" , filepath); String mediaidrs = util.formUpload(textMap, fileMap); System.out.println(mediaidrs); String mediaid=JSONObject.fromObject(mediaidrs).getString( "media_id" ); img.setMediaId(mediaid); imgmsg.setImage(img); return MessageUtil.imageMessageToXml(imgmsg); } |
到這里代碼基本就已經完成整個的圖片消息回復的內容,同樣的不論是語音回復、視頻回復等流程都是一樣的,所以其他的就不在做過多的講述了,最后的大致效果如下:
正常的消息回復的內容我們就講述的差不多了,下一篇我們講述基于消息回復的一些應用【關鍵字回復及超鏈接回復】的實現,感謝你的翻閱,如有疑問可以留言討論!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。