UDN-企业互联网技术人气社区

板块导航

浏览  : 1645
回复  : 4

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

[复制链接]
西北的风的头像 楼主
发表于 2017-1-17 17:28:56 | 显示全部楼层 |阅读模式
  这篇文章主要为大家详细介绍了java微信企业号开发之发送消息,发送类型包括文本、图片、语音,感兴趣的小伙伴们可以参考一下

  上篇文章介绍了开启回调模式,开始回调模式后我们就要实现聊天功能了。平时使用微信聊天可以发送文本消息、语音、图片、视频等,这里只实现了其中的一些功能和大家分享。
  
  一、与微信企业号建立连接
  
  1、企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源、或给成员发送消息等,以下称主动调用模式。
  
  2、企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式。
  
  3、用户在微信中阅读企业应用下发的H5页面,该页面可以调用微信提供的原生接口,使用微信开放的终端能力,以下称JSAPI模式。
  
  这是微信企业号的开发文档中写的,但是我们一般使用前两种方式。
  
  其实主动调用和回调都是相对的,这是站在微信服务器的角度,微信服务器通过企业号给微信客户端发送消息是主动调用,微信客户端主动发送消息去调用微信服务器相对服务器来说就是被动调用(回调)。
  
  二、主被动调用微信服务器处理的数据格式
  
  1.主调:服务器向微信客户端发送json格式的数据,数据不需要加密
  
  2.回调:微信客户端发送的消息需要AES加密,服务器接受的消息是xml格式
  
  这两条用一张图表示如下:
 
201606280928155.png
 
  三、聊天原理图
 
201606280928156.png
 
  首先微信客户端发送消息到服务器处理,数据以xml格式传输到第三方服务器后,第三方服务器再将数据转为json格式,传送给微信服务器,发送给客户端。
  
  四、代码实现
  
  有了上面的原理基础,下面是代码部分
  
  1.servlet
  1. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. request.setCharacterEncoding("UTF-8");
  3. response.setCharacterEncoding("UTF-8");

  4.     String msg_signature = request.getParameter("msg_signature");
  5.    
  6.     String timestamp = request.getParameter("timestamp");
  7.    
  8.     String nonce = request.getParameter("nonce");
  9.    
  10.     InputStream inputStream = request.getInputStream();
  11.     String postData = IOUtils.toString(inputStream, "UTF-8");
  12.     System.out.println(postData);
  13.    
  14.     String msg = "";
  15.     WXBizMsgCrypt wxcpt = null;
  16.     try {
  17.       wxcpt = new WXBizMsgCrypt(sToken , sEncodingAESKey , sCorpID );
  18.       msg = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, postData);
  19.     } catch (AesException e) {
  20.       e.printStackTrace();  
  21.     }
  22.     System.out.println("msg=" + msg);
  23.       
  24.     //获取接口访问凭证
  25.     String accessToken = CommonUtil.getToken("wxe510946434680dab", "eWTaho766INvp4e1MCsz1mHYuT2DAleb62REQ3vsFizhY4vtmwZpKweuxUVh33G0").getAccessToken();
  26.     try {
  27. @SuppressWarnings("unused")
  28. boolean flag = ChatService1.sendMessage(accessToken,msg);
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. }
复制代码

  2.service
  1. public class ChatService1 {

  2. public static boolean sendMessage(String accessToken,String msg) throws Exception{
  3. boolean flag = false;
  4. Map<String, String> requestMap = MessageUtil.parseXml(msg);
  5. // 发送者
  6. String fromUserName = requestMap.get("FromUserName");
  7. // 消息类型
  8. String msgType = requestMap.get("MsgType");

  9. if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){//如果是文本客服消息
  10.   String Content = requestMap.get("Content");//文本消息的消息内容
  11.   //组装文本客服消息,参数1:用户id;参数2:发送的内容
  12.   jsonMsg = AdvancedUtil.makeTextCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", Content);
  13. }else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){//发送的是图片
  14.   String mediaId = requestMap.get("MediaId");
  15.   jsonMsg = AdvancedUtil.makeImageCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", mediaId);
  16. }else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
  17.   String mediaId = requestMap.get("MediaId");
  18.   jsonMsg= AdvancedUtil.makeVoiceCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", mediaId);
  19. }
  20. flag = AdvancedUtil.sendCustomMessage(accessToken, jsonMsg);
  21. return flag;
  22. }
  23. }
复制代码

  3.工具类
  1. public class AdvancedUtil {
  2. private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);

  3. /**
  4. * 组装发送文本消息
  5. * @return
  6. */
  7. public static String makeTextCustomMessage(String openId, String content) {
  8. content = content.replace("\"", "\\\"");
  9. String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"text\",\"agentid\":\"%s\",\"text\":{\"content\":\"%s\"}}";
  10. return String.format(jsonMsg, openId, 14,content);
  11. }

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

  21. /**
  22. * 组装发送语音消息
  23. *
  24. * @return
  25. */
  26. public static String makeVoiceCustomMessage(String openId, String mediaId) {
  27. String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"voice\",\"agentid\":\"%s\",\"voice\":{\"media_id\":\"%s\"}}";
  28. return String.format(jsonMsg, openId,14, mediaId);
  29. }
复制代码

  四、总结
  
  这样就实现了消息的接收和推送,第三方服务器将接受的xml数据先解密解析,从中获取消息类型,然后将要发送的消息封装后转为json格式,并传送给微信服务器在发送到客户端。
  
  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关帖子

发表于 2017-1-17 17:29:27 | 显示全部楼层
我完全是被标题<<java微信企业号开发之发送消息(文本、图片、语音)>>吸引过来的
点评 ( 1 ) 收起 / 展开点评

心如善水 2017年01月17日 22:08 详情 回复

学习

使用道具 举报

回复

发表于 2017-1-17 22:08:38 | 显示全部楼层
学习
点评 ( 1 ) 收起 / 展开点评

心如善水 2017年01月18日 13:53 详情 回复

学习

使用道具 举报

回复

发表于 2017-1-18 13:53:51 | 显示全部楼层
学习
使用道具 举报

回复

发表于 2017-1-20 07:11:30 | 显示全部楼层
不错的帖子,支持下
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部