金阿腾 發表於 2020-1-21 16:11:00

微信公众号开发之上传图文消息素材(十二)

<p>群发消息太重要了,公众号管理员需要定期通过公众号群发一些消息,用户通过推送的消息可以定期了解公众号的最新信息。</p>
<p>群发图文消息的过程如下:</p>
<ol>
<li>首先,预先将图文消息中需要用到的图片,使用上传图文消息内图片接口,上传成功并获得图片 URL;</li>
<li>上传图文消息素材,需要用到图片时,请使用上一步获取的图片 URL;</li>
<li>使用对用户标签的群发,或对 OpenID 列表的群发,将图文消息群发出去,群发时微信会进行原创校验,并返回群发操作结果;</li>
<li>在上述过程中,如果需要,还可以预览图文消息、查询群发状态,或删除已群发的消息等。</li>
</ol>
<p>群发图片、文本等其他消息类型的过程如下:</p>
<ol>
<li>如果是群发文本消息,则直接根据下面的接口说明进行群发即可;</li>
<li>如果是群发图片、视频等消息,则需要预先通过素材管理接口准备好 mediaID。</li>
</ol>
<p><strong>这一篇具体内容特别多,更多开发细节和注意事项请参考微信公众号开发文档【群发接口和原创校验】仔细阅读其他部分!!!</strong></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="19"><img src="https://img-blog.csdnimg.cn/20200119161749326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p><strong>目录【这是微信开发文档提供的目录,我们只演示部分重要的模块!!!】</strong></p>
<p>1 上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】</p>
<p>2 上传图文消息素材【订阅号与服务号认证后均可用】</p>
<p>3 根据标签进行群发【订阅号与服务号认证后均可用】</p>
<p>4 根据OpenID列表群发【订阅号不可用,服务号认证后可用】</p>
<p>5 删除群发【订阅号与服务号认证后均可用】</p>
<p>6 预览接口【订阅号与服务号认证后均可用】</p>
<p>7 查询群发消息发送状态【订阅号与服务号认证后均可用】</p>
<p>8 事件推送群发结果</p>
<p>9 使用 clientmsgid 参数,避免重复推送</p>
<p>10 控制群发速度</p>
<p id="上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】"><strong>一、上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】</strong></p>
<p>&nbsp;</p>
<p>请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。</p>
<p>接口调用请求说明</p>
<blockquote>http请求方式: POST 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"</blockquote>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="18"><img class="has cke_widget_element lazyload" alt="" width="1200" height="877" src="https://img-blog.csdnimg.cn/20200119164059162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119164059162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;877&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119164059162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="17">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;/**\n   上传图文消息内的图片获取URL\n   */\n    public String uploadimg(String filePath) {\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if (accessToken != null) {\n            String url = URIConstant.UPLOAD_IMG_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken);\n            log.info(\&amp;quot;UPLOAD_IMG_URL:{}\&amp;quot;,url);\n\n            //设置请求体,注意是LinkedMultiValueMap\n            MultiValueMap&amp;lt;String, Object&amp;gt; data = new LinkedMultiValueMap&amp;lt;&amp;gt;();\n\n            //设置上传文件\n            FileSystemResource fileSystemResource = new FileSystemResource(filePath);\n            data.add(\&amp;quot;media\&amp;quot;, fileSystemResource);\n\n            //上传文件,设置请求头\n            HttpHeaders httpHeaders = new HttpHeaders();\n            httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);\n            httpHeaders.setContentLength(fileSystemResource.getFile().length());\n\n            HttpEntity&amp;lt;MultiValueMap&amp;lt;String, Object&amp;gt;&amp;gt; requestEntity = new HttpEntity&amp;lt;MultiValueMap&amp;lt;String, Object&amp;gt;&amp;gt;(data,\n                  httpHeaders);\n            try{\n                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因\n//                ResponseEntity&amp;lt;JSONObject&amp;gt; resultEntity = restTemplate.exchange(url,\n//                        HttpMethod.POST, requestEntity, JSONObject.class);\n                String resultJSON = restTemplate.postForObject(url, requestEntity, String.class);\n                log.info(\&amp;quot;上传返回的信息是:{}\&amp;quot;,resultJSON);\n                return resultJSON;\n            }catch (Exception e){\n                log.error(e.getMessage());\n            }\n      }\n      return null;\n\n    }&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">/**
   上传图文消息内的图片获取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&lt;String, Object&gt; data = new LinkedMultiValueMap&lt;&gt;();

            //设置上传文件
            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&lt;MultiValueMap&lt;String, Object&gt;&gt; requestEntity = new HttpEntity&lt;MultiValueMap&lt;String, Object&gt;&gt;(data,
                  httpHeaders);
            try{
                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因
//                ResponseEntity&lt;JSONObject&gt; 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;

    }</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="16"><img class="has cke_widget_element lazyload" alt="" width="1200" height="639" src="https://img-blog.csdnimg.cn/20200119164220281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119164220281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;639&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119164220281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="15">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;@ApiOperation(value = \&amp;quot;上传图文消息内的图片获取URL\&amp;quot;)\n@RequestMapping(value = \&amp;quot;/uploadImg\&amp;quot;, method = RequestMethod.POST)\npublic Object uploadImg(String filePath) {\n\n    String result = newsUtil.uploadimg(filePath);\n    log.info(\&amp;quot;resut:{}\&amp;quot;,JSONObject.parseObject(result).toJSONString());\n    return result;\n}&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">@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;
}</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>我们在swagger中测试这个上传图文素材图片接口,填写一个正确的图片路径</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="14"><img class="has cke_widget_element lazyload" alt="" width="1200" height="669" src="https://img-blog.csdnimg.cn/20200119164656944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119164656944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;669&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119164656944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>结果如下</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="13"><img class="has cke_widget_element lazyload" alt="" width="1200" height="574" src="https://img-blog.csdnimg.cn/20200119164839656.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119164839656.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;574&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119164839656.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p><strong>二、上传图文消息素材【订阅号与服务号认证后均可用】</strong></p>
<p>接口调用请求说明</p>
<blockquote>
<p>http请求方式: POST https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN</p>
</blockquote>
<p>POST数据说明</p>
<p>POST数据示例如下:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="12">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;{\n   \&amp;quot;articles\&amp;quot;: [\t \n      {\n            \&amp;quot;thumb_media_id\&amp;quot;:\&amp;quot;qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p\&amp;quot;,\n            \&amp;quot;author\&amp;quot;:\&amp;quot;xxx\&amp;quot;,\t\t\n            \&amp;quot;title\&amp;quot;:\&amp;quot;Happy Day\&amp;quot;,\t\t \n            \&amp;quot;content_source_url\&amp;quot;:\&amp;quot;www.qq.com\&amp;quot;,\t\t\n            \&amp;quot;content\&amp;quot;:\&amp;quot;content\&amp;quot;,\t\t \n            \&amp;quot;digest\&amp;quot;:\&amp;quot;digest\&amp;quot;,\n            \&amp;quot;show_cover_pic\&amp;quot;:1,\n            \&amp;quot;need_open_comment\&amp;quot;:1,\n            \&amp;quot;only_fans_can_comment\&amp;quot;:1\n      },\t \n      {\n            \&amp;quot;thumb_media_id\&amp;quot;:\&amp;quot;qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p\&amp;quot;,\n            \&amp;quot;author\&amp;quot;:\&amp;quot;xxx\&amp;quot;,\t\t\n            \&amp;quot;title\&amp;quot;:\&amp;quot;Happy Day\&amp;quot;,\t\t \n            \&amp;quot;content_source_url\&amp;quot;:\&amp;quot;www.qq.com\&amp;quot;,\t\t\n            \&amp;quot;content\&amp;quot;:\&amp;quot;content\&amp;quot;,\t\t \n            \&amp;quot;digest\&amp;quot;:\&amp;quot;digest\&amp;quot;,\n            \&amp;quot;show_cover_pic\&amp;quot;:0,\n            \&amp;quot;need_open_comment\&amp;quot;:1,\n            \&amp;quot;only_fans_can_comment\&amp;quot;:1\n      }\n   ]\n}&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">{
   "articles": [       
      {
            "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
            "author":"xxx",               
            "title":"Happy Day",               
            "content_source_url":"www.qq.com",               
            "content":"content",               
            "digest":"digest",
            "show_cover_pic":1,
            "need_open_comment":1,
            "only_fans_can_comment":1
      },       
      {
            "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
            "author":"xxx",               
            "title":"Happy Day",               
            "content_source_url":"www.qq.com",               
            "content":"content",               
            "digest":"digest",
            "show_cover_pic":0,
            "need_open_comment":1,
            "only_fans_can_comment":1
      }
   ]
}</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>&nbsp;限于文章篇幅有限,字段详细说明请自行参照开发文档</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="11"><img class="has cke_widget_element lazyload" alt="" width="1200" height="908" src="https://img-blog.csdnimg.cn/20200120150651125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200120150651125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;908&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200120150651125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="10">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;package com.xu.wemall.pojo.news;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\n@ApiModel(value = \&amp;quot;新闻消息发送对象\&amp;quot;)\npublic class News {\n\n    @ApiModelProperty(value = \&amp;quot;标题\&amp;quot;)\n    private String title;\n\n    @ApiModelProperty(value = \&amp;quot;图文消息的封面图片素材id(必须是永久 media_ID)\&amp;quot;)\n    private String thumb_media_id;\n\n    @ApiModelProperty(value = \&amp;quot;作者\&amp;quot;)\n    private String author;\n\n    @ApiModelProperty(value = \&amp;quot;图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空\&amp;quot;)\n    private String digest;\n\n    @ApiModelProperty(value = \&amp;quot;是否显示封面,0为false,即不显示,1为true,即显示\&amp;quot;)\n    private Integer show_cover_pic;\n\n    @ApiModelProperty(value = \&amp;quot;图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS\&amp;quot;)\n    private String content;\n\n    @ApiModelProperty(value = \&amp;quot;图文消息的原文地址,即点击“阅读原文”后的URL\&amp;quot;)\n    private String content_source_url;\n\n    @ApiModelProperty(value = \&amp;quot;是否打开评论,0不打开,1打开\&amp;quot;)\n    private Integer need_open_comment;\n\n    @ApiModelProperty(value = \&amp;quot;是否粉丝才可评论,0所有人可评论,1粉丝才可评论\&amp;quot;)\n    private Integer only_fans_can_comment;\n\n}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">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;

}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="9"><img class="has cke_widget_element lazyload" alt="" width="1118" height="599" src="https://img-blog.csdnimg.cn/20200119165827270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119165827270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1118&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;599&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119165827270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="8">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;package com.xu.wemall.pojo.news;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@EqualsAndHashCode(callSuper = false)\npublic class Articles {\n\n    List&amp;lt;News&amp;gt; articles;\n\n}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">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<span class="hljs-tag">&lt;<span class="hljs-name">News&gt; articles;

}
</span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>&nbsp;这里重点要说一下<code class="language-html">thumb_media_id这个参数,他是一个上传永久图片素材type是thumb获得的media_id,,接口地址是</code></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="7">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&amp;amp;type=TYPE&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&amp;type=TYPE</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="6"><img class="has cke_widget_element lazyload" alt="" width="1200" height="831" src="https://img-blog.csdnimg.cn/20200119171742607.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119171742607.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;831&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119171742607.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="5">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;package com.xu.wemall.components.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.constants.URIConstant;\nimport com.xu.wemall.pojo.news.Articles;\nimport com.xu.wemall.pojo.news.News;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 功能:图文素材工具类\n */\n@Slf4j\n@Component\npublic class NewsUtil {\n\n    @Autowired\n    private RestTemplate restTemplate;\n\n    @Autowired\n    private AccessTokenUtil accessTokenUtil;\n\n    private Articles createArticles(){\n\n      Articles articles = new Articles();\n\n      List&amp;lt;News&amp;gt; dataList = new ArrayList&amp;lt;&amp;gt;();\n      Newsnews1 = new News();\n      news1.setTitle(\&amp;quot;标题\&amp;quot;);\n      news1.setThumb_media_id(\&amp;quot;J49eq_VE823b_wZH3Op4DFkLa4Lm4jkTSxX_VbiBWhY\&amp;quot;);\n      news1.setAuthor(\&amp;quot;作者\&amp;quot;);\n      news1.setDigest(\&amp;quot;图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。\&amp;quot;);\n      news1.setShow_cover_pic(1);//显示封面\n      news1.setContent(\&amp;quot;图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 \\\&amp;quot;上传图文消息内的图片获取URL\\\&amp;quot;接口获取。外部图片url将被过滤。\&amp;quot;);\n      news1.setContent_source_url(\&amp;quot;https://www.baidu.com/\&amp;quot;);//图文消息的原文地址,即点击“阅读原文”后的URL\n      news1.setNeed_open_comment(1);   //Uint32是否打开评论,0不打开,1打开\n      news1.setOnly_fans_can_comment(1);    //Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论\n\n\n      Newsnews2 = new News();\n      news2.setTitle(\&amp;quot;标题\&amp;quot;);\n      news2.setThumb_media_id(\&amp;quot;J49eq_VE823b_wZH3Op4DOvK45tuhPJfr3n1_h1w1h8\&amp;quot;);\n      news2.setAuthor(\&amp;quot;作者\&amp;quot;);\n      news2.setDigest(\&amp;quot;图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。\&amp;quot;);\n      news2.setShow_cover_pic(1);//显示封面\n      news2.setContent(\&amp;quot;图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 \\\&amp;quot;上传图文消息内的图片获取URL\\\&amp;quot;接口获取。外部图片url将被过滤。\&amp;quot;);\n      news2.setContent_source_url(\&amp;quot;https://www.baidu.com/\&amp;quot;);//图文消息的原文地址,即点击“阅读原文”后的URL\n      news2.setNeed_open_comment(1);   //Uint32是否打开评论,0不打开,1打开\n      news2.setOnly_fans_can_comment(1);    //Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论\n      dataList.add(news1);\n      dataList.add(news2);\n\n      articles.setArticles(dataList);\n      return articles;\n\n    }\n    /**\n   *新增永久图文素材\n   */\n    public String addNews() {\n\n      Articles articles = this.createArticles();\n      String accessToken = accessTokenUtil.getAccessToken();\n      if (accessToken != null) {\n            log.info(\&amp;quot;URL{}\&amp;quot;, URIConstant.ADD_NEWS_URL);\n            String url = URIConstant.ADD_NEWS_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken);\n            log.info(\&amp;quot;ADD_NEWS_URL:{}\&amp;quot;, url);\n\n            //将菜单对象转换成JSON字符串\n            String jsonNews = JSONObject.toJSONString(articles);\n            log.info(\&amp;quot;JSONNEWS:{}\&amp;quot;,jsonNews);\n\n            //发起POST请求创建菜单\n            String jsonObject = restTemplate.postForObject(url, jsonNews,String.class);\n\n            return jsonObject;\n      }\n      return null;\n    }\n\n    /**\n   *上传图文消息素材\n   */\n    public String uploadNews() {\n\n      Articles articles = this.createArticles();\n      String accessToken = accessTokenUtil.getAccessToken();\n      if (accessToken != null) {\n            log.info(\&amp;quot;URL{}\&amp;quot;, URIConstant.UPLOAD_NEWS_URL);\n            String url = URIConstant.UPLOAD_NEWS_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken);\n            log.info(\&amp;quot;UPLOAD_NEWS_URL:{}\&amp;quot;, url);\n\n            //将菜单对象转换成JSON字符串\n            String jsonNews = JSONObject.toJSONString(articles);\n            log.info(\&amp;quot;JSONNEWS:{}\&amp;quot;,jsonNews);\n\n            //发起POST请求创建菜单\n            String jsonObject = restTemplate.postForObject(url, jsonNews,String.class);\n\n            return jsonObject;\n      }\n      return null;\n    }\n\n    /**\n   上传图文消息内的图片获取URL\n   */\n    public String uploadimg(String filePath) {\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if (accessToken != null) {\n            String url = URIConstant.UPLOAD_IMG_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken);\n            log.info(\&amp;quot;UPLOAD_IMG_URL:{}\&amp;quot;,url);\n\n            //设置请求体,注意是LinkedMultiValueMap\n            MultiValueMap&amp;lt;String, Object&amp;gt; data = new LinkedMultiValueMap&amp;lt;&amp;gt;();\n\n            //设置上传文件\n            FileSystemResource fileSystemResource = new FileSystemResource(filePath);\n            data.add(\&amp;quot;media\&amp;quot;, fileSystemResource);\n\n            //上传文件,设置请求头\n            HttpHeaders httpHeaders = new HttpHeaders();\n            httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);\n            httpHeaders.setContentLength(fileSystemResource.getFile().length());\n\n            HttpEntity&amp;lt;MultiValueMap&amp;lt;String, Object&amp;gt;&amp;gt; requestEntity = new HttpEntity&amp;lt;MultiValueMap&amp;lt;String, Object&amp;gt;&amp;gt;(data,\n                  httpHeaders);\n            try{\n                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因\n//                ResponseEntity&amp;lt;JSONObject&amp;gt; resultEntity = restTemplate.exchange(url,\n//                        HttpMethod.POST, requestEntity, JSONObject.class);\n                String resultJSON = restTemplate.postForObject(url, requestEntity, String.class);\n                log.info(\&amp;quot;上传返回的信息是:{}\&amp;quot;,resultJSON);\n                return resultJSON;\n            }catch (Exception e){\n                log.error(e.getMessage());\n            }\n      }\n      return null;\n\n    }\n\n}\n\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.components.weixin;

