热门标签 | 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微信开发教程汇总》欢迎大家学习阅读。

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


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
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社区 版权所有