热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java对接微信第三篇之订阅发送图文消息给用户

在第二篇的基础上,把订阅响应事件下的,发送文本消息接口替换成发送图文消息的接口。创建图文消息NewsMessagenewsMessagenewNewsM

在第二篇的基础上,把订阅响应事件下的,发送文本消息接口替换成发送图文消息的接口。

// 创建图文消息NewsMessage newsMessage = new NewsMessage();newsMessage.setToUserName(fromUserName);newsMessage.setFromUserName(toUserName);newsMessage.setCreateTime(System.currentTimeMillis());newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);newsMessage.setFuncFlag(0);List

articleList = new ArrayList
();Article article = new Article();article.setTitle("达达超人");article.setDescription("谢谢您的关注");article.setPicUrl("https://avatar.csdn.net/1/E/1/3_qq_31122833.jpg");article.setUrl("https://blog.csdn.net/qq_31122833");articleList.add(article);newsMessage.setArticleCount(articleList.size());newsMessage.setArticles(articleList);message = MessageUtil.newsMessageToXml(newsMessage);

其中:NewsMessage

public class NewsMessage extends BaseMessage { // 图文消息个数,限制为10条以内private int ArticleCount; // 多条图文消息信息,默认第一个item为大图private List

Articles; public int getArticleCount() { return ArticleCount; } public void setArticleCount(int articleCount) { ArticleCount = articleCount; } public List
getArticles() { return Articles; } public void setArticles(List
articles) { Articles = articles; }
}

Article:

