JAVA实现企业微信的消息推送

【需求】将外部事件消息发送至企业微信,所在成员可以根据消息进行事件处理。
【实现流程】管理员在企业微信中自建小程序,将小程序的ID和微信的access_token作为接入连接的凭证,实现外部消息内容与企业微信自建应用聊天框的对接,最终将外部事件消息通过应用发送给企业微信所在成员。
【主要内容】该文档为发送消息的小示范(demo),运行后能将后台信息发送至小程序。

1 打开管理后台

打开企业微信管理后台(从企业微信官网进入)

2 进行“企业注册”

根据表单输入相关信息,最后扫码绑定


在这里插入图片描述

3 自建应用

管理员进入管理后台,开始自建应用,填充所需信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 功能实现

前期的应用环境准备完毕后,需要用JAVA开始实现信息发送的功能 此处选择IDEA来进行代码编写和功能测试。

·ACCESS_TOKEN:微信公众号平台的全局唯一接口调用凭据,换句话说,这是外部信息与微信平台之间通道的通信证;有效期为2小时,需要定时刷新,这种自动刷新的任务将以“发一次信息就即时申请凭证”的方式交给后台程序来做,不需要用户手动获取。
·CORPID:企业号唯一标志符号,用于企业的“定位”。
·CORPSECRET:自建应用的唯一标志符号,用于企业中自建应用的“定位”,上文自建应用流程末尾有提到Secret。

(1)获取CORPID与CORPSECRET

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)创建“qiyeTestProject”项目

在IDEA中创建“qiyeTestProject”项目,引入依赖如下(该demo为一个简单的maven项目,没有使用springboot等框架,如果有需要可以根据自己的代码环境进行更改)

<dependencies>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.5.2</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.62</version>
	</dependency>
</dependencies>

(3)创建消息发送类

创建消息发送类SendWeChatMessage;设定final参数,一旦初始化后不可更改,主要用于ID等固定值

//发送消息的类型
private final static String MSGTYPE = "text";
//将消息发送给所有成员
private final static String TOPARTY = "@all";
//获取企业微信的企业号,根据不同企业更改
private final static String CORPID = "wwb57d1d1f91303d52";
//获取企业应用的密钥,根据不同应用更改
private final static String CORPSECRET = "r49wz8vesxBZdzIy0J8FzvGlflhOg1o9s32uiB3RVs0";
//获取访问权限码URL
private final static String ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
//创建会话请求URL
private final static String CREATE_SESSION_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=";

(4)创建Access_Token类

创建Access_Token类对象,其中包括ACCESS_TOKEN码和有效时间(2小时,7200秒)

public class AccessToken {

    //获取到的access_token字符串
    private String access_token;
    //有效时间(2h,7200s)
    private int expires_in;

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    public int getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(int valid_time) {
        this.expires_in = valid_time;
    }
}

(5)获取access_token

回到类SendWeChatMessage,对ACCESS_TOKEN方法进行实现:access_token的获取可以通过post请求,以接口调试的方法获取,我们要做的就是将人工的接口调试过程封装为程序的一个方法,可以自动触发,不需要每一次都去人工申请

//获取access_token
public static AccessToken getAccessToken() {

	AccessToken token = new AccessToken();

	//访问微信服务器
	String url = ACCESS_TOKEN_URL + "?corpid=" + CORPID + "&corpsecret=" + CORPSECRET;
	try {
		URL getUrl = new URL(url);
		//开启连接,并返回一个URLConnection对象
		HttpURLConnection http = (HttpURLConnection)getUrl.openConnection();
		http.setRequestMethod("GET");
		http.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
		//将URL连接用于输入和输出,一般输入默认为true,输出默认为false
		http.setDoOutput(true);
		http.setDoInput(true);
		//进行连接,不返回对象
		http.connect();

		//获得输入内容,并将其存储在缓存区
		InputStream inputStream = http.getInputStream();
		int size = inputStream.available();
		byte[] buffer = new byte[size];
		inputStream.read(buffer);
		//将内容转化为JSON代码
		String message = new String(buffer,"UTF-8");
		JSONObject json = JSONObject.parseObject(message);
		//提取内容,放入对象
		token.setAccess_token(json.getString("access_token"));
		token.setExpires_in(new Integer(json.getString("expires_in")));
	} catch (MalformedURLException e) {
	e.printStackTrace();
	} catch (IOException e) {
	e.printStackTrace();
	}

	//返回access_token码
	return token;
}

