Java使开发企业微信功能

1.自己注册企业微信公司和应用

这个地方可以参考https://blog.csdn.net/zxl782340680/article/details/79876502
这篇文章把前面注册写的很详细,后面代码也有借鉴价值

2.获取token

token是关键码 在企业微信的开发文档中说明每次获取的token的有效期是7200s(2h),而且获取token在一天中还受次数限制所以在开发过程中要使用redis缓存进行处理
这个bo是发送给企业微信的对象

package com.bo;public class WeChatDataBO {//发送微信消息的URLString sendMsgUrl="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=";/*** 成员账号*/private String touser;/*** 消息类型*/private String msgtype;/*** 企业应用的agentID*/private int agentid;/*** 实际接收Map类型数据*/private Object text;private Object file;public Object getText() {return text;}public void setText(Object text) {this.text = text;}public String getMsgtype() {return msgtype;}public void setMsgtype(String msgtype) {this.msgtype = msgtype;}public int getAgentid() {return agentid;}public void setAgentid(int agentid) {this.agentid = agentid;}public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public Object getFile() {return file;}public void setFile(Object file) {this.file = file;}
}

这个bo是一些企业微信地址

package com.bo;public class WeChatUrlDataBO {String corpid;String corpsecret;String Get_Token_Url;String SendMessage_Url;public String getCorpid() {return corpid;}public void setCorpid(String corpid) {this.corpid = corpid;}public String getCorpsecret() {return corpsecret;}public void setCorpsecret(String corpsecret) {this.corpsecret = corpsecret;}public void setGet_Token_Url(String corpid,String corpsecret) {this.Get_Token_Url ="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret;}public String getGet_Token_Url() {return Get_Token_Url;}public String getSendMessage_Url(){SendMessage_Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=";return SendMessage_Url;}}

获取企业微信token

 //获取企业微信tokenpublic String getToken(){String token ="";//判断redis缓存里面的是否失效Jedis redis=new Jedis("127.0.0.1");Date date=new Date();boolean flag=false;if(redis.get("qywxDate")==null||"".equals(redis.get("qywxDate"))||!redis.exists("qywxDate")){     }else{try {Date redisDate=df.parse(redis.get("qywxDate"));Calendar cal = Calendar.getInstance();   cal.setTime(redisDate);   cal.add(Calendar.HOUR, 1);// 24小时制   redisDate = cal.getTime();Date sysdate=df.parse(df.format(date));flag = sysdate.before(redisDate);     } catch (ParseException e1) {e1.printStackTrace();}}if(flag){token= redis.get("token");}else{String qyId = "QYWX_QY";//这个就是企业微信公司idString yyId = "QYWX_YY";//这个就是企业微信应用idWeChatUrlDataBO uData = new WeChatUrlDataBO();uData.setGet_Token_Url(qyId,yyId);    try {token = toAuth(uData.getGet_Token_Url());try{Map<String, Object> map = gson.fromJson(token,new TypeToken<Map<String, Object>>() {}.getType());token = map.get("access_token").toString();}catch (Exception e) {      }//更新缓存redis.set("qywxDate",df.format(date));redis.set("token",token);      } catch (IOException e) {e.printStackTrace();}}     return token;}

Jedis是redis的工具类,直接下载jar包使用即可
Jedis学习可以参考https://www.cnblogs.com/tengfly/p/9307373.html

3.企业微信发送文件

这个是先把文件上传到企业微信的服务器上,服务器返回一个文件Id,然后我们发送信息的时候把id带上即可

