热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java微信企业号开发之发送消息(文本、图片、语音)

这篇文章主要为大家详细介绍了java微信企业号开发之发送消息,发送类型包括文本、图片、语音,感兴趣的小伙伴们可以参考一下

上篇文章介绍了开启回调模式,开始回调模式后我们就要实现聊天功能了。平时使用微信聊天可以发送文本消息、语音、图片、视频等,这里只实现了其中的一些功能和大家分享。 

一、与微信企业号建立连接
1、企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源、或给成员发送消息等,以下称主动调用模式。
2、企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式。
3、用户在微信中阅读企业应用下发的H5页面,该页面可以调用微信提供的原生接口,使用微信开放的终端能力,以下称JSAPI模式。
这是微信企业号的开发文档中写的,但是我们一般使用前两种方式。 
其实主动调用和回调都是相对的,这是站在微信服务器的角度,微信服务器通过企业号给微信客户端发送消息是主动调用,微信客户端主动发送消息去调用微信服务器相对服务器来说就是被动调用(回调)。

二、主被动调用微信服务器处理的数据格式

1.主调:服务器向微信客户端发送json格式的数据,数据不需要加密 

2.回调:微信客户端发送的消息需要AES加密,服务器接受的消息是xml格式

这两条用一张图表示如下:

三、聊天原理图

首先微信客户端发送消息到服务器处理,数据以xml格式传输到第三方服务器后,第三方服务器再将数据转为json格式,传送给微信服务器,发送给客户端。 

四、代码实现
有了上面的原理基础,下面是代码部分

1.servlet

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 request.setCharacterEncoding("UTF-8");
 response.setCharacterEncoding("UTF-8"); 
 
  String msg_signature = request.getParameter("msg_signature"); 
  
  String timestamp = request.getParameter("timestamp"); 
  
  String nOnce= request.getParameter("nonce"); 
  
  InputStream inputStream = request.getInputStream(); 
  String postData = IOUtils.toString(inputStream, "UTF-8"); 
  System.out.println(postData); 
  
  String msg = ""; 
  WXBizMsgCrypt wxcpt = null; 
  try { 
   wxcpt = new WXBizMsgCrypt(sToken , sEncodingAESKey , sCorpID ); 
   msg = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, postData); 
  } catch (AesException e) { 
   e.printStackTrace(); 
  } 
  System.out.println("msg=" + msg); 
   
  //获取接口访问凭证
  String accessToken = CommonUtil.getToken("wxe510946434680dab", "eWTaho766INvp4e1MCsz1mHYuT2DAleb62REQ3vsFizhY4vtmwZpKweuxUVh33G0").getAccessToken();
  try {
 @SuppressWarnings("unused")
 boolean flag = ChatService1.sendMessage(accessToken,msg);
 } catch (Exception e) {
 e.printStackTrace();
 }
} 

 2.service

public class ChatService1 {

 public static boolean sendMessage(String accessToken,String msg) throws Exception{
 boolean flag = false;
 Map requestMap = MessageUtil.parseXml(msg); 
 // 发送者
 String fromUserName = requestMap.get("FromUserName");
 // 消息类型
 String msgType = requestMap.get("MsgType");
 
 if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){//如果是文本客服消息
 String COntent= requestMap.get("Content");//文本消息的消息内容
 //组装文本客服消息,参数1:用户id;参数2:发送的内容
 jsOnMsg= AdvancedUtil.makeTextCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", Content);
 }else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){//发送的是图片
 String mediaId = requestMap.get("MediaId");
 jsOnMsg= AdvancedUtil.makeImageCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", mediaId);
 }else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
 String mediaId = requestMap.get("MediaId");
 jsOnMsg= AdvancedUtil.makeVoiceCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", mediaId);
 }
 flag = AdvancedUtil.sendCustomMessage(accessToken, jsonMsg);
 return flag;
 }
}

3.工具类

public class AdvancedUtil {
 private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);

 /**
 * 组装发送文本消息
 * @return
 */
 public static String makeTextCustomMessage(String openId, String content) {
 cOntent= content.replace("\"", "\\\"");
 String jsOnMsg= "{\"touser\":\"%s\",\"msgtype\":\"text\",\"agentid\":\"%s\",\"text\":{\"content\":\"%s\"}}";
 return String.format(jsonMsg, openId, 14,content);
 }

 /**
 * 组装发送图片消息
 * 
 * @return
 */
 public static String makeImageCustomMessage(String openId, String mediaId) {
 String jsOnMsg= "{\"touser\":\"%s\",\"msgtype\":\"image\",\"agentid\":\"%s\",\"image\":{\"media_id\":\"%s\"}}";
 return String.format(jsonMsg, openId,14, mediaId);
 }

 /**
 * 组装发送语音消息
 * 
 * @return
 */
 public static String makeVoiceCustomMessage(String openId, String mediaId) {
 String jsOnMsg= "{\"touser\":\"%s\",\"msgtype\":\"voice\",\"agentid\":\"%s\",\"voice\":{\"media_id\":\"%s\"}}";
 return String.format(jsonMsg, openId,14, mediaId);
 }

四、总结

这样就实现了消息的接收和推送,第三方服务器将接受的xml数据先解密解析,从中获取消息类型,然后将要发送的消息封装后转为json格式,并传送给微信服务器在发送到客户端。

本文已被整理到了《Android微信开发教程汇总》,《java微信开发教程汇总》欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
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社区 版权所有