(6)发送信息

对信息发送的流程封装为一个方法,使用 http中的post协议

/**
 * 企业接口向下属关注用户发送给微信消息
 *
 * @param toUser 成员ID列表
 * @param toParty 部门ID列表 
 * @param toTag 标签ID列表
 * @param content 消息内容
 * @param safe 是否保密
 *
* @return
*/
@SuppressWarnings("deprecation")
public void sendWeChatMessage(String toUser, String toParty, String toTag, String content,String safe) {
 	//从对象中提取凭证
    AccessToken accessToken = getAccessToken();
    String ACCESS_TOKEN = accessToken.getAccess_token();
    String url = CREATE_SESSION_URL + ACCESS_TOKEN;
	//请求串
    String url = CREATE_SESSION_URL + ACCESS_TOKEN;

    //封装发送消息请求JSON
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("{");
    stringBuffer.append("\"touser\":" + "\"" + toUser + "\",");
    stringBuffer.append("\"toparty\":" + "\"" + toParty + "\",");
    stringBuffer.append("\"totag\":" + "\"" + toTag + "\",");
    stringBuffer.append("\"msgtype\":" + "\"" + MSGTYPE + "\",");
    stringBuffer.append("\"text\":" + "{");
    stringBuffer.append("\"content\":" + "\"" + content + "\"");
    stringBuffer.append("}");
    stringBuffer.append(",\"safe\":" + "\"" + safe + "\",");
    stringBuffer.append("\"agentid\":" + "\"" + "1000002" + "\",");
    stringBuffer.append("\"debug\":" + "\"" + "1" + "\"");
    stringBuffer.append("}");
    String json = stringBuffer.toString();
    System.out.println(json);

    try {
        URL postUrl = new URL(url);
        HttpURLConnection http = (HttpURLConnection) postUrl.openConnection();
        http.setRequestMethod("POST");
        http.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        http.setDoOutput(true);
        http.setDoInput(true);
		// 连接超时30秒
        System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
		// 读取超时30秒
        System.setProperty("sun.net.client.defaultReadTimeout", "30000");
        http.connect();

		 //写入内容
        OutputStream outputStream = http.getOutputStream();
        outputStream.write(json.getBytes("UTF-8"));
        InputStream inputStream = http.getInputStream();
        int size = inputStream.available();
        byte[] jsonBytes = new byte[size];
        inputStream.read(jsonBytes);
        String result = new String(jsonBytes, "UTF-8");
        System.out.println("请求返回结果:" + result);

		 //清空输出流
        outputStream.flush();
        //关闭输出通道
        outputStream.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
} 

(7)进行测试

public static void main(String[] args) {
        SendWeChatMessage weChat = new SendWeChatMessage();
        weChat.sendWeChatMessage("WangXingWen", "1", "", "天干物燥。","0");
}

5 应用界面

运行后,打开手机的“企业微信”APP,进入所在企业,可以看到消息成功发送至应用聊天窗

在这里插入图片描述
【逻辑补充】
1、需要将content(消息体)与外部应用的事件信息绑定;
2、需要在事件信息出现的一刻实时触发发送信息的行为,不能一次次手动去发送信息;
3、需要在外部应用的事件信息中补充链接,方便点击后直接切换到外部应用操作平台。

附上源码:点击此处转到资源页面

  • 20
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值