微信公众号发送消息给指定的用户
近期做的需求是一个流程提交后,在微信公众号上推送消息给流程的审核人员,通知审核人员。
分析:
首先推送给用户的话,需要用户关注微信公众号,将公众号对应的openid与业务系统的用户表进行绑定从而建立对照关系;
然后便是在流程提交的时候获取到对应的审核人员,去数据库中取得对应的openid,根据 openid 进行消息推送,消息推送建议写成异步的,避免发送消息报错影响到正常的业务系统。
说明:做这个需求之前已经做过另外一个需求,就是微信公众号增加业务系统的访问菜单,用户第一次访问的时候,需要对业务系统进行绑定(用户表的yhm 和openid做绑定),
绑定成功后进入业务系统,第二次在访问的时候直接进入业务系统,不需要二次登录和二次绑定。当然还有解绑。
第一步、获取access_token
这里获取的access_token是普通的access_token值,通过 https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 来获取。
详情可参考此链接:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
第二步、调用推送接口发送消息
发送文本消息的接口地址:https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=
发送模板消息的接口地址:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=
发送模板消息需要创建一个模板,可以在微信公众号后台模板消息一栏中去添加模板。
目前针对多个用户的消息推送,只能是for循环逐一推送,如果朋友们有更好的方法也推荐下。
代码实现:代码中appid,appsecret,template_id 需要用实际的值,
目前代码没有针对发送失败的情况做处理,朋友们可以自行做处理。
public static void sendWechatMessage(List<String> yhlist,String context){ //获取的 appid(微信公众号号)
String appid = "343546ghdfdfg"; //获取的 appid(微信公众号)
String appsecret = "fdsdfgsdfsdfg4334lgdfg";
//发送文本消息接口https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=
String textMessagePath = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="; //发送模板消息的接口地址:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=
String templateMeaagePath = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
//获取微信服务号的access_token接口地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
String app_accesstoken_path = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=";
//模板ID
String template_id = "sdfgdgdfhgfgjdfgserye";//获取token值
String accesstoken = HttpRequestUtil.getAccessToken(app_accesstoken_path+appid+"&secret="+appsecrect);
//yhlist是业务系统获取的人员,需要根据这个获取用户表中对应的openid。
List<String> openidList = new ArrayList<String>();
JwglxtIndexModel model = new JwglxtIndexModel();
String[] yharr = (String[])yhlist.toArray(new String[yhlist.size()]);
model.setPks(yharr);
openidList = indeDao.getOpenidByuser(model);
//模板消息格式
JSONObject jsonObject = new JSONObject();
jsonObject.put("template_id", template_id);
jsonObject.put("url", "");
JSONObject data = new JSONObject();
JSONObject first = new JSONObject();
first.put("value", "调课详细信息");
first.put("color", "#173177");
JSONObject keyword1 = new JSONObject();
keyword1.put("value", context);
keyword1.put("color", "#173177");
JSONObject remark = new JSONObject();
remark.put("value", "请同学之间相互告知");
remark.put("color", "#173177");
data.put("first",first);
data.put("keyword1",keyword1);
data.put("remark",remark);
jsonObject.put("data", data);
//开始推送模板消息
for(String openID:openidList){
jsonObject.put("touser", openID);
String result = HttpRequestUtil.sendTextMessage(jsonObject.toJSONString(),templateMeaagePath +accesstoken);
LOG.error("result 推送结果:"+result);
}JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("msgtype", "text");
JSONObject data = new JSONObject();
data.put("content", context);
jsonObject1.put("text", data); //开始推送文本消息
for(String openID:openidList){
jsonObject1.put("touser", openID);
result = HttpRequestUtil.sendTextMessage(jsonObject1.toJSONString(),textMessagePath+accesstoken);
LOG.error("result 推送结果:"+result);
}}
HttpRequestUtil工具类
//消息推送
public static String sendTextMessage(String jsonObiect,String sendPath){
String resp = "";//响应
try {
try {
// 构造httprequest设置
CloseableHttpClient httpClient = null;
HttpPost postMethod = null;
HttpResponse response = null;
httpClient = HttpClients.createDefault();
postMethod = new HttpPost(sendPath);//传入URL地址
//设置请求头
postMethod.addHeader("Content-type", "application/json; charset=utf-8");
postMethod.addHeader("X-Authorization", "AAAA");
postMethod.setEntity(new StringEntity(jsonObiect, Charset.forName("UTF-8")));
response = httpClient.execute(postMethod);
LOG.error("response:"+response);
//获取响应
resp = EntityUtils.toString(response.getEntity(),"UTF-8");
LOG.error("resp:"+resp);
} catch (Exception e) {
LOG.error("发送POST请求出现异常!" + e);
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return resp;
}
//获取access_token值,有待优化过期时间问题。
public static String getAccessToken(String app_accesstoken_path){
String access_token = "";
HttpResponse response = null;
try {
// 构造httprequest设置
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(app_accesstoken_path);
//添加请求头
request.addHeader("User-Agent", "Mozilla/5.0");
response = client.execute(request);
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
LOG.error("resultxx:"+result);
Map<String, String> access_tokenMap = (Map<String,String>)JSON.parse(result.toString());
LOG.error("access_tokenMapxx:"+access_tokenMap.toString());
access_token = access_tokenMap.get("access_token");
LOG.error("access_tokenxx:"+access_token);
} catch (Exception e) {
LOG.error("发送GET请求出现异常!" + e);
e.printStackTrace();
}finally {
try {
((BufferedReader) response).close();
} catch (IOException e) {
e.printStackTrace();
}
}
return access_token;
}
结语:以上是实现微信公众号发送消息的步骤,不足之处请见谅!