[Java教程]httpClient实现微信公众号消息群发

0 2016-09-21 20:00:10

1、实现功能

向关注了微信公众号的微信用户群发消息。(可以是所有的用户,也可以是提供了微信openid的微信用户集合)

2、基本步骤

前提:

已经有认证的公众号或者测试公众账号

发送消息步骤:发送一个请求微信去获取access_token

发送一个请求去请求微信发送消息

相关微信接口的信息可以查看:http://www.cnblogs.com/0201zcr/p/5866296.html 有测试账号的申请 + 获取access_token和发送微信消息的url和相关的参数需求。各个参数的意义等。

3、实践

这里通过HttpClient发送请求去微信相关的接口。

1)maven依赖org.apache.httpcomponentshttpclient4.3.1

2)httpClient使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。创建HttpClient对象。

创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

释放连接。无论执行方法是否成功,都必须释放连接——这里使用了连接池,可以交给连接池去处理

3)实例

1、发送请求的类import com.alibaba.druid.support.json.JSONUtils;import com.alibaba.druid.support.logging.Log;import com.alibaba.druid.support.logging.LogFactory;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.seewo.core.util.json.JsonUtils;import org.apache.commons.collections.map.HashedMap;import org.apache.commons.lang.StringUtils;import org.apache.http.HttpHost;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.params.ConnRoutePNames;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.PoolingClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import javax.net.ssl.SSLContext;import javax.net.ssl.X509TrustManager;import javax.security.cert.CertificateException;import javax.security.cert.X509Certificate;import java.io.IOException;import java.text.MessageFormat;import java.util.ArrayList;import java.util.List;import java.util.Map;/** * Created by zhengcanrui on 16/9/20. */public class WechatAPIHander { /** * 获取token接口 */ private String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; /** * 拉微信用户信息接口 */ private String getUserInfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}"; /** * 主动推送信息接口(群发) */ private String sendMsgUrl = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}"; private HttpClient webClient; private Log log = LogFactory.getLog(getClass()); public void initWebClient(String proxyHost, int proxyPort){ this.initWebClient(); if(webClient != null && !StringUtils.isEmpty(proxyHost)){ HttpHost proxy = new HttpHost(proxyHost, proxyPort); webClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); } } /** * @desc 初始化创建 WebClient */ public void initWebClient() { log.info("initWebClient start...."); try { PoolingClientConnectionManager tcm = new PoolingClientConnectionManager(); tcm.setMaxTotal(10); SSLContext ctx = SSLContext.getInstance("TLS"); X509TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[0]; } }; ctx.init(null, new X509TrustManager[] { tm }, null); SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Scheme sch = new Scheme("https", 443, ssf); tcm.getSchemeRegistry().register(sch); webClient = new DefaultHttpClient(tcm); } catch (Exception ex) { log.error("initWebClient exception", ex); } finally { log.info("initWebClient end...."); } } /** * @desc 获取授权token * @param appid * @param secret * @return */ public String getAccessToken(String appid, String secret) { String accessToken = null; try { log.info("getAccessToken start.{appid=" + appid + ",secret:" + secret + "}"); String url = MessageFormat.format(this.getTokenUrl, appid, secret); String response = executeHttpGet(url); Map map = JsonUtils.jsonToMap(response); accessToken = (String) map.get("access_token"); /* Object Object = JSONUtils.parse(response); accessToken = jsonObject.getString("access_token");*/// accessToken = JsonUtils.read(response, "access_token"); } catch (Exception e) { log.error("get access toekn exception", e); } return accessToken; } /** * @desc 推送信息 * @param token * @param msg * @return */ public String sendMessage(String token,String msg){ try{ log.info("\n\nsendMessage start.token:"+token+",msg:"+msg); String url = MessageFormat.format(this.sendMsgUrl, token); HttpPost post = new HttpPost(url); ResponseHandler> responseHandler = new BasicResponseHandler(); //这里必须是一个合法的json格式数据,每个字段的意义可以查看上面连接的说明,content后面的test是要发送给用户的数据,这里是群发给所有人 msg = "{\"filter\":{\"is_to_all\":true},\"text\":{\"content\":\"test\"},\"msgtype\":\"text\"}\""; //设置发送消息的参数 StringEntity entity = new StringEntity(msg); //解决中文乱码的问题 entity.setContentEncoding("UTF-8"); entity.setContentType("application/json"); post.setEntity(entity); //发送请求 String response = (String) this.webClient.execute(post, responseHandler); log.info("return response=====start======"); log.info(response); log.info("return response=====end======"); return response; }catch (Exception e) { log.error("get user info exception", e); return null; } } /** * @desc 发起HTTP GET请求返回数据 * @param url * @return * @throws IOException * @throws ClientProtocolException */ private String executeHttpGet(String url) throws IOException, ClientProtocolException { ResponseHandler> responseHandler = new BasicResponseHandler(); String response = (String) this.webClient.execute(new HttpGet(url), responseHandler); log.info("return response=====start======"); log.info(response); log.info("return response=====end======"); return response; }}

2、Controller和Service层调用@RequestMapping(value = "/testHttpClient", method = RequestMethod.GET) public DataMap test() { WechatAPIHander wechatAPIHander = new WechatAPIHander(); //获取access_token

//第一个参数是你appid,第二个参数是你的秘钥,需要根据你的具体情况换 String accessToken = wechatAPIHander.getAccessToken("appid","scerpt"); //发送消息 wechatAPIHander.sendMessage(accessToken, "测试数据"); return new DataMap().addAttribute("DATA",accessToken); }

3、结果

假如你关注了微信公众号中看到你刚刚发送的test消息。

HttpClient学习文档:https://pan.baidu.com/s/1miO1eOg

致谢:感谢您的阅读

本文网址:http://www.shaoqun.com/a/251215.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

ie

0

java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发相关推荐

  1. httpClient实现微信公众号消息群发

    1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信openid的微信用户集合) 2.基本步骤 前提: 已经有认证的公众号或者测试公众账号 发送消息步骤: 发送一 ...

  2. 微信公众号无限群发消息 v5.7.1 多功能版全开源 + 配置教程

    简介: 公众号无限群发消息模块,为运营而生 1.关于普通版与多功能版区别: 普通版:只能发文字,每次只能发500人,多了会卡死,需要再选下五百人(且不再更新). 多功能版:支持TD退订功能(用户发送t ...

  3. PHP公众号群发用户过多,微信运营:为什么有的微信公众号没有群发限制,可以多次群发图文?...

    微信公众平台规定:服务号每月(自然月)只能群发4次消息,订阅号每天可以群发1次消息.这个规定也是希望公众号不要过分打扰粉丝. 我们平时看公众号时会发现,有些公众号没有群发限制,每天都可以发布好几次消息 ...

  4. php微信公众号无限制群发,微信公众号无限群发 - viki_php的个人空间 - OSCHINA - 中文开源技术交流社区...

    /* Author:yf 使用说明:微信公众号无线群发接口,使用实例: $test = new SendAllMsg("你的appId","你的appSecret&quo ...

  5. 微信三方代开发公众号消息管理-群发消息

    三方代开发公众号消息管理-群发消息 微信公众平台为订阅号提供了每天1条的群发权限,为服务号提供每月(自然月)4条的群发权限.而对于某些具备开发能力的公众号运营者,可以通过高级群发接口,实现更灵活的群发 ...

  6. 公众号开发-群发图文中插入小程序卡片报错 invalid content hint 的解决

    如果你也正在开发群发图文中插入小程序的功能,那么大概率也会遇到这问题. 之前通过微信第三方开放平台开发过一个可以管理多个公众号的系统,具体功能和效果可以参考 微信第三方开放平台代公众号实现业务 . 为 ...

  7. 微信公众号消息通知手把手教程

    项目需求:微信公众号消息推送 首先你需要我给你提供以下地址  方便你进行开发 准备阶段: a 模版消息推送开发文档   链接 b 微信公众号测试号地址   链接 c 微信公众平台接口调试工具  链接 ...

  8. php 实现群发表结构,利用php怎么实现一个微信公众号无限群发功能

    利用php怎么实现一个微信公众号无限群发功能 发布时间:2021-01-25 17:32:14 来源:亿速云 阅读:66 作者:Leah 今天就跟大家聊聊有关利用php怎么实现一个微信公众号无限群发功 ...

  9. 一个公众号可以绑定几个小程序_微信开放平台可以绑定几个小程序和公众号?...

    微信开放平台可以绑定几个小程序和公众号?How many small programs and official accounts can be bound to the WeChat open pl ...

最新文章

  1. java实现简易客户信息管理系统
  2. Hello Android – 迈出android开发第一步
  3. java udp 多播 广播_Java UDP 广播与多播
  4. 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录
  5. docker环境搭建
  6. 高效开发iOS系列 -- 那些不为人知的KVC
  7. 阿里园区的这个“格子间” 成为企业高效协同新利器
  8. 你是怎样“被平均”的?细数统计数据中的那些坑
  9. 用CSS美化你的滚动条
  10. 首次公开专利并且专利数量最多公司(2022.07.25-2022.7.31)
  11. ChinaITLab-Linux工程师培训课程笔记5
  12. xp系统打印机服务器报错,win10系统连接xp系统共享打印机报错0x000004的具体方法...
  13. 【零基础学Python】Day9 Python推导式
  14. 用python将视频转化为图片
  15. python批量处理照片为可打印的黑底白字图片
  16. Cadence改背景色
  17. 百里挑一:ICLR 2021杰出论文奖出炉!
  18. ifft变换用java_利用FFT 及 IFFT实现傅立叶正反变换 | 学步园
  19. 搭建Ethereum以太坊测试网络Rinkeby节点
  20. 网站建设安全隐患有哪些,网站如何确保安全性?

热门文章

  1. thinkcmfx漏洞太大_ThinkCMF5 代码执行漏洞及后续有关思考
  2. bom event周期_前端知识点总结——BOM
  3. 20210614 什么是状态?什么是状态空间?
  4. 2021-05-10 矩阵AB和矩阵BA有什么联系?
  5. UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
  6. Celery分布式任务队列的认识和基本操作
  7. Lucene 02 - Lucene的入门程序(Java API的简单使用)
  8. Android RecyclerView使用GridLayoutManager间距设置
  9. Linux 进程间通讯详解五
  10. javascript数组的操作