微信通知

简介: 本文介绍了企业微信消息通知的实现方式,包括前置条件(如appId、secret配置)、获取access_token的接口调用方法及发送消息的完整Java代码示例,涵盖异步处理、HTTP请求封装与用户信息解析等关键步骤,适用于系统集成与开发参考。

微信通知

1.前置条件
企业微信appId
企业微信secret
企业微信绑定小程序
小程序的appId
2.发送示例
2.1 获取access_token(HTTPS-GET)

请求URL:
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=corpid&corpsecret=corpsecret

示例入参:
corpid=wx161we55e1fe5e4fr
corpsecret=Rspav9pmjem3zve8fkjqe6yTtCs78Rwdabn6tNdU1g


2.2 发送
完整代码示例(建议异步)

Java

运行代码复制代码

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

private static final ThreadLocal<ExecutorService> synExecuteService = ThreadLocal.withInitial(() -> Executors.newFixedThreadPool(200));


logger.info("开始发送微信企业号消息,入参:" + jsonParam);

// 微信企业号消息发送服务地址 http://ip:port/mp-api/wechat/enterprise/message/send

String imsServiceDomainConfigStr = imSystemConfigService.getImSystemConfig(hospitalId, HUUtil.IMS_SERVICE_WECHAT_QYH_TEMPLATE_DOMAIN_CONFIG_KEY);

if (null == imsServiceDomainConfigStr || "".equals(imsServiceDomainConfigStr)) {

logger.info("IMS发送微信企业号消息服务地址配置信息不存在:" + hospitalId);

return;

}


imsServiceDomainConfigStr = imsServiceDomainConfigStr + "?access_token=" + accessToken.getToken();

String result = HUHttpUtil.sendJsonPostRequest(imsServiceDomainConfigStr, jsonParam, 0);

logger.info("开始发送微信企业号消息,结果:" + result);

} else {

logger.info("该医生" + doctorNo + "在企业号通讯录中不存在,终止发送企业号消息");

}

});

}


/**

    * 发送GET请求

    *

    * @param requestUrl

    * @param requestMethod

    * @param outputStr

    * @return

    */

public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {

logger.info("[WeixinUtil.httpRequest]:请求入参:" + requestUrl);

String respStr = HUHttpUtil.sendGet(requestUrl, null);

logger.info("[WeixinUtil.httpRequest]:请求响应:" + respStr);

try {

return JSON.parseObject(respStr);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}


private List<WXQYUser> getWXQYUserList(JSONObject hResponse) {

List<JSONObject> wXQYUserList = (List<JSONObject>) hResponse.get("userlist");

List<JSONObject> nmList = null;

WXQYUser wxQYUser = null;

JSONObject mm = null;

List<WXQYUser> wxQYUserList = new ArrayList<WXQYUser>();

for (JSONObject jsObject : wXQYUserList) {

if (jsObject.containsKey("userid")) {

if (jsObject.containsKey("extattr")) {

mm = jsObject.getJSONObject("extattr");

if (null != mm.get("attrs")) {

nmList = (List<JSONObject>) mm.get("attrs");

for (JSONObject nmObject : nmList) {

if (nmObject.containsKey("name") && "hisid".equals(nmObject.getString("name"))

&& null != nmObject.getString("value") && !"".equals(nmObject.getString("value"))) {

wxQYUser = new WXQYUser();

wxQYUser.setUserid(jsObject.getString("userid"));

wxQYUser.setName(jsObject.getString("name"));

wxQYUser.setMobile(jsObject.getString("mobile"));

wxQYUser.setHisid(nmObject.getString("value"));

wxQYUserList.add(wxQYUser);

}

}

}

}

}

}

return wxQYUserList;

}


// 企业微信存储12345,数据库存储:医院ID+12345,随意这里做截取再去匹配

private String getDoctorNo(String doctorNo) {

if (doctorNo.startsWith("10000")) {

return doctorNo.substring(5, doctorNo.length());

}

if (doctorNo.startsWith("10001")) {

return doctorNo.substring(5, doctorNo.length());

}


return doctorNo;

}

Java

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

class WXQYUser {


private String userid;


private String name;


private String mobile;


private String hisid;


public String getUserid() {

return userid;

}


public void setUserid(String userid) {

this.userid = userid;

}


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public String getMobile() {

return mobile;

}


public void setMobile(String mobile) {

this.mobile = mobile;

}


public String getHisid() {

return hisid;

}


public void setHisid(String hisid) {

this.hisid = hisid;

}

}


相关文章
|
1天前
|
JSON 安全 Java
2.OAuth2.0实战案例
本文详细演示了OAuth2.0四种授权模式的实战应用,涵盖资源与授权服务搭建、配置及测试流程。通过具体案例展示授权码、简化、密码和客户端模式的实现步骤,并结合Spring Security完成认证授权,最终成功获取token并访问受保护资源。
|
1天前
|
存储 缓存 Java
自定义注解
本文介绍Java自定义注解的实现原理与应用,结合Spring AOP 和过滤器实现日志、权限控制及登录验证,涵盖注解定义、@Target、@Retention等核心语法,并通过代码示例展示实际使用流程。
 自定义注解
|
1天前
|
存储 安全 算法
第一章 Java基础
本章系统讲解Java基础核心知识,涵盖重载与重写、==与equals、String三兄弟区别、异常体系、集合类原理(如HashMap结构与扩容)、线程并发(ThreadLocal、锁机制)、JVM内存模型、Lambda表达式、反射泛型及Tomcat优化等内容,深入浅出,助力夯实Java基础。
第一章 Java基础
|
1天前
|
负载均衡 Dubbo 应用服务中间件
Day01
本文介绍微服务架构的适用场景及技术选型,对比单体与微服务优劣,详解Nacos与Eureka注册中心的心跳机制、服务治理差异,并涵盖常见负载均衡算法及SpringCloud Alibaba常用组件实践。
 Day01
|
1天前
|
运维 Devops 开发工具
生产环境缺陷管理
针对大型团队多分支开发中bug管理难题,本文介绍基于go-git实现的分布式工具git-poison,通过“投毒-解药-银针”机制,实现bug的自动化追溯、发布卡点与影响范围精准识别,有效避免人为疏漏导致的生产事故,提升缺陷管理效率与系统稳定性。
生产环境缺陷管理
Day07
简介:本文讲解CAP与BASE理论核心要点,阐述分布式系统中一致性、可用性与分区容错性的权衡,解析Seata AT模式的执行流程,并探讨MQ消息防丢失、重复消费及积压处理等关键问题。
Day07
|
1天前
|
项目管理 开发者
业务架构图
业务架构图是梳理业务层级与关系的工具,通过分层、分模块、分功能,抽象出业务核心结构,明确各部分职责与协作,服务于客户理解与系统开发,是连接业务与技术的重要桥梁。
|
2天前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
2天前
|
消息中间件 存储 数据挖掘
应用架构图
本文介绍应用架构图的设计原理,涵盖单体与分布式架构模式。重点解析展现层、业务层、数据层及基础通用层的分层设计,阐述系统间调用关系与外部依赖,明确应用边界,指导技术方案落地。
|
2天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示系统动态协作过程,强调交互的时间先后关系,直观呈现并发行为。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于软件设计建模。
系统时序图