一、本节要点

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+ "&timestamp=" + 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_素材管理之上传本地临时素材文件的更多相关文章

  1. Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器

    一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...

  2. Java企业微信开发_07_总结一下企业微信的配置

    一.企业微信后台 1.回调url 2.可信域名 3.菜单跳转按钮中的链接 4.PC端网页授权 二.代码内 1.企业微信的配置信息:WeiXinParamesUtil

  3. Java企业微信开发_07_JSSDK多图上传

    一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失 ...

  4. Java企业微信开发_05_消息推送之发送消息(主动)

    一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接 ...

  5. Java企业微信开发_04_消息推送之发送消息(主动)

    源码请见: Java企业微信开发_00_源码及资源汇总贴 一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息 ...

  6. Java企业微信开发_03_通讯录同步

    一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...

  7. Java企业微信开发_02_通讯录同步

    一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...

  8. Java企业微信开发_01_接收消息服务器配置

    一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:Java微信公众平台开发_01_本地服务器映射外网 2.一个企业微信账号: 去注册:(https://work.weixin.qq.c ...

  9. Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

    注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...

随机推荐

  1. hibernate总结-持续更新

    简介 hibernate官网:Hibernate Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思 ...

  2. 部署服务能在Dynamics CRM Online上使用吗?

    部署服务有些时候有用,改动一些参数不需要重启IIS,也不需要去数据库中更改.比如,系统默认设置一个仪表盘(Dashboard)最多6个组件,不能超过这个数量,通过部署服务是可以更改的.部署服务既可以通 ...

  3. java使用dom4j对XML进行CURD操作

    要使用dom4j必须导入两个jar包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 使用dom4j新建一个XML文件: /** * 利用dom4j完成新增一个xml文件 ...

  4. php+xdebug+phpstorm(mac os x+homebrew)

    今天研究了下用phpstorm做xdebug调试,首先申明本人电脑是mac系统,软件包管理用的是homebrew,phpstorm用的是2016.3.2版本,php56,xdebug2.5.1,希望对 ...

  5. SAN & vSAN & vSAN storage

    SAN (storage area network ) 定义: Storage area network (SAN) is a network that primarily connects the ...

  6. 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 ...

  7. Python基础之模块、数据类型及数据类型转换

    一.模块 1.标准库 不需要安装,直接调入使用的模块. import sys模块: import sys print(sys.path) #打印环境变量绝对路径 print(sys.argv) #打印 ...

  8. Memcached的基础梳理

    1 .Memcached 概念 官方解释如下: What is Memcached? Free & open source, high-performance, distributed mem ...

  9. The request sent by the client was syntactically incorrect问题解决

    The request sent by the client was syntactically incorrect意思嘛,google翻译一下 通过日志不难看出,是由参数不匹配造成的. 所以对于Da ...

  10. Swift 轻量级网络层设计

    前言 普遍我们的网络层设计的时候直接是如下结构APIManager.post(url, parameter,completeHandle),服务器配置在APIManager.m文件中进行配置.这样一个 ...