public JSONObject UploadMeida(String fileType, String filePath,String token) throws Exception {// 返回结果String result = null;File file = new File(filePath);if (!file.exists() || !file.isFile()) {throw new IOException("文件不存在");}String uploadTempMaterial_url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";uploadTempMaterial_url = uploadTempMaterial_url.replace("ACCESS_TOKEN", token).replace("TYPE", fileType);URL url = new URL(uploadTempMaterial_url);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setRequestMethod("POST");// 以POST方式提交表单conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);// POST方式不能使用缓存// 设置请求头信息conn.setRequestProperty("Connection", "Keep-Alive");conn.setRequestProperty("Charset", "UTF-8");// 设置边界String BOUNDARY = "----------" + System.currentTimeMillis();conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);// 请求正文信息// 第一部分StringBuilder sb = new StringBuilder();sb.append("--");// 必须多两条道sb.append(BOUNDARY);sb.append("\r\n");sb.append("Content-Disposition: form-data;name=\"media\"; filename=\"" + file.getName() + "\"\r\n");sb.append("Content-Type:application/octet-stream\r\n\r\n");// 获得输出流OutputStream out = new DataOutputStream(conn.getOutputStream());// 输出表头out.write(sb.toString().getBytes("UTF-8"));// 文件正文部分// 把文件以流的方式 推送道URL中DataInputStream din = new DataInputStream(new FileInputStream(file));int bytes = 0;byte[] buffer = new byte[1024];while ((bytes = din.read(buffer)) != -1) {out.write(buffer, 0, bytes);}din.close();// 结尾部分byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");// 定义数据最后分割线out.write(foot);out.flush();out.close();if (HttpsURLConnection.HTTP_OK == conn.getResponseCode()) {StringBuffer strbuffer = null;BufferedReader reader = null;try {strbuffer = new StringBuffer();reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String lineString = null;while ((lineString = reader.readLine()) != null) {strbuffer.append(lineString);}if (result == null) {result = strbuffer.toString();}} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {reader.close();}}}JSONObject jsonObject = JSONObject.parseObject(result);return jsonObject;}

4.发送数据的方法

 public String createpostdata(String touser, String msgtype,int application_id, String contentKey ,String contentValue) {WeChatDataBO wcd = new WeChatDataBO();wcd.setTouser(touser);wcd.setAgentid(application_id);wcd.setMsgtype(msgtype);Map<Object, Object> content = new HashMap<Object, Object>();content.put(contentKey,contentValue);if("content".equals(contentKey)){wcd.setText(content);}else{wcd.setFile(content);}return gson.toJson(wcd);}/*** @Title  创建微信发送请求post实体* charset消息编码    ,contentType消息体内容类型,* url微信消息发送请求地址,data为post数据,token鉴权token* @return String*/public String post(String charset, String contentType, String url,String data,String token) throws IOException {CloseableHttpClient httpclient = HttpClients.createDefault();httpPost = new HttpPost(url+token);httpPost.setHeader(CONTENT_TYPE, contentType);httpPost.setHeader("charset", "utf-8");httpPost.setEntity(new StringEntity(data,charset));CloseableHttpResponse response = httpclient.execute(httpPost);String resp="";try {HttpEntity entity = response.getEntity();try {resp = EntityUtils.toString(entity, charset);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}EntityUtils.consume(entity);} finally {response.close();return resp;}}

5.总方法

    public void sendQywxData(){int yyNum =xxxx;//企业微信应用编码//1.查询需要发送的信息String hql=" from  Qywx t where t.sendQty<5 and t.state <>2";List<Qywx> sendList=this.dao.getCurrentSession().createQuery(hql).list();if(sendList.size()>0){//获取tokenString token=getToken();for(MesToQywx wx:sendList){//对于要发送的数据进行处理String toUser=wx.getTouser();int type=wx.getMsgtype();String msgtype="text";String data=wx.getContent();String temp="content";if(type==1){msgtype="file";temp="media_id";try {data=UploadMeida(msgtype, wx.getContent(),token).get("media_id").toString();} catch (Exception e) {e.printStackTrace();}}  String sendDate=createpostdata(toUser,msgtype,yyNum,temp,data);String resp="";//开始发送数据try {resp=post("utf-8",CONTENT_TYPE,(new WeChatUrlDataBO()).getSendMessage_Url(),sendDate,token);} catch (IOException e) {e.printStackTrace();}if(resp!=null&&!"".equals(resp)){Map<String, Object> map = new HashMap<String, Object>();map = gson.fromJson(resp, map.getClass());//对发送结果进行处理String errcode = map.get("errcode") == null ? null : map.get("errcode").toString();String errmsg = map.get("errmsg") == null ? null : map.get("errmsg").toString();wx.setSendQty(wx.getSendQty()+1);   wx.setMessage(errmsg);if("0.0".equals(errcode)){wx.setState(2);}else{wx.setState(1);}}}}if(sendList.size()>0){this.dao.saveAll(sendList);}}

企业微信对象

package com.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;import com.epichust.mestar.domain.BaseEntity;
@Entity
@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
@Table(name = "QYWX")
public class Qywx {private static final long serialVersionUID = 1L;private String touser;//成员账号private Integer msgtype;//信息类型(1.file,0.text)private String content;//发送内容private Integer state;// 状态  发送状态(0未发送  1 已发送发送失败  2 已发送发送成功)private String message;// 消息private Integer sendQty;// 发送次数@Column(name = "USER_CODE")public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}@Column(name = "MSG_TYPE")public Integer getMsgtype() {return msgtype;}public void setMsgtype(Integer msgtype) {this.msgtype = msgtype;}@Column(name = "SEND_CONTENT")public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Column(name = "STATE")public Integer getState() {return state;}public void setState(Integer state) {this.state = state;}@Column(name = "MESSAGE")public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Column(name = "SEND_QTY")public Integer getSendQty() {return sendQty;}public void setSendQty(Integer sendQty) {this.sendQty = sendQty;}}

Java开发企业微信功能相关推荐

  1. Java实现微信公众号客服功能和本地联调

    Java实现微信公众号客服功能 微信公众平台设置 生产环境 公众号 设置 [开发]–> [基本配置]–> [服务器配置] 注: a.服务器地址(URL) 是开发者用来接收微信消息和事件的接 ...

  2. java对接微信分享_Java编程调用微信分享功能示例

    本文实例讲述了Java编程调用微信分享功能.分享给大家供大家参考,具体如下: 这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发完成,可使用. 如果想要自定义微信的分享功能,首先在自己的 ...

  3. java如何调用微信功能_Java编程调用微信分享功能示例

    本文实例讲述了java编程调用微信分享功能.分享给大家供大家参考,具体如下: 这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发完成,可使用. 如果想要自定义微信的分享功能,首先在自己的 ...

  4. 微信小程序-JAVA实现微信支付功能(微信支付2.0)

    微信小程序-JAVA实现微信支付功能(微信支付2.0) 一.前言 本博客主要介绍JAVA后台与微信小程序(UNI-APP或者原生微信小程序)的微信支付的实现,如果是APP或者H5的开发暂时不支持,具体 ...

  5. JAVA开发微信 AIRKISS 一键WIFI功能(测试账户)

    最近使用JAVA开发微信的AIRKISS功能,因为没有经验参考了比较多的网站,其中受益比较多的除了微信官方网站外,特别感谢以下几位大神的经验分享. https://blog.csdn.net/jrai ...

  6. 最全的java对接微信小程序客服功能实现(包含自动回复文本消息、图片消息,进入人工客服)

    java对接微信小程序客服功能实现(包含自动回复文本消息.图片消息,进入人工客服) 第一步:请求校验(确认请求来自微信服务器) 代码如下: @ApiOperation(value = " 微 ...

  7. java实现微信小程序支付功能

    微信支付-开发者文档: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml 生成订单 /*** 生成订单*/@User@A ...

  8. 微信公众号页面支付接口java,[Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付...

    [Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付 0 2015-09-15 15:00:30 一.调用微信的JS文件 1.首先要绑定[JS接口安全域名],"公众号设置&q ...

  9. java 绑定微信号开发_Java开发中的更多常见危险信号

    java 绑定微信号开发 在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似 ...

  10. java 绑定微信号开发_Java开发中的常见危险信号

    java 绑定微信号开发 在开发,阅读,复审和维护成千上万行Java代码的几年中,我已经习惯于看到Java代码中的某些" 危险信号 ",这些信号通常(但可能并非总是)暗示着代码有问 ...

最新文章

  1. STM32中EXTI和NVIC的关系
  2. 最近的生活 - 18年03月20日
  3. epon matlab仿真,一种新型的EPON保护结构
  4. 配置Ubuntu Server高速apt-get源
  5. 几万条数据的excel导入到mysql_【记录】2万多条数据的Excel表格数据导入mysql数据库...
  6. 您的第一个简单的机器学习项目
  7. cdn需要备案吗_车子贴改色膜需要到车管所备案吗?
  8. ad域管理与维护_windows server2012创建AD域服务器
  9. TCP报文段首部格式
  10. flink 部署模式和运行时架构(会话模式、单作业模式、应用模式,JobManager、TaskManager,YARN 模式部署以及运行时架构)
  11. 油价上涨后,「两轮电动车」还是没有找到正确的出路?
  12. 关于围棋的基本功(转)
  13. Navicat执行sql文件没反应
  14. MYSQL函数group_concat的使用
  15. 可能是最好的正则表达式的教程笔记了吧...
  16. [深入理解Android卷二 全文-第四章]深入理解PackageManagerService
  17. 林轩田机器学习技法(Machine Learning Techniques)笔记(一)
  18. html----烟花代码
  19. MiniGPT4,开源了
  20. 部署k8s时ssh端口不是22导致创建ssh session failed问题

热门文章

  1. 黎活明写给程序员的忠告
  2. html微信怎么转发,微信朋友圈怎么转发别人的文章(链接、视频、图片、文字)
  3. 冒泡排序Java实现以及时间复杂度分析
  4. list之按照中文拼音首字母排序
  5. codesys 轴程序
  6. 四十八种微信公众号加人方法
  7. 775针服务器cpu性能排行,e7500(775针cpu天梯图)
  8. 汉印CP4000照片打印机体验
  9. 学习笔记—前端移动端开发知识点总结
  10. ENSP下载还有其他资料地址