微信公众号开发之回复图文消息(十一)
<p><span style="font-family: 黑体">有时候我们希望用户点击我们的菜单时候,微信公众号给他回复我们自定义的图文消息,先看开发文档接口</span></p><h2 id="回复图文消息"><span style="font-family: 黑体">回复图文消息</span></h2>
<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="{&quot;code&quot;:&quot;&lt;xml&gt;\n&lt;ToUserName&gt;&lt;!]&gt;&lt;/ToUserName&gt;\n&lt;FromUserName&gt;&lt;!]&gt;&lt;/FromUserName&gt;\n&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;\n&lt;MsgType&gt;&lt;!]&gt;&lt;/MsgType&gt;\n&lt;ArticleCount&gt;1&lt;/ArticleCount&gt;\n&lt;Articles&gt;\n &lt;item&gt;\n &lt;Title&gt;&lt;!]&gt;&lt;/Title&gt;\n &lt;Description&gt;&lt;!]&gt;&lt;/Description&gt;\n &lt;PicUrl&gt;&lt;!]&gt;&lt;/PicUrl&gt;\n &lt;Url&gt;&lt;!]&gt;&lt;/Url&gt;\n &lt;/item&gt;\n&lt;/Articles&gt;\n&lt;/xml&gt;\n\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="hljs"><xml>
<ToUserName><!]></ToUserName>
<FromUserName><!]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><!]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><!]></Title>
<Description><!]></Description>
<PicUrl><!]></PicUrl>
<Url><!]></Url>
</item>
</Articles>
</xml>
</code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<table class=" cke_show_border">
<thead>
<tr><th><span style="font-family: 黑体">参数</span></th><th><span style="font-family: 黑体">是否必须</span></th><th><span style="font-family: 黑体">说明</span></th></tr>
</thead>
<tbody>
<tr>
<td><span style="font-family: 黑体">ToUserName</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">接收方帐号(收到的OpenID)</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">FromUserName</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">开发者微信号</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">CreateTime</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">消息创建时间 (整型)</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">MsgType</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">消息类型,图文为news</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">ArticleCount</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">图文消息个数;当用户发送文本、图片、视频、图文、地理位置这五种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">Articles</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">Title</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">图文消息标题</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">Description</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">图文消息描述</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">PicUrl</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200</span></td>
</tr>
<tr>
<td><span style="font-family: 黑体">Url</span></td>
<td><span style="font-family: 黑体">是</span></td>
<td><span style="font-family: 黑体">点击图文消息跳转链接</span></td>
</tr>
</tbody>
</table>
<p><span style="font-family: 黑体">先定义我们的发送体POJO,一个是Article,一个是NewsMessage</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" 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="744" src="https://img-blog.csdnimg.cn/20200113114222893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113114222893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;744&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113114222893.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><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" 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="747" src="https://img-blog.csdnimg.cn/20200113114142831.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113114142831.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;747&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113114142831.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="12">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;Article.java\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">Article.java
</code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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>
<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="11">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.pojo.message;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.NoArgsConstructor;\n/**\n * \n * @Description: 图文model\n * @Parameters: \n * @Return: \n * @Create Date: \n * @Version: V1.00\n * @author: 来日可期\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@EqualsAndHashCode(callSuper = false)\npublic class Article {\n\n //图文消息名称\n private String Title;\n\n //图文消息描述\n private String Description;\n\n //图片链接,支持JPG、PNG格式,较好的效果为大图640像素*320像素,小图80像素*80像素\n private String PicUrl;\n\n //点击图文消息跳转链接\n private String Url;\n\n}\n\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">package com.xu.wemall.pojo.message;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
*
* @Description: 图文model
* @Parameters:
* @Return:
* @Create Date:
* @Version: V1.00
* @author: 来日可期
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class Article {
//图文消息名称
private String Title;
//图文消息描述
private String Description;
//图片链接,支持JPG、PNG格式,较好的效果为大图640像素*320像素,小图80像素*80像素
private String PicUrl;
//点击图文消息跳转链接
private String Url;
}
</code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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>
<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="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;NewsMessage.java&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">NewsMessage.java</code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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>
<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="9">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.pojo.message;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n/**\n *\n * @Description: 图文消息\n * @Parameters:\n * @Return:\n * @Create Date:\n * @Version: V1.00\n * @author: 来日可期\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@EqualsAndHashCode(callSuper = false)\npublic class NewsMessage extends BaseMessage {\n\n //图文消息个数,限制为10条以内\n private int ArticleCount;\n\n //多条图文消息信息,默认第一个item为大图\n private List&lt;Article&gt; Articles;\n\n}\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">package com.xu.wemall.pojo.message;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.List;
/**
*
* @Description: 图文消息
* @Parameters:
* @Return:
* @Create Date:
* @Version: V1.00
* @author: 来日可期
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class NewsMessage extends BaseMessage {
//图文消息个数,限制为10条以内
private int ArticleCount;
//多条图文消息信息,默认第一个item为大图
private List<span class="hljs-tag"><<span class="hljs-name">Article> Articles;
}
</span></span></code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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 style="font-family: 黑体">定义一个方法回复图文消息</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="8"><img class="has cke_widget_element lazyload" alt="" width="1200" height="922" src="https://img-blog.csdnimg.cn/20200113114459458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113114459458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;922&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113114459458.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="7">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;/**\n * 回复文本图片\n * @param toUserName\n * @param fromUserName\n * @param articles\n * @return\n */\npublic String replyForArticles(String toUserName, String fromUserName, List&lt;Article&gt; articles) throws Exception{\n\n log.info(\&quot;这是图文消息回复!\&quot;);\n NewsMessage newsMessage = new NewsMessage();\n //必填\n newsMessage.setFromUserName(toUserName);\n //必填\n newsMessage.setToUserName(fromUserName);\n //必填\n newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);\n //必填\n newsMessage.setCreateTime( LocalDateTime.now().toInstant(ZoneOffset.of(\&quot;+8\&quot;)).toEpochMilli());\n\n //当用户发送文本、图片、视频、图文、地理位置这五种消息时,开发者只能回复1条图文消息\n newsMessage.setArticleCount(1);\n\n if (!articles.isEmpty()) {\n newsMessage.setArticles(articles);\n String xmlString = MessageUtil.newsMessageToXml(newsMessage);\n log.info(xmlString);\n\n return xmlString;\n }\n return null;\n}&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">/**
* 回复文本图片
* @param toUserName
* @param fromUserName
* @param articles
* @return
*/
public String replyForArticles(String toUserName, String fromUserName, List<span class="hljs-tag"><<span class="hljs-name">Article> articles) throws Exception{
log.info("这是图文消息回复!");
NewsMessage newsMessage = new NewsMessage();
//必填
newsMessage.setFromUserName(toUserName);
//必填
newsMessage.setToUserName(fromUserName);
//必填
newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
//必填
newsMessage.setCreateTime( LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
//当用户发送文本、图片、视频、图文、地理位置这五种消息时,开发者只能回复1条图文消息
newsMessage.setArticleCount(1);
if (!articles.isEmpty()) {
newsMessage.setArticles(articles);
String xmlString = MessageUtil.newsMessageToXml(newsMessage);
log.info(xmlString);
return xmlString;
}
return null;
}</span></span></code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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 style="font-family: 黑体">这里有个MessageUtil.newsMessageToXml(newsMessage)方法</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" 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="582" src="https://img-blog.csdnimg.cn/20200113114638917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113114638917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;582&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113114638917.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="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;/**\n * @param newsMessage\n * @return xml\n * @Description: 图文消息对象转换成xml\n * @date 2016-12-01\n */\n\npublic static String newsMessageToXml(NewsMessage newsMessage) {\n xstream.alias(\&quot;xml\&quot;, newsMessage.getClass());\n xstream.alias(\&quot;item\&quot;, new Article().getClass());\n return xstream.toXML(newsMessage);\n}&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">/**
* @param newsMessage
* @return xml
* @Description: 图文消息对象转换成xml
* @date 2016-12-01
*/
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);
}</code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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 style="font-family: 黑体">现在测试一下我们的代码,我们需要在我们的菜单里触发我们的方法,我们这里采用</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" 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="1119" height="592" src="https://img-blog.csdnimg.cn/20200113114852572.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113114852572.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1119&quot;,&quot;height&quot;:&quot;592&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113114852572.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><span style="font-family: 黑体">如果需要重新生成菜单,请重新生成一次,然后我们在微信接入的核心controller中写我们的响应代码</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="3"><img class="has cke_widget_element lazyload" alt="" width="1200" height="837" src="https://img-blog.csdnimg.cn/2020011311501357.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/2020011311501357.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;837&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/2020011311501357.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="2">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.controller.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.utils.CheckUtil;\nimport com.xu.wemall.components.weixin.MessageUtil;\nimport com.xu.wemall.components.weixin.WeiXinUserUtil;\nimport com.xu.wemall.pojo.message.Article;\nimport io.swagger.annotations.Api;\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.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.PrintWriter;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 类名称: LoginController\n * 类描述: 与微信对接登陆验证\n *\n * @author RonnieXu\n * 创建时间:2017年12月5日上午10:52:13\n */\n@Slf4j\n@RestController\n@Api(tags = \&quot;接入验证接口\&quot;)\n@RequestMapping(value = \&quot;/weChart\&quot;)\npublic class WeiXinController {\n\n @Autowired\n private WeiXinUserUtil weiXinUserUtil;\n\n @Autowired\n private MessageUtil messageUtil;\n\n @RequestMapping(value = \&quot;/connect\&quot;, method = RequestMethod.GET)\n public String connect(@RequestParam(value = \&quot;signature\&quot;) String signature,\n @RequestParam(value = \&quot;timestamp\&quot;) String timestamp,\n @RequestParam(value = \&quot;nonce\&quot;) String nonce,\n @RequestParam(value = \&quot;echostr\&quot;) String echostr) {\n\n log.info(\&quot;-----开始校验签名-----\&quot;);\n PrintWriter out = null;\n if (CheckUtil.checkSignature(signature, timestamp, nonce)) {\n log.info(\&quot;-----签名校验通过-----\&quot;);\n return echostr;\n } else {\n log.info(\&quot;-----校验签名失败-----\&quot;);\n return null;\n }\n\n }\n\n @RequestMapping(value = \&quot;connect\&quot;, method = RequestMethod.POST)\n public String dopost(HttpServletRequest request, HttpServletResponse response) throws Exception {\n\n response.setCharacterEncoding(\&quot;utf-8\&quot;);\n\n //将微信请求xml转为map格式,获取所需的参数\n Map&lt;String, String&gt; map = MessageUtil.parseXml(request);\n String ToUserName = map.get(\&quot;ToUserName\&quot;);\n String FromUserName = map.get(\&quot;FromUserName\&quot;);\n String MsgType = map.get(\&quot;MsgType\&quot;);\n String Content = map.get(\&quot;Content\&quot;);\n String Event = map.get(\&quot;Event\&quot;);\n String EventKey = map.get(\&quot;EventKey\&quot;);\n\n if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(MsgType)){\n\n if(MessageUtil.EVENT_TYPE_SUBSCRIBE.equals(Event)){\n String xmlString = messageUtil.subscribeForText(ToUserName,FromUserName);\n\n //关注了公众号,调用接口获得用户的详细信息并保存到后台\n JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);\n log.info(\&quot;获取用户的详细信息:{}\&quot;,jsonObject.toJSONString());\n\n return xmlString;\n\n }else if(MessageUtil.EVENT_TYPE_UNSUBSCRIBE.equals(Event)){\n\n String xmlString = messageUtil.unsubscribeForText(ToUserName,FromUserName);\n return xmlString;\n\n }else if(MessageUtil.EVENT_TYPE_SCAN.equals(Event)){\n JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);\n log.info(\&quot;获取用户的详细信息:{}\&quot;,jsonObject.toJSONString());\n\n }\n\n }\n\n //处理文本类型,实现输入1,回复相应的封装的内容\n if (MessageUtil.REQ_MESSAGE_TYPE_TEXT.equals(MsgType)) {\n String xmlString = messageUtil.replyForText(ToUserName,FromUserName,\&quot;你发送的是:\&quot; + Content);\n log.info(xmlString);\n return xmlString;\n\n }\n\n if (MessageUtil.REQ_MESSAGE_TYPE_IMAGE.equals(MsgType)) {\n\n String filePath = \&quot;C:\\\\Users\\\\RonnieXu\\\\Pictures\\\\2.jpg\&quot;;\n String xmlString = messageUtil.replyForImage(ToUserName,FromUserName,filePath);\n return xmlString;\n }\n\n if (\&quot;1\&quot;.equals(EventKey)) {\n\n List&lt;Article&gt; articles = new ArrayList&lt;&gt;();\n Article article = new Article();\n article.setTitle(\&quot;Hello, Ronnie\&quot;);\n article.setDescription(\&quot;这是一条描述,这是一条描述\&quot;);\n article.setPicUrl(\&quot;https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png?where=super\&quot;);\n article.setUrl(\&quot;https://www.baidu.com/\&quot;);\n articles.add(article);\n\n String xmlString = messageUtil.replyForArticles(ToUserName,FromUserName,articles);\n return xmlString;\n }\n\n return null;\n }\n\n}\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><span style="font-family: 黑体"><code class="language-html hljs">package com.xu.wemall.controller.weixin;
import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.utils.CheckUtil;
import com.xu.wemall.components.weixin.MessageUtil;
import com.xu.wemall.components.weixin.WeiXinUserUtil;
import com.xu.wemall.pojo.message.Article;
import io.swagger.annotations.Api;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 类名称: LoginController
* 类描述: 与微信对接登陆验证
*
* @author RonnieXu
* 创建时间:2017年12月5日上午10:52:13
*/
@Slf4j
@RestController
@Api(tags = "接入验证接口")
@RequestMapping(value = "/weChart")
public class WeiXinController {
@Autowired
private WeiXinUserUtil weiXinUserUtil;
@Autowired
private MessageUtil messageUtil;
@RequestMapping(value = "/connect", method = RequestMethod.GET)
public String connect(@RequestParam(value = "signature") String signature,
@RequestParam(value = "timestamp") String timestamp,
@RequestParam(value = "nonce") String nonce,
@RequestParam(value = "echostr") String echostr) {
log.info("-----开始校验签名-----");
PrintWriter out = null;
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
log.info("-----签名校验通过-----");
return echostr;
} else {
log.info("-----校验签名失败-----");
return null;
}
}
@RequestMapping(value = "connect", method = RequestMethod.POST)
public String dopost(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setCharacterEncoding("utf-8");
//将微信请求xml转为map格式,获取所需的参数
Map<span class="hljs-tag"><<span class="hljs-name">String, <span class="hljs-attr">String> map = MessageUtil.parseXml(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String Event = map.get("Event");
String EventKey = map.get("EventKey");
if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(MsgType)){
if(MessageUtil.EVENT_TYPE_SUBSCRIBE.equals(Event)){
String xmlString = messageUtil.subscribeForText(ToUserName,FromUserName);
//关注了公众号,调用接口获得用户的详细信息并保存到后台
JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);
log.info("获取用户的详细信息:{}",jsonObject.toJSONString());
return xmlString;
}else if(MessageUtil.EVENT_TYPE_UNSUBSCRIBE.equals(Event)){
String xmlString = messageUtil.unsubscribeForText(ToUserName,FromUserName);
return xmlString;
}else if(MessageUtil.EVENT_TYPE_SCAN.equals(Event)){
JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);
log.info("获取用户的详细信息:{}",jsonObject.toJSONString());
}
}
//处理文本类型,实现输入1,回复相应的封装的内容
if (MessageUtil.REQ_MESSAGE_TYPE_TEXT.equals(MsgType)) {
String xmlString = messageUtil.replyForText(ToUserName,FromUserName,"你发送的是:" + Content);
log.info(xmlString);
return xmlString;
}
if (MessageUtil.REQ_MESSAGE_TYPE_IMAGE.equals(MsgType)) {
String filePath = "C:\\Users\\RonnieXu\\Pictures\\2.jpg";
String xmlString = messageUtil.replyForImage(ToUserName,FromUserName,filePath);
return xmlString;
}
if ("1".equals(EventKey)) {
List<span class="hljs-tag"><<span class="hljs-name">Article> articles = new ArrayList<span class="hljs-tag"><>();
Article article = new Article();
article.setTitle("Hello, Ronnie");
article.setDescription("这是一条描述,这是一条描述");
article.setPicUrl("https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png?where=super");
article.setUrl("https://www.baidu.com/");
articles.add(article);
String xmlString = messageUtil.replyForArticles(ToUserName,FromUserName,articles);
return xmlString;
}
return null;
}
}
</span></span></span></span></span></span></code></span></pre>
<span class="cke_reset cke_widget_drag_handler_container" style="font-family: 黑体"><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 style="font-family: 黑体">点击我们的微信公众号子菜单,触发我们的方法,可以看到我们收到了一个titile是“Hello,Ronnie”的图文消息</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" 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="1166" height="859" src="https://img-blog.csdnimg.cn/20200113115206663.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113115206663.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1166&quot;,&quot;height&quot;:&quot;859&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113115206663.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><span style="font-family: 黑体">点击这个图文消息,我们就进入我们设置的URL页面,这里我们设置是百度首页,呵呵呵(捂脸中)</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" style="font-family: 黑体" 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="1022" src="https://img-blog.csdnimg.cn/20200113115343962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200113115343962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;1022&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200113115343962.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><span style="font-family: 黑体">今天的内容到此为止,谢谢观看,下回再见!</span></p>
<p> </p>
<h3>如果您觉得此文有帮助,可以小小打赏一下,持续更新更有动力哟!</h3>
<p> </p>
<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>
<p> </p><br><br>
来源:https://www.cnblogs.com/xulijun137/p/12213663.html
頁:
[1]