Java企业微信开发_07_素材管理之上传本地临时素材文件
一、本节要点
1.临时素材有效期
media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效)
2.上传文件时的http请求里都有啥
具体原理可参看: 为什么上传文件的表单需要设置enctype="multipart/form-data" (http://blog.csdn.net/mazhibinit/article/details/49667511)
3.上传本地临时素材到微信服务器的流程
(1)建立与微信服务器的网络连接
(2)从连接中获取输出流(写入微信服务器的),将本地文件以文件流的形式 写入输出流
(3)从连接中获取输入流(微信服务器返回的),获取输入流中的微信服务器返回的数据(type、media_id、created_at)
(4)上传完素材就要使用素材了:这时,我们拿着上一步的media_id,去做发送图片消息的测试。
二、代码实现
1. 微信上传素材的请求方法
public static String httpRequest(String requestUrl, File file)
/**
* @desc :微信上传素材的请求方法
*
* @param requestUrl 微信上传临时素材的接口url
* @param file 要上传的文件
* @return String 上传成功后,微信服务器返回的消息
*/
public static String httpRequest(String requestUrl, File file) {
StringBuffer buffer = new StringBuffer(); try{
//1.建立连接
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); //打开链接 //1.1输入输出设置
httpUrlConn.setDoInput(true);
httpUrlConn.setDoOutput(true);
httpUrlConn.setUseCaches(false); // post方式不能使用缓存
//1.2设置请求头信息
httpUrlConn.setRequestProperty("Connection", "Keep-Alive");
httpUrlConn.setRequestProperty("Charset", "UTF-8");
//1.3设置边界
String BOUNDARY = "----------" + System.currentTimeMillis();
httpUrlConn.setRequestProperty("Content-Type","multipart/form-data; boundary="+ BOUNDARY); // 请求正文信息
// 第一部分:
//2.将文件头输出到微信服务器
StringBuilder sb = new StringBuilder();
sb.append("--"); // 必须多两道线
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"media\";filelength=\"" + file.length()
+ "\";filename=\""+ file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
OutputStream outputStream = new DataOutputStream(httpUrlConn.getOutputStream());
// 将表头写入输出流中:输出表头
outputStream.write(head); //3.将文件正文部分输出到微信服务器
// 把文件以流文件的方式 写入到微信服务器中
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
outputStream.write(bufferOut, 0, bytes);
}
in.close();
//4.将结尾部分输出到微信服务器
byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
outputStream.write(foot);
outputStream.flush();
outputStream.close(); //5.将微信服务器返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
} bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect(); } catch (IOException e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
return buffer.toString();
}
2.微信工具类——WeiXinUtil
我们将1中的微信上传素材的请求方法封装到WeiXinUtil.ava中
package com.ray.util; import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.ray.pojo.AccessToken; import net.sf.json.JSONException;
import net.sf.json.JSONObject; public class WeiXinUtil { private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class);
//微信的请求url
//获取access_token的接口地址(GET) 限200(次/天)
public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}"; /**
* 1.发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf); httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod))
httpUrlConn.connect(); // 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
} // 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("Weixin server connection timed out.");
} catch (Exception e) {
log.error("https request error:{}", e);
}
return jsonObject;
}
/**
* @desc :微信上传素材的请求方法
*
* @param requestUrl 微信上传临时素材的接口url
* @param file 要上传的文件
* @return String 上传成功后,微信服务器返回的消息
*/
public static String httpRequest(String requestUrl, File file) {
StringBuffer buffer = new StringBuffer(); try{
//1.建立连接
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); //打开链接 //1.1输入输出设置
httpUrlConn.setDoInput(true);
httpUrlConn.setDoOutput(true);
httpUrlConn.setUseCaches(false); // post方式不能使用缓存
//1.2设置请求头信息
httpUrlConn.setRequestProperty("Connection", "Keep-Alive");
httpUrlConn.setRequestProperty("Charset", "UTF-8");
//1.3设置边界
String BOUNDARY = "----------" + System.currentTimeMillis();
httpUrlConn.setRequestProperty("Content-Type","multipart/form-data; boundary="+ BOUNDARY); // 请求正文信息
// 第一部分:
//2.将文件头输出到微信服务器
StringBuilder sb = new StringBuilder();
sb.append("--"); // 必须多两道线
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"media\";filelength=\"" + file.length()
+ "\";filename=\""+ file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
OutputStream outputStream = new DataOutputStream(httpUrlConn.getOutputStream());
// 将表头写入输出流中:输出表头
outputStream.write(head); //3.将文件正文部分输出到微信服务器
// 把文件以流文件的方式 写入到微信服务器中
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
outputStream.write(bufferOut, 0, bytes);
}
in.close();
//4.将结尾部分输出到微信服务器
byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
outputStream.write(foot);
outputStream.flush();
outputStream.close(); //5.将微信服务器返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
} bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect(); } catch (IOException e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
return buffer.toString();
} /**
* 2.发起http请求获取返回结果
*
* @param requestUrl 请求地址
* @return
*/
public static String httpRequest(String requestUrl) {
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); httpUrlConn.setDoOutput(false);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false); httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect(); // 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect(); } catch (Exception e) {
}
return buffer.toString();
} /**
* 3.获取access_token
*
* @param appid 凭证
* @param appsecret 密钥
* @return
*/
public static AccessToken getAccessToken(String appid, String appsecret) {
AccessToken accessToken = null; String requestUrl = access_token_url.replace("{corpId}", appid).replace("{corpsecret}", appsecret);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
// 如果请求成功
if (null != jsonObject) {
try {
accessToken = new AccessToken();
accessToken.setToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
} catch (JSONException e) {
accessToken = null;
// 获取token失败
log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}
return accessToken;
} /**
* 3.获取微信的JSSDK配置信息
* 方法名:getWxConfig</br>
* 详述:获取微信的配置信息 </br>
* 开发人员:souvc </br>
* 创建时间:2016-1-5 </br>
* @param request
* @return 说明返回值含义
* @throws 说明发生此异常的条件
*/
public static Map<String, Object> getWxConfig(HttpServletRequest request) {
Map<String, Object> ret = new HashMap<String, Object>(); String appId = "wxa0064ea657f80062"; // 必填,公众号的唯一标识
String secret = "fcc960840df869ad1a46af7993784917"; String requestUrl = request.getRequestURL().toString();
String access_token = "";
String jsapi_ticket = "";
String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳
String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" + secret;
//使用http请求获取access_token
JSONObject json = WeiXinUtil.httpRequest(url, "GET", null);
System.out.println(" 获取access_token "+json);
if (json != null) {
//要注意,access_token需要缓存
access_token = json.getString("access_token");
//根据access_token获取jsapi_ticket
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token + "&type=jsapi";
json = WeiXinUtil.httpRequest(url, "GET", null);
System.out.println("jsapi_ticket "+json);
if (json != null) {
jsapi_ticket = json.getString("ticket");
}
}
String signature = "";
// 注意这里参数名必须全部小写,且必须有序
String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr+ "×tamp=" + timestamp + "&url=" + requestUrl;
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(sign.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
ret.put("appId", appId);
ret.put("timestamp", timestamp);
ret.put("nonceStr", nonceStr);
ret.put("signature", signature);
return ret;
} /**
* 方法名:byteToHex</br>
* 详述:字符串加密辅助方法 </br>
* 开发人员:souvc </br>
* 创建时间:2016-1-5 </br>
* @param hash
* @return 说明返回值含义
* @throws 说明发生此异常的条件
*/
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result; }
}
3.业务类——TempMaterialService
package com.ray.service; import java.io.File; import com.ray.util.WeiXinUtil; import net.sf.json.JSONObject; /**@desc : 临时素材业务类
*
* @author: shirayner
* @date : 2017-8-18 下午2:07:25
*/
public class TempMaterialService {
//上传临时素材url
public static String uploadTempMaterial_url="https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"; /**
* @desc :上传临时素材
*
* @param accessToken 接口访问凭证
* @param type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
* @param fileUrl 本地文件的url。例如 "D/1.img"。
* @return JSONObject 上传成功后,微信服务器返回的参数,有type、media_id 、created_at
*/
public JSONObject uploadTempMaterial(String accessToken,String type,String fileUrl){
//1.创建本地文件
File file=new File(fileUrl); //2.拼接请求url
uploadTempMaterial_url=uploadTempMaterial_url.replace("ACCESS_TOKEN", accessToken)
.replace("TYPE", type); //3.调用接口,发送请求,上传文件到微信服务器
String result=WeiXinUtil.httpRequest(uploadTempMaterial_url, file); //4.json字符串转对象:解析返回值,json反序列化
result = result.replaceAll("[\\\\]", "");
System.out.println("result:" + result);
JSONObject resultJSON = JSONObject.fromObject(result); //5.返回参数判断
if (resultJSON != null) {
if (resultJSON.get("media_id") != null) {
System.out.println("上传" + type + "永久素材成功");
return resultJSON;
} else {
System.out.println("上传" + type + "永久素材失败");
}
}
return null;
} }
4.测试类——TempMaterialTest
package com.ray.test; import org.junit.Test; import com.ray.service.TempMaterialService;
import com.ray.util.WeiXinParamesUtil;
import com.ray.util.WeiXinUtil; /**@desc : 临时素材
*
* @author: shirayner
* @date : 2017-8-18 下午2:06:10
*/
public class TempMaterialTest { @Test
public void testUploadTempMaterial(){
//1.初始化参数
String fileUrl="D:/renwu1.jpg";
String type="image";
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.contactsSecret).getToken();
//2.调用业务类,上传临时素材
TempMaterialService tms=new TempMaterialService();
tms.uploadTempMaterial(accessToken, type, fileUrl); }
}
这时在控制台上会打印出微信服务器返回的media_id,我们拿着这个media_id去完成发送消息之发送图片消息的测试,参见 Java企业微信开发_05_消息推送之发送消息(主动)
5.测试类——SendMessageTest
package com.ray.test; import java.util.ArrayList;
import java.util.List; import org.junit.Test; import com.ray.pojo.message.send.Article;
import com.ray.pojo.message.send.FileMessage;
import com.ray.pojo.message.send.ImgMessage;
import com.ray.pojo.message.send.Media;
import com.ray.pojo.message.send.News;
import com.ray.pojo.message.send.NewsMessage;
import com.ray.pojo.message.send.Text;
import com.ray.pojo.message.send.TextMessage;
import com.ray.pojo.message.send.Textcard;
import com.ray.pojo.message.send.TextcardMessage;
import com.ray.pojo.message.send.Video;
import com.ray.pojo.message.send.VideoMessage;
import com.ray.pojo.message.send.VoiceMessage;
import com.ray.service.SendMessageService;
import com.ray.util.WeiXinParamesUtil;
import com.ray.util.WeiXinUtil; /**@desc : 消息推送之发送消息
*
* @author: shirayner
* @date : 2017-8-18 上午10:04:55
*/
public class SendMessageTest { //1.发送文本消息
@Test
public void testSendTextMessage(){
//0.设置消息内容
String content="rayge,你好!你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看" +
"<a href=\"http://work.weixin.qq.com\">邮件中心视频实况" +
"</a>,聪明避开排队。"; //1.创建文本消息对象
TextMessage message=new TextMessage();
//1.1非必需
message.setTouser("@all"); //不区分大小写
//textMessage.setToparty("1");
//txtMsg.setTotag(totag);
//txtMsg.setSafe(0); //1.2必需
message.setMsgtype("text");
message.setAgentid(WeiXinParamesUtil.agentId); Text text=new Text();
text.setContent(content);
message.setText(text); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } //2.发送文本卡片消息
@Test
public void testSendTextcardMessage(){
//0.设置消息内容
String title="代办事宜";
String description="<div class=\"gray\">2017年8月18日</div> <div class=\"normal\">" +
"恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\"highlight\">" +
"请于2017年10月10日前联系行政同事领取</div>";
String url="http://www.cnblogs.com/shirui/p/7297872.html"; //1.创建文本卡片消息对象
TextcardMessage message=new TextcardMessage();
//1.1非必需
message.setTouser("shirui"); //不区分大小写
//message.setToparty("1");
//message.setTotag(totag);
//message.setSafe(0); //1.2必需
message.setMsgtype("textcard");
message.setAgentid(WeiXinParamesUtil.agentId); Textcard textcard=new Textcard();
textcard.setTitle(title);
textcard.setDescription(description);
textcard.setUrl(url);
message.setTextcard(textcard); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } //3.发送图片消息---无效的media_id
@Test
public void testSendImgMessage(){
//0.设置消息内容
//String media_id="MEDIA_ID";
String media_id="3oKgxI6C_Z_8gPr5a1ORIhYTLlMJnoMWbrRIrip2p6oQ";
//1.创建图片消息对象
ImgMessage message=new ImgMessage();
//1.1非必需
message.setTouser("@all"); //不区分大小写
//textMessage.setToparty("1");
//txtMsg.setTotag(totag);
//txtMsg.setSafe(0); //1.2必需
message.setMsgtype("image");
message.setAgentid(WeiXinParamesUtil.agentId); Media image=new Media();
image.setMedia_id(media_id);
message.setImage(image); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } //4.发送语音消息---无效的media_id
@Test
public void testSendVoiceMessage(){
//0.设置消息内容
String media_id="MEDIA_ID";
//1.创建语音消息对象
VoiceMessage message=new VoiceMessage();
//1.1非必需
message.setTouser("@all"); //不区分大小写
//textMessage.setToparty("1");
//txtMsg.setTotag(totag);
//txtMsg.setSafe(0); //1.2必需
message.setMsgtype("image");
message.setAgentid(WeiXinParamesUtil.agentId); Media voice=new Media();
voice.setMedia_id(media_id);
message.setVoice(voice); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } //5.发送视频消息
@Test
public void testSendVideoMessage(){
//0.设置消息内容
String media_id="MEDIA_ID";
String title="视频示例";
String description="好看的视频"; //1.创建视频消息对象
VideoMessage message=new VideoMessage();
//1.1非必需
message.setTouser("@all"); //不区分大小写
//message.setToparty("1");
//message.setTotag(totag);
//message.setSafe(0); //1.2必需
message.setMsgtype("video");
message.setAgentid(WeiXinParamesUtil.agentId); Video video=new Video();
video.setMedia_id(media_id);
video.setTitle(title);
video.setDescription(description);
message.setVideo(video); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } //6.发送文件消息
@Test
public void testSendFileMessage(){
//0.设置消息内容
String media_id="MEDIA_ID"; //1.创建文件对象
FileMessage message=new FileMessage();
//1.1非必需
message.setTouser("@all"); //不区分大小写
//textMessage.setToparty("1");
//txtMsg.setTotag(totag);
//txtMsg.setSafe(0); //1.2必需
message.setMsgtype("file");
message.setAgentid(WeiXinParamesUtil.agentId); Media file=new Media();
file.setMedia_id(media_id);
message.setFile(file); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } //7.发送图文消息
@Test
public void testSendNewsMessage(){ //1.创建图文消息对象
NewsMessage message=new NewsMessage();
//1.1非必需
message.setTouser("@all"); //不区分大小写
//textMessage.setToparty("1");
//txtMsg.setTotag(totag);
//txtMsg.setSafe(0); //1.2必需
message.setMsgtype("news");
message.setAgentid(WeiXinParamesUtil.agentId);
//设置图文消息
Article article1=new Article();
article1.setTitle("青年文摘");
article1.setDescription("这是一个很特别的描述");
article1.setPicurl("http://img.hb.aicdn.com/41db5196f17008a1994e978603c18dfaaa4b703f465a9-DcgZvI_fw658");
article1.setUrl("http://www.cnblogs.com/shirui/p/7297872.html"); List<Article> articles=new ArrayList<Article>();
articles.add(article1); News news=new News();
news.setArticles(articles);
message.setNews(news); //2.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken= WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
System.out.println("accessToken:"+accessToken); //3.发送消息:调用业务类,发送消息
SendMessageService sms=new SendMessageService();
sms.sendMessage(accessToken, message); } }
运行testSendImgMessage()方法,打开企业微信,发现真的发送了一张图片给用户。
参考文章:http://blog.csdn.net/u013791374/article/details/53258275
Java企业微信开发_07_素材管理之上传本地临时素材文件的更多相关文章
- Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器
一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...
- Java企业微信开发_07_总结一下企业微信的配置
一.企业微信后台 1.回调url 2.可信域名 3.菜单跳转按钮中的链接 4.PC端网页授权 二.代码内 1.企业微信的配置信息:WeiXinParamesUtil
- Java企业微信开发_07_JSSDK多图上传
一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失 ...
- Java企业微信开发_05_消息推送之发送消息(主动)
一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接 ...
- Java企业微信开发_04_消息推送之发送消息(主动)
源码请见: Java企业微信开发_00_源码及资源汇总贴 一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息 ...
- Java企业微信开发_03_通讯录同步
一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...
- Java企业微信开发_02_通讯录同步
一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...
- Java企业微信开发_01_接收消息服务器配置
一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:Java微信公众平台开发_01_本地服务器映射外网 2.一个企业微信账号: 去注册:(https://work.weixin.qq.c ...
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...
随机推荐
- hibernate总结-持续更新
简介 hibernate官网:Hibernate Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思 ...
- 部署服务能在Dynamics CRM Online上使用吗?
部署服务有些时候有用,改动一些参数不需要重启IIS,也不需要去数据库中更改.比如,系统默认设置一个仪表盘(Dashboard)最多6个组件,不能超过这个数量,通过部署服务是可以更改的.部署服务既可以通 ...
- java使用dom4j对XML进行CURD操作
要使用dom4j必须导入两个jar包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 使用dom4j新建一个XML文件: /** * 利用dom4j完成新增一个xml文件 ...
- php+xdebug+phpstorm(mac os x+homebrew)
今天研究了下用phpstorm做xdebug调试,首先申明本人电脑是mac系统,软件包管理用的是homebrew,phpstorm用的是2016.3.2版本,php56,xdebug2.5.1,希望对 ...
- SAN & vSAN & vSAN storage
SAN (storage area network ) 定义: Storage area network (SAN) is a network that primarily connects the ...
- Merge Two Sorted Lists & Remove Nth Node From End of List
1.合并两个排好序的list Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The ...
- Python基础之模块、数据类型及数据类型转换
一.模块 1.标准库 不需要安装,直接调入使用的模块. import sys模块: import sys print(sys.path) #打印环境变量绝对路径 print(sys.argv) #打印 ...
- Memcached的基础梳理
1 .Memcached 概念 官方解释如下: What is Memcached? Free & open source, high-performance, distributed mem ...
- The request sent by the client was syntactically incorrect问题解决
The request sent by the client was syntactically incorrect意思嘛,google翻译一下 通过日志不难看出,是由参数不匹配造成的. 所以对于Da ...
- Swift 轻量级网络层设计
前言 普遍我们的网络层设计的时候直接是如下结构APIManager.post(url, parameter,completeHandle),服务器配置在APIManager.m文件中进行配置.这样一个 ...