简单的企业微信推送消息开发 - ran_D

时间:2024-03-06 22:30:03

简单的企业微信推送消息开发

企业微信登陆地址:https://work.weixin.qq.com(最好是管理员身份,或者自己注册一个自己企业微信)
服务端api:https://work.weixin.qq.com/api/doc#90001/90143/90371
我们找到第三应用消息推动的相关api
应用支持推送文本、图片、视频、文件、图文等类型。
请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
参数说明:
参数
   是否必须
   说明
  access_token
   是
   调用接口凭证
  
各个消息类型的具体POST格式参考以下文档。
当应用设置“在微工作台中始终进入主页”后应用在微信端只能接收到文本消息,并且文本消息的长度限制为20字节,超过20字节会被截断。同时其他消息类型也会转换为文本消息,提示用户到企业微信查看。

首先我们需要拿到access_token,但是access_token是什么呢?可以查看开发前必读,有区分三种类型的access_token,
区分三种类型access_token
在第三方应用开发提供的接口中,会涉及到三种类型的access_token。下面表格对这三类token的定义及使用场景进行说明,开发者应在不同场景中选择对应的token:
类型
   说明
   适用场景
  服务商的token
   以corpid(服务商CorpID)、provider_secret(服务商密钥)换取provider_access_token,代表的是服务商的身份
   用于服务商级别的接口调用,比如登录授权、推广二维码等。说明文档参考 获取服务商凭证
  第三方应用的token
   以suite_id(第三方应用ID)、suite_secret(第三方应用密钥)换取suite_access_token,代表第三方应用的身份
   用于获取第三方应用的预授权码,获取授权企业信息等。说明文档参考 获取第三方应用凭证
  授权企业的token
   企业安装第三方应用后,第三方服务商以企业的corpid、永久授权码来获取access_token
   用于操作授权企业相关接口,如通讯录管理,消息推送等。说明文档参考 获取企业凭证
   然后第三个“授权企业的token”,可以看到使用场景中有消息推送,点击 获取企业凭证进行查看。
获取企业凭证
第三方服务商在取得企业的永久授权码后,通过此接口可以获取到企业的access_token。
获取后可通过通讯录、应用、消息等企业接口来运营这些应用。

此处获得的企业access_token与企业获取access_token拿到的token,本质上是一样的,只不过获取方式不同。获取之后,就跟普通企业一样使用token调用API接口

调用企业接口所需的access_token获取方法如下。
请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=SUITE_ACCESS_TOKEN
此处获得的企业access_token与企业获取access_token拿到的token,本质上是一样的,所以我选择了第二种方式。
获取access_token
请求方式:GET(HTTPS)请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRECT注:此处标注大写的单词ID和SECRET,为需要替换的变量,根据实际获取值更新。其它接口也采用相同的标注,不再说明。

若企业安装了第三方应用,该服务商可通过“获取企业access_token”获得此调用凭证。

参数说明:
参数
   必须
   说明
  corpid
   是
   企业ID
  corpsecret
   是
   应用的凭证密钥
  权限说明:
每个应用有独立的secret,所以每个应用的access_token应该分开来获取
返回结果:
{
  "errcode":0,
  "errmsg":"",
  "access_token": "accesstoken000001",
  "expires_in": 7200
}
参数
   说明
  access_token
   获取到的凭证,最长为512字节
  expires_in
   凭证的有效时间(秒)
  出错返回示例:
{
  "errcode":40091,
  "errmsg":"secret is invalid"
}
特别说明:

企业微信所有接口,返回包里都有errcode、errmsg。开发者需根据errcode是否为0判断是否调用成功(errcode意义请见全局错误码)。
而errmsg仅作参考,后续可能会有变动,因此不可作为是否调用成功的判据。
后面不再赘述。

其中企业的id和应用的凭证秘钥可以在术语介绍中找到,但是需要管理员权限
我们拿到access_token之后就可已进行消息的推送了,官方的api给了很多的消息类型,我只是简单的开发了文本卡片消息,
因为官方发送消息的api已经很详细了,上面的都包括了,我只是记录一下自己的思路。所以,下面直接上代码。
@Servicepublic class QywxSendMessageServiceImpl implements QywxSendMessageService{  private final String agentid="1000003"; //这是企业应用的id private final String secret="qiyeyingyongmiyao";//这是企业应用的秘钥,自己手动更新  @Override public String sendMessage(Params param) {  String qywxId = param.getString("qywxId");//获取参数,企业微信的id   String token =getAccessToken(qywxId,secret);//获取token        String userId=param.getString("userId");//推送给具体某个人的userid        String departmentId="";        String content=param.getString("context");//        String msgtype="mytext";//        String agentid="1000002";//WxConstants.AGENTID是应用的agenid//        String content="测试消息推送:你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。";                 Map<String,Object> params = new LinkedHashMap<String,Object>();        params.put("touser", userId);//        params.put("toparty", departmentId);        params.put("agentid", agentid);        JSONObject mytext = new JSONObject();        mytext.put("title","领奖通知");        mytext.put("description","<div class=\"gray\">2009年5月10日</div> <div class=\"normal\">恭喜你抽中玛莎拉蒂一辆,领奖码:xxxx</div><div class=\"highlight\">请于2009年5月9日前联系行政同事领取</div>");        mytext.put("url","url");        mytext.put("btntxt","更多");//        params.put("msgtype", "text");        params.put("msgtype", "textcard");        params.put("textcard",mytext);        String result="发送失败";        try {            String aa=HttpUtils.httpPostMethod("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token,  params);            JSONObject parseObject = JSON.parseObject(aa);            String string = parseObject.getString("errcode");            if("0".equals(string)){             result="发送成功";            }else{             result=aa;            }            System.out.println("1.推送消息请求微信接口=="+aa);        } catch (Exception e) {            e.printStackTrace();        }  return result; }  private String getAccessToken(String qywxId, String secret2) {  String url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+qywxId+"&corpsecret="+secret2+"";  String token=null;  try {   token = HttpUtils.httpGetMethod(url);     } catch (Exception e) {   e.printStackTrace();  }  return token; } }
 
public class HttpUtils {  public static String httpPostMethod(String url,   Map<String, Object> params) {  String returnValue = "接口调用失败";        CloseableHttpClient httpClient = HttpClients.createDefault();        HttpPost post = new HttpPost(url);        post.setHeader("Content-Type","Content-Type");        post.setEntity(new StringEntity(JSON.toJSONString(params), "utf-8"));        CloseableHttpResponse response = null;        try{         response = httpClient.execute(post);         if(response != null && response.getStatusLine().getStatusCode() == 200){          HttpEntity entity = response.getEntity();          returnValue = EntityUtils.toString(entity);                   }        }        catch(Exception e)        {            e.printStackTrace();        }         finally {            try {                httpClient.close();            } catch (Exception e) {                //                 e.printStackTrace();            }        }        //第五步:处理返回值        return returnValue; }  public static String httpGetMethod(String url) throws Exception, Exception {     CloseableHttpClient httpClient = HttpClients.createDefault();       HttpGet get = new HttpGet(url);       CloseableHttpResponse response = null;       response = httpClient.execute(get);      HttpEntity entity = response.getEntity();   String returnValue = EntityUtils.toString(entity);   JSONObject jsonObject = JSON.parseObject(returnValue);   String token = jsonObject.getString("access_token");   //建议此处需要将token缓存起来,避免总是调用接口  return token;     } }
————————————————
版权声明:本文为CSDN博主「嘎嘎&amp;宝宝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aStartStudy/article/details/90215415