微信公眾號開發之新增永久圖文素材(十)


一、上傳圖文消息內的圖片獲取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【獲取素菜數量】看看上傳后的數據統計

好了,我們下回再見,拜拜!

 

如果您覺得此文有幫助,可以小小打賞一下,持續更新更有動力喲!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM