zoukankan      html  css  js  c++  java
  • 微信公众号开发之新增永久图文素材(十)

    一、上传图文消息内的图片获取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【获取素菜数量】看看上传后的数据统计

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

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

  • 相关阅读:
    Informix IDS 11零碎规画(918考试)认证指南,第 7 部分: IDS复制(15)
    Informix IDS 11琐屑管理(918考试)认证指南,第 7 局部: IDS复制(10)
    近期招聘
    Classes 单元下的公用函数目录
    Graphics 单元下的公用函数目录
    CnPack 使用的组件命名约定
    Windows 单元下的公用函数目录(RZ_)
    Variants 单元下的公用函数目录
    StrUtils 单元下的公用函数目录
    Math 单元下的公用函数目录
  • 原文地址:https://www.cnblogs.com/xulijun137/p/12213652.html
Copyright © 2011-2022 走看看