public class Article { // 图文消息名称 private String Title;// 图文消息描述 private String Description;// 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致 private String PicUrl;// 点击图文消息跳转链接 private String Url; public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getDescription() { return null == Description ? "" : Description; } public void setDescription(String description) { Description = description; } public String getPicUrl() { return null == PicUrl ? "" : PicUrl; } public void setPicUrl(String picUrl) { PicUrl = picUrl; } public String getUrl() { return null == Url ? "" : Url; } public void setUrl(String url) { Url = url; } }

MessageUtil:

public class MessageUtil {private static Logger logger &#61; Logger.getLogger(MessageUtil.class);/*** 返回消息类型&#xff1a;文本*/public static final String RESP_MESSAGE_TYPE_TEXT &#61; "text";/*** 返回消息类型&#xff1a;音乐*/public static final String RESP_MESSAGE_TYPE_MUSIC &#61; "music";/*** 返回消息类型&#xff1a;图文*/public static final String RESP_MESSAGE_TYPE_NEWS &#61; "news";/*** 请求消息类型&#xff1a;文本*/public static final String REQ_MESSAGE_TYPE_TEXT &#61; "text";/*** 请求消息类型&#xff1a;图片*/public static final String REQ_MESSAGE_TYPE_IMAGE &#61; "image";/*** 请求消息类型&#xff1a;链接*/public static final String REQ_MESSAGE_TYPE_LINK &#61; "link";/*** 请求消息类型&#xff1a;地理位置*/public static final String REQ_MESSAGE_TYPE_LOCATION &#61; "location";/*** 请求消息类型&#xff1a;音频*/public static final String REQ_MESSAGE_TYPE_VOICE &#61; "voice";/*** 请求消息类型&#xff1a;推送*/public static final String REQ_MESSAGE_TYPE_EVENT &#61; "event";/*** 事件类型&#xff1a;群发消息返回*/public static final String EVENT_TYPE_MASSSENDJOBFINISH &#61; "MASSSENDJOBFINISH";/*** 事件类型&#xff1a;小程序审核通过*/public static final String EVENT_TYPE_SMALLLROUTINE_PASS &#61; "weapp_audit_success";/*** 事件类型&#xff1a;小程序审核通过*/public static final String EVENT_TYPE_SMALLLROUTINE_FAIL &#61; "weapp_audit_fail";/*** 事件类型&#xff1a;subscribe(订阅)*/public static final String EVENT_TYPE_SUBSCRIBE &#61; "subscribe";/*** 事件类型&#xff1a;LOCATION(地理位置推送)*/public static final String EVENT_TYPE_LOCATION &#61; "LOCATION";/*** 事件类型&#xff1a;unsubscribe(取消订阅)*/public static final String EVENT_TYPE_UNSUBSCRIBE &#61; "unsubscribe";/*** 领取卡券事件*/public static final String EVENT_TYPE_USER_GET_CARD&#61;"user_get_card";public static final String EVENT_TYPE_COUPONS_GET &#61; "GetCoupons";/*** 卡券审核通过*/public static final String EVENT_TYPE_CARD_PASS_CHECK&#61;"card_pass_check";/*** 用户删除卡券*/public static final String EVENT_USER_DEL_CARD&#61;"user_del_card";/*** 卡券审核不通过*/public static final String EVENT_TYPE_CARD_NOT_PASS_CHECK&#61;"card_not_pass_check";/*** 微信自定义菜单文字点击事件*/public static final String EVENT_TYPE_WECHATMENU_TEXT_CHECK&#61;"wechat_menu_text";/*** 微信自定义菜单图文点击事件*/public static final String EVENT_TYPE_WECHATMENU_NEWS_CHECK&#61;"wechat_menu_news";/*** */public static final String EVENT_TYPE_WIFI_CONNECT &#61;"WifiConnected";/*** 微信门店审核通过*/public static final String EVENT_TYPE_POI_CHECK_NOTIFY&#61;"poi_check_notify";/*** 事件类型&#xff1a;CLICK(自定义菜单点击事件)*/public static final String EVENT_TYPE_CLICK &#61; "CLICK";/** 组装文本消息*/public static String textMsg(String toUserName,String fromUserName,String content){TextMessage text &#61; new TextMessage();text.setFromUserName(toUserName);text.setToUserName(fromUserName);text.setMsgType(REQ_MESSAGE_TYPE_TEXT);text.setCreateTime(new Date().getTime());text.setContent(content);return textMessageToXml(text);}/** 响应订阅事件--回复文本消息*/public static String subscribeForText(String toUserName,String fromUserName){return textMsg(toUserName, fromUserName, "欢迎关注&#xff0c;精彩内容不容错过&#xff01;&#xff01;&#xff01;");}/** 响应取消订阅事件*/public static String unsubscribe(String toUserName,String fromUserName){//TODO 可以进行取关后的其他后续业务处理System.out.println("用户&#xff1a;"&#43; fromUserName &#43;"取消关注~");return "";}/*** 解析微信发来的请求&#xff08;XML&#xff09;* * &#64;param request* &#64;return* &#64;throws Exception*/&#64;SuppressWarnings("unchecked")public static Map parseXml(HttpServletRequest request) throws Exception {// 将解析结果存储在HashMap中Map map &#61; new HashMap();// 从request中取得输入流InputStream inputStream &#61; request.getInputStream();// 读取输入流SAXReader reader &#61; new SAXReader();Document document &#61; reader.read(inputStream);// 得到xml根元素Element root &#61; document.getRootElement();// 得到根元素的所有子节点List elementList &#61; root.elements();// 遍历所有子节点for (Element e : elementList)map.put(e.getName(), e.getText());// 释放资源inputStream.close();inputStream &#61; null;return map;}/*** 文本消息对象转换成xml* * &#64;param textMessage 文本消息对象* &#64;return xml*/public static String textMessageToXml(TextMessage textMessage) {xstream.alias("xml", textMessage.getClass());return xstream.toXML(textMessage);}/*** 文本消息对象转换成xml* * &#64;param voiceMessage 语音消息对象* &#64;return xml*/public static String messageToXml(VoiceMessage voiceMessage) {xstream.alias("xml", voiceMessage.getClass());return xstream.toXML(voiceMessage);}/*** 文本消息对象转换成xml* * &#64;param videoMessage 视频消息对象* &#64;return xml*/public static String messageToXml(VideoMessage videoMessage) {xstream.alias("xml", videoMessage.getClass());return xstream.toXML(videoMessage);}/*** 音乐消息对象转换成xml* * &#64;param musicMessage 音乐消息对象* &#64;return xml*/public static String musicMessageToXml(MusicMessage musicMessage) {xstream.alias("xml", musicMessage.getClass());return xstream.toXML(musicMessage);}/*** 图文消息对象转换成xml* * &#64;param newsMessage 图文消息对象* &#64;return xml*/public static String newsMessageToXml(NewsMessage newsMessage) {xstream.alias("xml", newsMessage.getClass());xstream.alias("item", new Article().getClass());return xstream.toXML(newsMessage);}/*** 扩展xstream&#xff0c;使其支持CDATA块* * &#64;date 2013-05-19*/private static XStream xstream &#61; new XStream(new XppDriver() {public HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out) {// 对所有xml节点的转换都增加CDATA标记boolean cdata &#61; true;&#64;SuppressWarnings("unchecked")public void startNode(String name, Class clazz) {super.startNode(name, clazz);}protected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("");} else {writer.write(text);}}};}});/** * 判断是否是QQ表情 * * &#64;param content * &#64;return */ public static boolean isQqFace(String content) { boolean result &#61; false; // 判断QQ表情的正则表达式 String qqfaceRegex &#61; "/::\\)|/::~|/::B|/::\\||/:8-\\)|/::<|/::$|/::X|/::Z|/::&#39;\\(|/::-\\||/::&#64;|/::P|/::D|/::O|/::\\(|/::\\&#43;|/:--b|/::Q|/::T|/:,&#64;P|/:,&#64;-D|/::d|/:,&#64;o|/::g|/:\\|-\\)|/::!|/::L|/::>|/::,&#64;|/:,&#64;f|/::-S|/:\\?|/:,&#64;x|/:,&#64;&#64;|/::8|/:,&#64;!|/:!!!|/:xx|/:bye|/:wipe|/:dig|/:handclap|/:&-\\(|/:B-\\)|/:<&#64;|/:&#64;>|/::-O|/:>-\\||/:P-\\(|/::&#39;\\||/:X-\\)|/::\\*|/:&#64;x|/:8\\*|/:pd|/:|/:beer|/:basketb|/:oo|/:coffee|/:eat|/:pig|/:rose|/:fade|/:showlove|/:heart|/:break|/:cake|/:li|/:bome|/:kn|/:footb|/:ladybug|/:shit|/:moon|/:sun|/:gift|/:hug|/:strong|/:weak|/:share|/:v|/:&#64;\\)|/:jj|/:&#64;&#64;|/:bad|/:lvu|/:no|/:ok|/:love|/:|/:jump|/:shake|/:|/:circle|/:kotow|/:turn|/:skip|/:oY|/:#-0|/:hiphot|/:kiss|/:<&|/:&>"; Pattern p &#61; Pattern.compile(qqfaceRegex); Matcher m &#61; p.matcher(content); if (m.matches()) { result &#61; true; } return result; } /** * 演示Java中常用的获取long类型时间的两种方式 */ public static void main(String[] args) { long longTime &#61; 1373206143378L; String stdFormatTime &#61; formatTime(longTime); // 输出格式&#xff1a;2013-07-07 22:09:03 logger.info(stdFormatTime); } /** * 将long类型的时间转换成标准格式&#xff08;yyyy-MM-dd HH:mm:ss&#xff09; * * &#64;param longTime * &#64;return */ public static String formatTime(long longTime) { DateFormat format &#61; new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return format.format(new Date(longTime)); }
}

效果&#xff1a;

 


推荐阅读
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • Java实现实时更新的日期与时间显示
    本文介绍了如何使用Java编程语言来创建一个能够实时更新显示系统当前日期和时间的小程序。通过使用Swing库中的组件和定时器功能,可以实现界面友好且功能强大的时间显示应用。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • spring(22)JdbcTemplate
    2019独角兽企业重金招聘Python工程师标准###1.导入jar包,必须jar包:c3p0、mysql-connector、beans、con ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 为什么会崩溃? ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • 本文介绍了如何通过创建自定义 XML 文件来修改 Android 中 Spinner 的项样式,包括颜色和大小的调整。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • Docker 中创建 CentOS 容器并安装 MySQL 进行本地连接
    本文详细介绍了如何在 Docker 中创建 CentOS 容器,并在容器中安装 MySQL 以实现本地连接。文章内容包括镜像拉取、容器创建、MySQL 安装与配置等步骤。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在安装 iOS 开发所需的 CocoaPods 时,用户可能会遇到多种问题。其中一个常见问题是,在执行 `pod setup` 命令后,系统无法连接到 GitHub 以更新 CocoaPods/Specs 仓库。这可能是由于网络连接不稳定、GitHub 服务器暂时不可用或本地配置错误等原因导致。为解决此问题,建议检查网络连接、确保 GitHub API 限制未被触发,并验证本地配置文件是否正确。 ... [详细]
author-avatar
忧伤的嫖客
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有