![summary-icon](https://cdn-vip.kingdee.com/statics/webfront/summary_icon.png)
本文介绍了如何实现在苍穹平台上主动推送消息到微信公众号的功能。首先,需集成微信公众号的单点登录功能,之后通过新建微信公众号渠道和重写渠道解析类的方式,使用微信官方API向用户推送消息。实现过程中,需要重写`sendMessage`方法,获取access_token,并根据用户ID获取对应的openid,然后构造模板消息并通过HTTP请求发送给微信公众号。此外,文中还提及了开发环境版本、注意事项和参考资料,以及部分核心源代码的展示。
关键词:微信公众号,消息
一、需求
苍穹平台可以主动推送消息到微信公众号
二、思路与方案
2.1分析思路
想实现这个功能需要优先集成微信公众号得单点登录功能。方案如下
https://dev.kingdee.com/docs/d004ecf6-1b02-4376-bc3a-a835d8ba776e
2.2实现方案
单点登录集成后,t_bas_immapping表会存入微信的openid。这个后面会用到。
1、新建微信公众号渠道
2、了解微信公众号消息发送机制,需要查看微信开发官方文档,需要去微信官网查看
3、重写渠道解析类,向微信公众号推送消息
三、实现过程
1、新建微信公众号渠道
2、重写渠道解析类,继承kd.bos.workflow.engine.msg.handler.AbstractMessageServiceHandler。
因为这边只需要实现发送消息,createtodo,dealtodo,deletetodo等方法可以不用重写,只需要重写sendMessage方法即可。
public class SendMsgToWeChatOA extends AbstractMessageServiceHandler { private Log log = LogFactory.getLog(SendMsgToWeChatOA.class); @Override public void createToDo(MessageContext messageContext, ToDoInfo toDoInfo) { } @Override public void dealToDo(MessageContext messageContext, ToDoInfo toDoInfo) { } @Override public void deleteToDo(MessageContext messageContext, ToDoInfo toDoInfo) { } //重写sendMessage,给微信公众号发消息 @Override public void sendMessage(MessageContext ctx, MessageInfo message) { super.sendMessage(ctx, message); String mobUrl = message.getMobContentUrl(); String contentUrl = message.getContentUrl(); Long id = message.getId(); String title = message.getMessageTitle().getLocaleValue_zh_CN(); String content = message.getMessageContent().getLocaleValue_zh_CN(); Map<String, Object> publicParamWhole = SystemParamServiceHelper.loadPublicParametersFromCache(); //微信获取token地址 String url = publicParamWhole.get("tokenurl").toString(); //公众号appid String gzhappid = publicParamWhole.get("appid").toString(); //公众号密码 String gzhappsecret = publicParamWhole.get("appsecret").toString(); //公众号模板消息 模板id String templateid = publicParamWhole.get("templateid").toString(); url = url+"&appid="+appid+"&secret="+appsecret; String accessToken = ""; //获取token String responseStr = HttpUtils.request(url); if(!StringUtils.isEmpty(responseStr)){ JSONObject jsonObject = JSONObject.parseObject(responseStr); accessToken = jsonObject.getString("access_token"); if(StringUtils.isEmpty(accessToken)){ String errmsg = jsonObject.getString("errmsg"); } } List<Long> userIds = message.getUserIds(); List<Long> errUserIds = new ArrayList<Long>(); if(!StringUtils.isEmpty(accessToken)){ //模板消息url url = publicParamWhole.get("mburl").toString(); url = url+accessToken; JSONObject requestJson = new JSONObject(); requestJson.put("template_id",templateid); requestJson.put("url",mobUrl); requestJson.put("client_msg_id",id); JSONObject dataJson = JSONObject.parseObject(content); requestJson.put("data",dataJson); for(Long userId:userIds){ //只有通过微信公众号单点登陆过的用户,苍穹平台才会留存openid,否则无法正常推送消息 String openid = getUserOpenId(userId); if(StringUtils.isEmpty(openid)){ continue; } requestJson.put("touser",openid); String response = HttpUtils.post(url, null, requestJson.toJSONString()); log.info("公众号:"+response); if(!StringUtils.isEmpty(response)){ errUserIds.add(userId); }else{ JSONObject json = JSONObject.parseObject(response); Integer errcode = json.getInteger("errcode"); if(errcode!=0){ errUserIds.add(userId); } } } if(errUserIds.size()>0){ message.setUserIds(errUserIds); throw new KDBizException("推送公众号消息失败,请联系管理员!"); } }else{ throw new KDBizException("推送公众号消息失败,获取token失败!"); } } //根据用户id获取微信openid private String getUserOpenId(Long userId) { String openid = ""; //普通微信表里存了1 QFilter filter = new QFilter("imtype", QCP.equals,"1"); filter = filter.and(new QFilter("userid", QCP.equals,userId)); DynamicObjectCollection openids = QueryServiceHelper.query("bas_immapping", "openid", new QFilter[]{filter}); if(openids.size()>0){ openid = openids.get(0).getString("openid"); } return openid; } }
四、效果图
五、开发环境版本
V5.0.011
六、注意事项
1、微信公众号消息推送,需要先集成单点登录,只有单点登录过的用户才能主动推送公众号消息,类似于需要关注公众号才能接收消息一样,没有单点登陆过苍穹的微信用户无法接收到公众号消息
2、微信公众号开发集成,除了需要熟悉苍穹开发平台渠道集成方案,也需要熟悉微信公众号开发对接方案。
七、参考资料
八、源代码
源码.zip(1.58KB)
推荐阅读