简单的企业微信推送消息开发
企业微信登陆地址: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
是
调用接口凭证
各个消息类型的具体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”,可以看到使用场景中有消息推送,点击 获取企业凭证进行查看。
说明
适用场景
服务商的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
是
应用的凭证密钥
权限说明:
必须
说明
corpid
是
企业ID
corpsecret
是
应用的凭证密钥
权限说明:
每个应用有独立的secret,所以每个应用的access_token应该分开来获取
返回结果:
{
"errcode":0,
"errmsg":"",
"access_token": "accesstoken000001",
"expires_in": 7200
}
参数
说明
access_token
获取到的凭证,最长为512字节
expires_in
凭证的有效时间(秒)
出错返回示例:
说明
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博主「嘎嘎&宝宝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aStartStudy/article/details/90215415
————————————————
版权声明:本文为CSDN博主「嘎嘎&宝宝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aStartStudy/article/details/90215415