import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.constants.URIConstant;
import com.xu.wemall.pojo.news.Articles;
import com.xu.wemall.pojo.news.News;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

/**
* 功能:图文素材工具类
*/
@Slf4j
@Component
public class NewsUtil {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private AccessTokenUtil accessTokenUtil;

    private Articles createArticles(){

      Articles articles = new Articles();

      List&lt;News&gt; dataList = new ArrayList&lt;&gt;();
      Newsnews1 = 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粉丝才可评论


      Newsnews2 = 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;
    }

    /**
   *上传图文消息素材
   */
    public String uploadNews() {

      Articles articles = this.createArticles();
      String accessToken = accessTokenUtil.getAccessToken();
      if (accessToken != null) {
            log.info("URL{}", URIConstant.UPLOAD_NEWS_URL);
            String url = URIConstant.UPLOAD_NEWS_URL.replace("ACCESS_TOKEN", accessToken);
            log.info("UPLOAD_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;
    }

    /**
   上传图文消息内的图片获取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&lt;String, Object&gt; data = new LinkedMultiValueMap&lt;&gt;();

            //设置上传文件
            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&lt;MultiValueMap&lt;String, Object&gt;&gt; requestEntity = new HttpEntity&lt;MultiValueMap&lt;String, Object&gt;&gt;(data,
                  httpHeaders);
            try{
                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因
//                ResponseEntity&lt;JSONObject&gt; 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;

    }

}

</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><code class="language-html">我们在Controller中添加我们的方法</code>&nbsp;</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="4"><img class="has cke_widget_element lazyload" alt="" width="1200" height="496" src="https://img-blog.csdnimg.cn/20200119171818499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200119171818499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;496&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200119171818499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="3">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;package com.xu.wemall.controller.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.components.weixin.NewsUtil;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * 类名称: NewsController\n * 类描述: 图文素材接口\n */\n@Slf4j\n@RestController\n@Api(tags = \&amp;quot;图文素材接口\&amp;quot;)\n@RequestMapping(value = \&amp;quot;/news\&amp;quot;)\npublic class NewsController {\n\n    @Autowired\n    private NewsUtil newsUtil;\n\n    @ApiOperation(value = \&amp;quot;上传图文素材\&amp;quot;)\n    @RequestMapping(value = \&amp;quot;/addNews\&amp;quot;, method = RequestMethod.POST)\n    public Object addNews() throws Exception{\n\n      String result = newsUtil.addNews();\n      //log.info(\&amp;quot;resut:{}\&amp;quot;,JSONObject.parseObject(result).toJSONString());\n      return result;\n    }\n\n    @ApiOperation(value = \&amp;quot;上传图文消息素材\&amp;quot;)\n    @RequestMapping(value = \&amp;quot;/uploadNews\&amp;quot;, method = RequestMethod.POST)\n    public Object uploadNews() throws Exception{\n\n      String result = newsUtil.uploadNews();\n      //log.info(\&amp;quot;resut:{}\&amp;quot;,JSONObject.parseObject(result).toJSONString());\n      return result;\n    }\n\n    @ApiOperation(value = \&amp;quot;上传图文消息内的图片获取URL\&amp;quot;)\n    @RequestMapping(value = \&amp;quot;/uploadImg\&amp;quot;, method = RequestMethod.POST)\n    public Object uploadImg(String filePath) {\n\n      String result = newsUtil.uploadimg(filePath);\n      log.info(\&amp;quot;resut:{}\&amp;quot;,JSONObject.parseObject(result).toJSONString());\n      return result;\n    }\n\n\n\n}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.controller.weixin;

import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.components.weixin.NewsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
* 类名称: NewsController
* 类描述: 图文素材接口
*/
@Slf4j
@RestController
@Api(tags = "图文素材接口")
@RequestMapping(value = "/news")
public class NewsController {

    @Autowired
    private NewsUtil newsUtil;

    @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;
    }

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

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

    @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;
    }



}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>打开swagger,测试一下我们的controller方法,我们先上传几个type=thumb的永久素材</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="2"><img class="has cke_widget_element lazyload" alt="" width="1200" height="774" src="https://img-blog.csdnimg.cn/20200120151042975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200120151042975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;774&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200120151042975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>获得media_id后设置到我们的</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="1"><img class="has cke_widget_element lazyload" alt="" width="1200" height="819" src="https://img-blog.csdnimg.cn/20200120151249893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200120151249893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;819&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200120151249893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>最后上传图文消息素材</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="0"><img class="has cke_widget_element lazyload" alt="" width="1200" height="598" src="https://img-blog.csdnimg.cn/20200120151431146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200120151431146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;598&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200120151431146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>如果需要在群发图文中插入小程序,则在调用上传图文消息素材接口时,需在content字段中添加小程序跳转链接,有三种样式的可供选择,具体请仔细参考开发文档【群发接口和原创校验】</p>
<p>今天的内容先到这里,我们下回再见!</p>
<h3>如果您觉得此文有帮助,可以小小打赏一下,持续更新更有动力哟!</h3>
<p><img alt="" width="218" height="274" data-src="https://img2020.cnblogs.com/blog/1501920/202004/1501920-20200402133129576-79870337.png"><img src="https://img2020.cnblogs.com/blog/1501920/202004/1501920-20200402133221455-2112921293.png"></p><br><br>
来源:https://www.cnblogs.com/xulijun137/p/12222127.html
頁: [1]
查看完整版本: 微信公众号开发之上传图文消息素材(十二)