微信公众号开发之新增永久图文素材(十)

一、上传图文消息内的图片获取URL

本接口所上传的图片不占用公众号的素材库中图片数量的100000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。

接口调用请求说明

http请求方式: POST,https协议 https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"

参数说明

参数是否必须说明
access_token 调用接口凭证
media form-data中媒体文件标识,有filename、filelength、content-type等信息

返回说明 正常情况下的返回结果为:

{
    "url":  "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"

}

其中url就是上传图片的URL,可放置图文消息中使用。

新建一个NewsUtil类,在这里创建一个上传图文素材图片的方法

/**
上传图文消息内的图片获取URL
*/
public String uploadimg(String filePath) {

String accessToken = accessTokenUtil.getAccessToken();
if (accessToken != null) {
String url = URIConstant.UPLOAD_IMG_URL.replace("ACCESS_TOKEN", accessToken);
log.info("UPLOAD_IMG_URL:{}",url);

//设置请求体,注意是LinkedMultiValueMap
MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();

//设置上传文件
FileSystemResource fileSystemResource = new FileSystemResource(filePath);
data.add("media", fileSystemResource);

//上传文件,设置请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
httpHeaders.setContentLength(fileSystemResource.getFile().length());

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data,
httpHeaders);
try{
//这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因
// ResponseEntity<JSONObject> resultEntity = restTemplate.exchange(url,
// HttpMethod.POST, requestEntity, JSONObject.class);
String resultJSON = restTemplate.postForObject(url, requestEntity, String.class);
log.info("上传返回的信息是:{}",resultJSON);
return resultJSON;
}catch (Exception e){
log.error(e.getMessage());
}
}
return null;

}

照例,我们在swagger中新建一个方法测试一下我们的方法

@ApiOperation(value = "上传图文消息内的图片获取URL")
@RequestMapping(value = "/uploadImg", method = RequestMethod.POST)
public Object uploadImg(String filePath) {

String result = newsUtil.uploadimg(filePath);
log.info("resut:{}",JSONObject.parseObject(result).toJSONString());
return result;
}

在swagger中提交请求

 

 二、新增永久图文素材

接口调用请求说明

http请求方式: POST,https协议 https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN

调用示例

{
    "articles": [{
     "title": TITLE,
    "thumb_media_id": THUMB_MEDIA_ID,
    "author": AUTHOR,
    "digest": DIGEST,
    "show_cover_pic": SHOW_COVER_PIC(0 / 1),
    "content": CONTENT,
    "content_source_url": CONTENT_SOURCE_URL,
    "need_open_comment":1,
    "only_fans_can_comment":1
},
    //若新增的是多图文素材,则此处应还有几段articles结构
]
}

参数说明

参数是否必须说明
title 标题
thumb_media_id 图文消息的封面图片素材id(必须是永久mediaID)
author 作者
digest 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。
show_cover_pic 是否显示封面,0为false,即不显示,1为true,即显示
content 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。
content_source_url 图文消息的原文地址,即点击“阅读原文”后的URL
need_open_comment Uint32 是否打开评论,0不打开,1打开
only_fans_can_comment Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论

返回说明

{
   "media_id":MEDIA_ID
}

返回的即为新增的图文消息素材的media_id。

我们新建一个NewsUtil类,里面主要是两个方法,一个是组件我们的图文发送数据字符串,一个是把这个数据字符串发送给我们的微信服务器接口

