龙空技术网

springboot集成企业微信收发应用消息

晓掌柜丶韶华 675

前言:

现时咱们对“java微信发送消息”大概比较关切,你们都需要了解一些“java微信发送消息”的相关知识。那么小编在网摘上收集了一些关于“java微信发送消息””的相关内容,希望兄弟们能喜欢,我们快快来了解一下吧!

一、背景

在之前的业务中,我们的消息推送是使用的微信公众号的模板消息。

但是有几个痛点:

① 模板要申请,不能应急处理一些场景。

② 模板能支持的自定义操作有限。

③ 消息内容及形式相对单一

所以,在最近的版本中,我们准备把内部消息推送统一集中到企业微信上(在企业微信上建立专门的应用用以收发消息)

二、准备工作2.1、创建应用

首先登陆企业微信(注册,认证等工作按需处理),创建应用。

2.2、获取应用信息

创建应用后会给到你应用的ID,秘钥,设置可见范围,定义管理员等,大致如下:

2.3、接入开发api

接入到企业微信开发api后,按照既定规则进行http请求,应用消息的发送api接口文档连接如下:

发送应用消息

三、程序规划

① 首先这个发送消息的程序定义成一个单独的服务节点,统一接收外部请求

② 可配置:满足不同的消息格式及使用场景(卡片消息、文字消息、事件A的消息、事件B的消息)

四、程序设计

4.1、定义消息类型枚举支持不同的消息类型

       MSG_TYPE_00(0, "文本消息"),    MSG_TYPE_01(1, "图片消息"),    MSG_TYPE_02(2, "语音消息"),    MSG_TYPE_03(3, "视频消息"),    MSG_TYPE_04(4, "文件消息"),    MSG_TYPE_05(5, "图文消息"),    MSG_TYPE_06(6, "卡片消息");

Java

4.2、定义不同的业务场景

配置业务场景枚举,适配不同场景下的业务需求

        EVENT_00(0, "货物XX"),    EVENT_01(1, "增值XX"),    EVENT_02(2, "XX件"),    EVENT_03(3, "退XX"),    EVENT_04(4, "待XXX"),    EVENT_05(5, "已XX"),    EVENT_06(6, "退XX过"),    EVENT_07(7, "未XX"),    EVENT_08(8, "货XXX"),    EVENT_09(9, "增XXX成"),    EVENT_10(10, "问XX成"),    EVENT_11(11, "已XXX"),    EVENT_12(12, "程序预警");

Java

五、整个消息发送的流程

5.1、主入口接收消息类型和消息相关参数

作为总的入口进行业务的分发处理。

5.2、获取token

根据在企业微信注册的信息获取token,作为后续的操作凭证。

因为token会自动过期以及腾讯方业务需要过期,所以要加入重试机制。

5.3、格式化消息内容

根据消息类型枚举类中的配置及对应业务场景来动态创建消息内容。

5.4、发送应用消息

调用企业微信api进行消息发送

5.5、返回结果值

监听返回结果值,并作出对应处理。

六、核心代码如下

6.1、获取token

         /**     * 功能描述: 获取应用的操作token     * Param: [isOutTime]  是否过期或不合法...     * Return: java.lang.String     */    public String getToken(boolean isOutTime){        /* 从redis获取token */        Object tokenObj = redisUtil.get("wechatToken");        if(tokenObj == null || isOutTime){            String url = String.format(";, groupId, groupSecret);            String rltStr = HttpClientUtil.doGet(url, null);            /* 失败重试3次 */            for(int i=0;i<3;i++){                JSONObject jsonRlt = JSON.parseObject(rltStr);                if(0 != jsonRlt.getIntValue("errcode")){                    rltStr = HttpClientUtil.doGet(url, null);                }else{                    String tokenStr = jsonRlt.getString("access_token");                    /* 保存到redis缓存(token有效期为7200) */                    redisUtil.set("wechatToken", tokenStr, 60 * 60 * 2);                    return tokenStr;                }            }        }        assert tokenObj != null;        return tokenObj.toString();    }

Java

6.2、token验证及消息重入

         /**     * 功能描述:消息发送实现类     * Param: [msgType, msgHandlerVO]     * Return: com.bh.enterprisewechat.commons.utils.R     */    @Override    public R sendMsgByType(int msgType, MsgHandlerVO msgHandlerVO) {        String token = tokenUtil.getToken(false);        if(token == null){            return R.error("获取token失败!");        }        /* 消息发送失败后重试(3次)*/        String rltStr = formatPost(msgType, token, msgHandlerVO);        for(int i=0;i<3;i++){            JSONObject rltJson = JSON.parseObject(rltStr);            int errCode = rltJson.getIntValue("errcode");            if(0 != errCode){                /* 中间判断是否为token过期,或者不合法 */                if(42001 == errCode || 40014 == errCode){                    token = tokenUtil.getToken(true);                }                rltStr = formatPost(msgType, token, msgHandlerVO);            }else{                return R.ok();            }        }        return R.error().put("data", rltStr);    }

Java

6.3、格式化消息格式、内容及发送

         /**     * 功能描述: 消息分发 (XXX)     * Param: [type, token, msgVO]     * Return: java.lang.String     */    private String formatPost(int type,String token, MsgHandlerVO msgHandlerVO){        TextMsgVO textMsgVO;        TextCardMsgVO textCardMsgVO;        String rltStr = null;        String url = "; + token;        Integer eventKey = msgHandlerVO.getEventType().getKey();        switch (type){            case 0:                /* 此处省略部分业务处理... */                /* 程序预警 */                if(eventKey == 12){                    // 此处省略格式化消息内容处理...                    textCardMsgVO = buildTextCardMsg("warning", msgHandlerVO);                    rltStr = HttpClientUtil.sendJsonStr(url, JSONObject.toJSONString(textCardMsgVO));                }                break;            default:                break;        }        return rltStr;    }

Java

七、成品展示(文本消息和卡片消息)

标签: #java微信发送消息 #java微信群发消息