微信公众号开发群发视频消息笔记(在微信公众号各项功能开通的情况下):
1、首先是上传视频素材
接口:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
说明:
参数说明:(结合示例代码)
其中的参数access_token和type获取到直接拼接到url中就可以
media中放的是所需要上传的文件。
示例代码(自己写的,不怎么完善,不喜勿喷):
public WeiXinResultUrl<MdlUpload> video1(HttpServletRequest request, String accessToken, String type, MultipartFile file) throws Exception{
String upload_url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
WeiXinResultUrl<MdlUpload> result = new WeiXinResultUrl<MdlUpload>();
try {
File toFile = WxMessageUtils.uploadingFile(request,file);
String url = upload_url.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
JSONObject jsonObject;
HttpPostUtil post = new HttpPostUtil(url);
post.addParameter("media", toFile);
String s = post.send();//post请求到微信的上传地址
jsonObject = JSONObject.fromObject(s);
if (jsonObject.containsKey("media_id")) {//判断返回来的数据
MdlUpload upload=new MdlUpload();//返回数据封装到MdlUpload 类中
upload.setMedia_id(jsonObject.getString("media_id"));//
upload.setType(jsonObject.getString("type"));
upload.setCreated_at(jsonObject.getString("created_at"));
result.setObj(upload);
result.setErrmsg("success");
result.setErrcode("0");
} else {
result.setErrmsg(jsonObject.getString("errmsg"));
result.setErrcode(jsonObject.getString("errcode"));
}
} catch (Exception e) {
e.printStackTrace();
result.setErrmsg("Upload Exception:"+e.toString());
}
return result;
}
返回:
返回的media_id是你所要发送的视频的标识。
2、获取你上传的视频素材并添加视频的标题和内容并保存到微信的服务器上,并返回你保存的内容的media_id
接口:https://api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token=ACCESS_TOKEN
说明:这里得到的media_id是群发消息时候所用到的media_id。
参数说明:(结合示例代码):
接口中的ACCESS_TOKEN获取到你自己的替换了就好,同第一步一样。
media_id:这个media_id就是第一步中上传视频素材成功后返回的media_id。
title:针对于这个视频消息的标题
description:视频消息的描述
示例代码(自己写的,不怎么完善,不喜勿喷):
public WeiXinResultUrl<MdlUpload> video(HttpServletRequest request,MultipartFile file,String title,String description,String accessToken){
WeiXinResultUrl<MdlUpload> result = new WeiXinResultUrl<MdlUpload>();
try {
String type = "video";
String upload_url = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token=ACCESS_TOKEN";
String url = upload_url.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
WeiXinResultUrl<MdlUpload> mdlUpload = video1(request,accessToken,type,file);//上传视频素材并获取到返回值,调用的就是第一步的接口
Map<String,String> map = new HashedMap();
map.put("media_id",mdlUpload.getObj().getMedia_id());//获取第一步中返回的media_id
map.put("title",title);//视频标题
map.put("description",description);//视频描述
JSONObject jsonObject = JSONObject.fromObject(map);
JSONObject videoJson = HttpRequestUtils.httpPost(url,jsonObject);//post请求微信的接口
if (videoJson.containsKey("media_id")) {
MdlUpload upload=new MdlUpload();
upload.setMedia_id(videoJson.getString("media_id"));
upload.setType(videoJson.getString("type"));
upload.setCreated_at(videoJson.getString("created_at"));
result.setObj(upload);
result.setErrmsg("success");
result.setErrcode("0");
} else {
result.setErrmsg(jsonObject.getString("errmsg"));
result.setErrcode(jsonObject.getString("errcode"));
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
3、发送视频消息
接口:https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=ACCESS_TOKEN
说明:(参数格式及说明)
mpvidoe参数中的media_id:就是第二步所获取到的media_id。
示例代码(自己写的,不怎么完善,不喜勿喷):
public MediaMessageResult sendWeiXinVideoMessage(HttpServletRequest request,MultipartFile file,String title,String description,String accessToken){
MediaMessageResult mediaMessageResult = new MediaMessageResult();
try{
String url = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token="+ accessToken;//这个url链接和参数不能变
WeiXinMessageRsp weiXinMessageRsp = queryOpenIdByToken(accessToken);//根据token获取到所有的openId,不知道怎么获取的请自行搜索
Map<String,Object> mapVideo = new HashedMap();
mapVideo.put("touser",weiXinMessageRsp.getData().getOpenid());//添加获取到的所有的openId
Map<String,String> map1 = new HashedMap();
WeiXinResultUrl<MdlUpload> mdlUploadWeiXinResultUrl = video(request,file,title,description,accessToken);//这里是调用的第二步的接口
map1.put("media_id",mdlUploadWeiXinResultUrl.getObj().getMedia_id());//获取到第二步返回的media_id
mapVideo.put("mpvideo",map1);
mapVideo.put("msgtype","mpvideo");
JSONObject jsonObject = JSONObject.fromObject(mapVideo);
JSONObject jsonObject1 = HttpRequestUtils.httpPost(url,jsonObject);
System.out.println(jsonObject1);
mediaMessageResult.setErrcode(jsonObject1.get("errcode").toString());
mediaMessageResult.setErrmsg(jsonObject1.get("errmsg").toString());
mediaMessageResult.setMsgId(jsonObject1.get("msg_id").toString());
mediaMessageResult.setMsgDataId(jsonObject1.get("msg_data_id").toString());
mediaMessageResult.setMediaId(mdlUploadWeiXinResultUrl.getObj().getMedia_id());
mediaMessageResult.setMsgtype("mpvideo");
int result = mediaMessageResultMapper.insert(mediaMessageResult);
if (result > 0){
return mediaMessageResult;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
4、一下是返回的封装类和发送请求的方法
示例代码(自己写的,不怎么完善,不喜勿喷):
public class WeiXinResultUrl<T> {
private T obj;
private String errcode;
private String errmsg;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
public String getErrcode() {
return errcode;
}
public void setErrcode(String errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
}
public class MdlUpload {
private String type;
private String media_id;
private String created_at;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMedia_id() {
return media_id;
}
public void setMedia_id(String mediaId) {
media_id = mediaId;
}
public String getCreated_at() {
return created_at;
}
public void setCreated_at(String createdAt) {
created_at = createdAt;
}
public MdlUpload() {
super();
}
@Override
public String toString() {
return "MdlUpload [created_at=" + created_at + ", media_id=" + media_id + ", type=" + type + "]";
}
}
/**
* httpPost
* @param url 路径
* @param jsonParam 参数
* @return
*/
public static JSONObject httpPost(String url,JSONObject jsonParam){
return httpPost(url, jsonParam, false);
}
/**
* post请求
* @param url url地址
* @param jsonParam 参数
* @param noNeedResponse 不需要返回结果
* @return
*/
public static JSONObject httpPost(String url,JSONObject jsonParam, boolean noNeedResponse){
//post请求返回结果
DefaultHttpClient httpClient = new DefaultHttpClient();
JSONObject jsonResult = null;
HttpPost method = new HttpPost(url);
try {
if (null != jsonParam) {
//解决中文乱码问题
System.out.print(jsonParam.toString());
StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
method.setEntity(entity);
}
HttpResponse result = httpClient.execute(method);
url = URLDecoder.decode(url, "UTF-8");
/**请求发送成功,并得到响应**/
if (result.getStatusLine().getStatusCode() == 200) {
String str = "";
try {
/**读取服务器返回过来的json字符串数据**/
str = EntityUtils.toString(result.getEntity());
if (noNeedResponse) {
return null;
}
/**把json字符串转换成json对象**/
jsonResult = JSONObject.fromObject(str);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return jsonResult;
}
/**
* 发送数据到服务器,返回一个字节包含服务器的返回结果的数组
*
* @return
* @throws Exception
*/
public String send() throws Exception {
initConnection();
conn.connect();
outputStream = new DataOutputStream(conn.getOutputStream());
writeFileParams();
writeStringParams();
paramsEnd();
int code = conn.getResponseCode();
if (code == 200) {
InputStream in = conn.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024 * 8];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
conn.disconnect();
String s = new String(out.toByteArray(), "utf-8");
return s;
}
return null;
}