private Articles createArticles(){

Articles articles = new Articles();

List<News> dataList = new ArrayList<>();
News news1 = new News();
news1.setTitle("标题");
news1.setThumb_media_id("J49eq_VE823b_wZH3Op4DFkLa4Lm4jkTSxX_VbiBWhY");
news1.setAuthor("作者");
news1.setDigest("图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。");
news1.setShow_cover_pic(1);//显示封面
news1.setContent("图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。");
news1.setContent_source_url("https://www.baidu.com/"); //图文消息的原文地址,即点击“阅读原文”后的URL
news1.setNeed_open_comment(1); //Uint32 是否打开评论,0不打开,1打开
news1.setOnly_fans_can_comment(1); //Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论


News news2 = new News();
news2.setTitle("标题");
news2.setThumb_media_id("J49eq_VE823b_wZH3Op4DOvK45tuhPJfr3n1_h1w1h8");
news2.setAuthor("作者");
news2.setDigest("图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。");
news2.setShow_cover_pic(1);//显示封面
news2.setContent("图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。");
news2.setContent_source_url("https://www.baidu.com/"); //图文消息的原文地址,即点击“阅读原文”后的URL
news2.setNeed_open_comment(1); //Uint32 是否打开评论,0不打开,1打开
news2.setOnly_fans_can_comment(1); //Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论
dataList.add(news1);
dataList.add(news2);

articles.setArticles(dataList);
return articles;

}
/**
*新增永久图文素材
*/
public String addNews() {

Articles articles = this.createArticles();
String accessToken = accessTokenUtil.getAccessToken();
if (accessToken != null) {
log.info("URL{}", URIConstant.ADD_NEWS_URL);
String url = URIConstant.ADD_NEWS_URL.replace("ACCESS_TOKEN", accessToken);
log.info("ADD_NEWS_URL:{}", url);

//将菜单对象转换成JSON字符串
String jsonNews = JSONObject.toJSONString(articles);
log.info("JSONNEWS:{}",jsonNews);

//发起POST请求创建菜单
String jsonObject = restTemplate.postForObject(url, jsonNews,String.class);

return jsonObject;
}
return null;
}

显然这里我们定义了两个POJO,News.java和Articles.java

package com.xu.wemall.pojo.news;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "新闻消息发送对象")
public class News {

@ApiModelProperty(value = "标题")
private String title;

@ApiModelProperty(value = "图文消息的封面图片素材id(必须是永久 media_ID)")
private String thumb_media_id;

@ApiModelProperty(value = "作者")
private String author;

@ApiModelProperty(value = "图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空")
private String digest;

@ApiModelProperty(value = "是否显示封面,0为false,即不显示,1为true,即显示")
private Integer show_cover_pic;

@ApiModelProperty(value = "图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS")
private String content;

@ApiModelProperty(value = "图文消息的原文地址,即点击“阅读原文”后的URL")
private String content_source_url;

@ApiModelProperty(value = "是否打开评论,0不打开,1打开")
private Integer need_open_comment;

@ApiModelProperty(value = "是否粉丝才可评论,0所有人可评论,1粉丝才可评论")
private Integer only_fans_can_comment;

}

package com.xu.wemall.pojo.news;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class Articles {

List<News> articles;

}

这里的的每个News里需要注意哪些属性是必填项,当需要thumb_media_id这个参数时候,请通过【获取永久素材列表】接口先获取

/**
* 获取素菜列表
* @return
*/
public String batchgetMaterial(String type, Integer offset, Integer count){

String accessToken = accessTokenUtil.getAccessToken();
if(accessToken != null){
String url = URIConstant.BATCHGET_MATERIAL_URL.replace("ACCESS_TOKEN", accessToken);
log.info("BATCHGET_MATERIAL_URL:{}",url);

JSONObject jsonObject = new JSONObject();
//素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
jsonObject.put("type", type);
//从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
jsonObject.put("offset", offset);
//返回素材的数量,取值在1到20之间
jsonObject.put("count", count);

//发起POST请求
String resultString = restTemplate.postForObject(url, jsonObject.toJSONString(),String.class);
return resultString;
}
return null;
}

我们在swagger里请求这个接口,获取到我们的永久素材的media_id

最后我们在NewsController中写一个方法,提交我们的图文素材,测试我们的代码

@ApiOperation(value = "上传图文素材")
@RequestMapping(value = "/addNews", method = RequestMethod.POST)
public Object addNews() throws Exception{

String result = newsUtil.addNews();
//log.info("resut:{}",JSONObject.parseObject(result).toJSONString());
return result;
}

最后在swagger中执行我们的提交图文素材的方法,提交成功并成功获取到我们的图文素材的media_id

到这里,我们成功上传了我们的永久图文素材,不放心的话我们可以调用我们的getMaterialcount【获取素菜数量】看看上传后的数据统计

好了,我们下回再见,拜拜!

如果您觉得此文有帮助,可以小小打赏一下,持续更新更有动力哟!

原文地址:https://www.cnblogs.com/xulijun137/p/12213652.html