1.前置条件
- 企业微信appId
- 企业微信secret
- 企业微信绑定小程序
- 小程序的appId
2.发送示例
2.1 获取access_token(HTTPS-GET)
请求URL:
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=corpid&corpsecret=corpsecret
示例入参:
corpid=wx161we55e1fe5e4fr
corpsecret=Rspav9pmjem3zve8fkjqe6yTtCs78Rwdabn6tNdU1g
public class AccessToken { // 获取到的凭证 private String token; // 凭证有效时间,单位:秒 private int expiresIn; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public int getExpiresIn() { return expiresIn; } public void setExpiresIn(int expiresIn) { this.expiresIn = expiresIn; } }
// url就是上述的,完整如下: // https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wx161we55e1fe5e4fr&corpsecret=Rspav9pmjem3zve8fkjqe6yTtCs78Rwdabn6tNdU1g public static AccessToken getAccessToken(String url) { logger.info("[WeixinUtil.getAccessToken]:start getAccessToken,url:" + url); AccessToken accessToken = null; JSONObject jsonObject = httpRequest(url, "GET", null); if (jsonObject != null) { try { accessToken = new AccessToken(); accessToken.setToken(jsonObject.getString("access_token")); accessToken.setExpiresIn(jsonObject.getInteger("expires_in")); } catch (JSONException e) { accessToken = null; logger.error("[WeixinUtil.getAccessToken]:getAccessToken occured an JSONException,errcode:" + jsonObject.getInteger("errcode") + ",errmsg:" + jsonObject.getString("errmsg") + ",JSONException:" + e); } } logger.info("[WeixinUtil.getAccessToken]:end getAccessToken."); return accessToken; }
2.2 发送
logger.info("发送企业号获取Token结束:" + accessTokenUrl + ",accessToken:" + JSONObject.toJSONString(accessToken)); // 查询通讯录分组,分组ID:在线咨询医生 String getDeptUserUrl = null; if(10000 == hospitalId) { getDeptUserUrl = WechatUtil.QY_GET_DEPT_USER_URL_XMHA.replace("ACCESS_TOKEN", accessToken.getToken()) .replace("DEPARTMENT_ID", "123").replace("FETCH_CHILD", "1"); } else if(10001 == hospitalId) { getDeptUserUrl = WechatUtil.QY_GET_DEPT_USER_URL_XMHA.replace("ACCESS_TOKEN", accessToken.getToken()) .replace("DEPARTMENT_ID", "124").replace("FETCH_CHILD", "1"); } JSONObject hResponse = WechatUtil.httpRequest(getDeptUserUrl, "GET", null); if (null == hResponse) { logger.info("未能成功获取到通讯录"); return; } String docNo = getDoctorNo(doctorNo); WXQYUser toWXQYUser = null; List<WXQYUser> wXQYUserList = getWXQYUserList(hResponse); for (WXQYUser wxQYUser : wXQYUserList) { if (docNo.equals(wxQYUser.getHisid())) { // 发消息 toWXQYUser = wxQYUser; break; } } if (null != toWXQYUser) { String toUserId = toWXQYUser.getUserid(); String time = DateUtil.formatDate("MM-dd HH:mm", new Date()); String descTime = time.split(" ")[0].substring(0, 2) + "月" + time.split(" ")[0].substring(3) + "日 " + time.split(" ")[1]; String appIdForMiniProgram = imSystemConfigService.getImSystemConfig(hospitalId, HUUtil.APP_ID_FOR_MINI_PROGRAM); String jsonParam = "{\"touser\": \"" + toUserId + "\",\"toparty\":\"\",\"totag\":\"\",\"msgtype\":\"miniprogram_notice\",\"miniprogram_notice\":" + "{\"appid\":\"" +appIdForMiniProgram + "\",\"page\":\"pages/index/chat/trade-start/trade-start?orderNo=" + orderNo +"\"," + "\"title\":\"新订单接诊提醒\",\"description\": \"" + descTime + "\",\"emphasis_first_item\":true," + "\"content_item\":[{\"key\":\"接诊通知\",\"value\":\"来新咨询订单了\"},{\"key\":\"咨询人\",\"value\":\""+subTitle+"\"},{\"key\":\"病情描述\",\"value\":\""+content+"\"}]},\"enable_id_trans\":0," + "\"enable_duplicate_check\":0,\"duplicate_check_interval\":1800}"; logger.info("开始发送微信企业号消息,入参:" + jsonParam); String imsServiceDomainConfigStr = imSystemConfigService.getImSystemConfig(hospitalId, HUUtil.IMS_SERVICE_WECHAT_QYH_TEMPLATE_DOMAIN_CONFIG_KEY); if (null == imsServiceDomainConfigStr || "".equals(imsServiceDomainConfigStr)) { logger.info("IMS发送微信企业号消息服务地址配置信息不存在:" + hospitalId); return; } imsServiceDomainConfigStr = imsServiceDomainConfigStr + "?access_token=" + accessToken.getToken(); String result = HUHttpUtil.sendJsonPostRequest(imsServiceDomainConfigStr, jsonParam, 0); logger.info("开始发送微信企业号消息,结果:" + result); } else { logger.info("该医生" + doctorNo + "在企业号通讯录中不存在,终止发送企业号消息"); }
完整代码示例(建议异步)
private static final ThreadLocal<ExecutorService> synExecuteService = ThreadLocal.withInitial(() -> Executors.newFixedThreadPool(200)); private final static String QY_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=CORPID&corpsecret=SECRET"; private final static String QY_GET_DEPT_USER_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD"; public void sendOpenWxMsg(final String doctorNo, final String title, final String subTitle, final String content, final String toUrl, final String orderNo, final long hospitalId) { synExecuteService.submit(() -> { String appIdAppSecretConfigStr = imSystemConfigService.getImSystemConfig(hospitalId, HUUtil.WEIXIN_QY_APPID_SECRET_CONFIG_FOR_MINI_PROGRAM); if (null == appIdAppSecretConfigStr || "".equals(appIdAppSecretConfigStr)) { logger.info("未查询到APPID信息:" + hospitalId + ",KEY:" + HUUtil.WEIXIN_QY_APPID_SECRET_CONFIG); return; } String accessTokenUrl = WechatUtil.QY_ACCESS_TOKEN_URL_XMHA.replace("CORPID", appIdAppSecretConfigStr.split("=")[0]) .replace("SECRET", appIdAppSecretConfigStr.split("=")[1]); AccessToken accessToken = WechatUtil.getAccessToken(accessTokenUrl); if (null == accessToken) { logger.info("未能成功获取到AccessToken"); return; } logger.info("发送企业号获取Token结束:" + accessTokenUrl + ",accessToken:" + JSONObject.toJSONString(accessToken)); // 查询通讯录分组,分组ID:在线咨询医生 String getDeptUserUrl = null; // 不同医院部门编号不一样,对应部门编号在企业微信查看 if(10000 == hospitalId) { getDeptUserUrl = WechatUtil.QY_GET_DEPT_USER_URL_XMHA.replace("ACCESS_TOKEN", accessToken.getToken()) .replace("DEPARTMENT_ID", "123").replace("FETCH_CHILD", "1"); } else if(10001 == hospitalId) { getDeptUserUrl = WechatUtil.QY_GET_DEPT_USER_URL_XMHA.replace("ACCESS_TOKEN", accessToken.getToken()) .replace("DEPARTMENT_ID", "124").replace("FETCH_CHILD", "1"); } JSONObject hResponse = WechatUtil.httpRequest(getDeptUserUrl, "GET", null); if (null == hResponse) { logger.info("未能成功获取到通讯录"); return; } String docNo = getDoctorNo(doctorNo); WXQYUser toWXQYUser = null; List<WXQYUser> wXQYUserList = getWXQYUserList(hResponse); for (WXQYUser wxQYUser : wXQYUserList) { if (docNo.equals(wxQYUser.getHisid())) { // 发消息 toWXQYUser = wxQYUser; break; } } if (null != toWXQYUser) { String toUserId = toWXQYUser.getUserid(); String time = DateUtil.formatDate("MM-dd HH:mm", new Date()); String descTime = time.split(" ")[0].substring(0, 2) + "月" + time.split(" ")[0].substring(3) + "日 " + time.split(" ")[1]; String appIdForMiniProgram = imSystemConfigService.getImSystemConfig(hospitalId, HUUtil.APP_ID_FOR_MINI_PROGRAM); String jsonParam = "{\"touser\": \"" + toUserId + "\",\"toparty\":\"\",\"totag\":\"\",\"msgtype\":\"miniprogram_notice\",\"miniprogram_notice\":" + "{\"appid\":\"" +appIdForMiniProgram + "\",\"page\":\"pages/index/chat/trade-start/trade-start?orderNo=" + orderNo +"\"," + "\"title\":\"新订单接诊提醒\",\"description\": \"" + descTime + "\",\"emphasis_first_item\":true," + "\"content_item\":[{\"key\":\"接诊通知\",\"value\":\"来新咨询订单了\"},{\"key\":\"咨询人\",\"value\":\""+subTitle+"\"},{\"key\":\"病情描述\",\"value\":\""+content+"\"}]},\"enable_id_trans\":0," + "\"enable_duplicate_check\":0,\"duplicate_check_interval\":1800}"; logger.info("开始发送微信企业号消息,入参:" + jsonParam); // 微信企业号消息发送服务地址 http://ip:port/mp-api/wechat/enterprise/message/send String imsServiceDomainConfigStr = imSystemConfigService.getImSystemConfig(hospitalId, HUUtil.IMS_SERVICE_WECHAT_QYH_TEMPLATE_DOMAIN_CONFIG_KEY); if (null == imsServiceDomainConfigStr || "".equals(imsServiceDomainConfigStr)) { logger.info("IMS发送微信企业号消息服务地址配置信息不存在:" + hospitalId); return; } imsServiceDomainConfigStr = imsServiceDomainConfigStr + "?access_token=" + accessToken.getToken(); String result = HUHttpUtil.sendJsonPostRequest(imsServiceDomainConfigStr, jsonParam, 0); logger.info("开始发送微信企业号消息,结果:" + result); } else { logger.info("该医生" + doctorNo + "在企业号通讯录中不存在,终止发送企业号消息"); } }); } /** * 发送GET请求 * * @param requestUrl * @param requestMethod * @param outputStr * @return */ public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { logger.info("[WeixinUtil.httpRequest]:请求入参:" + requestUrl); String respStr = HUHttpUtil.sendGet(requestUrl, null); logger.info("[WeixinUtil.httpRequest]:请求响应:" + respStr); try { return JSON.parseObject(respStr); } catch (Exception e) { e.printStackTrace(); } return null; } private List<WXQYUser> getWXQYUserList(JSONObject hResponse) { List<JSONObject> wXQYUserList = (List<JSONObject>) hResponse.get("userlist"); List<JSONObject> nmList = null; WXQYUser wxQYUser = null; JSONObject mm = null; List<WXQYUser> wxQYUserList = new ArrayList<WXQYUser>(); for (JSONObject jsObject : wXQYUserList) { if (jsObject.containsKey("userid")) { if (jsObject.containsKey("extattr")) { mm = jsObject.getJSONObject("extattr"); if (null != mm.get("attrs")) { nmList = (List<JSONObject>) mm.get("attrs"); for (JSONObject nmObject : nmList) { if (nmObject.containsKey("name") && "hisid".equals(nmObject.getString("name")) && null != nmObject.getString("value") && !"".equals(nmObject.getString("value"))) { wxQYUser = new WXQYUser(); wxQYUser.setUserid(jsObject.getString("userid")); wxQYUser.setName(jsObject.getString("name")); wxQYUser.setMobile(jsObject.getString("mobile")); wxQYUser.setHisid(nmObject.getString("value")); wxQYUserList.add(wxQYUser); } } } } } } return wxQYUserList; } // 企业微信存储12345,数据库存储:医院ID+12345,随意这里做截取再去匹配 private String getDoctorNo(String doctorNo) { if (doctorNo.startsWith("10000")) { return doctorNo.substring(5, doctorNo.length()); } if (doctorNo.startsWith("10001")) { return doctorNo.substring(5, doctorNo.length()); } return doctorNo; }
class WXQYUser { private String userid; private String name; private String mobile; private String hisid; public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getHisid() { return hisid; } public void setHisid(String hisid) { this.hisid = hisid; } }