本文实例讲述了Java编程调用微信接口实现图文信息等推送功能。分享给大家供大家参考,具体如下:

Java调用微信接口工具类,包含素材上传、获取素材列表、上传图文消息内的图片获取URL、图文信息推送。
微信图文信息推送因注意html代码字符串中将双引号(")替换成单引号('),不然信息页面中包含图片将无法显示且图片后面的内容也不会显示
官方文档:http://mp.weixin.qq.com/wiki/home/
StringBuilder sb=new StringBuilder();
sb.append("{\"articles\":[");
boolean t=false;
for(MicroWechatInfo info:list){
if(t)sb.append(",");
Pattern p = Pattern.compile("src\\s*=\\s*'(.*?)'",Pattern.CASE_INSENSITIVE);
String content = info.getMicrowechatcontent().replace("\"", "'");
Matcher m = p.matcher(content);
while (m.find()) {
String[] str = m.group().split("'");
if(str.length>1){
try {
if(!str[1].contains("//mmbiz.")){
content = content.replace(str[1], uploadImg(UrlToFile(str[1]),getAccessToken(wx.getAppid(), wx.getAppkey())).getString("url"));
}
} catch (Exception e) {
}
}
}
sb.append("{\"thumb_media_id\":\""+uploadMedia(new File(info.getMicrowechatcover()), getAccessToken(wx.getAppid(), wx.getAppkey()), "image").get("media_id")+"\"," +
"\"author\":\""+info.getMicrowechatauthor()+"\"," +
"\"title\":\""+info.getMicrowechattitle()+"\"," +
"\"content_source_url\":\""+info.getOriginallink()+"\"," +
"\"digest\":\""+info.getMicrowechatabstract()+"\"," +
"\"show_cover_pic\":\""+info.getShowcover()+"\"," +
"\"content\":\""+content+"\"}");
t=true;
}
sb.append("]}");
package com.xxx.frame.base.util;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.PartSource;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.protocol.Protocol;
import com.google.gson.Gson;
import com.xxx.frame.account.entity.MicroWechatAccount;
import com.xxx.frame.account.entity.MicroWechatInfo;
/**
* 微信工具类
* @author hxt
*
*/
public class WeixinUtil {
public static String appid = "xxxxxxxxxxxxxxxxxxxxxxx";
public static String secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// 素材上传(POST)
private static final String UPLOAD_MEDIA = "https://api.weixin.qq.com/cgi-bin/material/add_material";
private static final String UPLOAD_IMG = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";
private static final String BATCHGET_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material";
/**
* 获得ACCESS_TOKEN
* @param appid
* @param secret
* @return ACCESS_TOKEN
*/
public static String getAccessToken(String appid, String secret) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
JSONObject jsonObject = httpRequest(url, "GET", null);
try {
if(jsonObject.getString("errcode")!=null){
return "false";
}
}catch (Exception e) {
}
return jsonObject.getString("access_token");
}
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod))
httpUrlConn.connect();
// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
} catch (Exception e) {
}
return jsonObject;
}
/**
* 获得getUserOpenIDs
* @param accessToken
* @return JSONObject
*/
public static JSONObject getUserOpenIDs(String accessToken) {
String url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token="+accessToken+"&next_openid=";
return httpRequest(url, "GET", null);
}
/**
* 把二进制流转化为byte字节数组
* @param instream
* @return byte[]
* @throws Exception
*/
public static byte[] readInputStream(InputStream instream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1204];
int len = 0;
while ((len = instream.read(buffer)) != -1){
outStream.write(buffer,0,len);
}
instream.close();
return outStream.toByteArray();
}
public static File UrlToFile(String src){
if(src.contains("http://wx.jinan.gov.cn")){
src = src.replace("http://wx.jinan.gov.cn", "C:");
System.out.println(src);
return new File(src);
}
//new一个文件对象用来保存图片,默认保存当前工程根目录
File imageFile = new File("mmbiz.png");
try {
//new一个URL对象
URL url = new URL(src);
//打开链接
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
byte[] data = readInputStream(inStream);
FileOutputStream outStream = new FileOutputStream(imageFile);
//写入数据
outStream.write(data);
//关闭输出流
outStream.close();
return imageFile;
} catch (Exception e) {
return imageFile;
}
}
/**
* 微信服务器素材上传
* @param file 表单名称media
* @param token access_token
* @param type type只支持四种类型素材(video/image/voice/thumb)
*/
public static JSONObject uploadMedia(File file, String token, String type) {
if(file==null||token==null||type==null){
return null;
}
if(!file.exists()){
return null;
}
String url = UPLOAD_MEDIA;
JSONObject jsonObject = null;
PostMethod post = new PostMethod(url);
post.setRequestHeader("Connection", "Keep-Alive");
post.setRequestHeader("Cache-Control", "no-cache");
FilePart media = null;
HttpClient httpClient = new HttpClient();
//信任任何类型的证书
Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
try {
media = new FilePart("media", file);
Part[] parts = new Part[] { new StringPart("access_token", token),
new StringPart("type", type), media };
MultipartRequestEntity entity = new MultipartRequestEntity(parts,
post.getParams());
post.setRequestEntity(entity);
int status = httpClient.executeMethod(post);
if (status == HttpStatus.SC_OK) {
String text = post.getResponseBodyAsString();
jsonObject = JSONObject.fromObject(text);
} else {
}
} catch (FileNotFoundException execption) {
} catch (HttpException execption) {
} catch (IOException execption) {
}
return jsonObject;
}
/**
* 微信服务器获取素材列表
*/
public static JSONObject batchgetMaterial(String appid, String secret,String type, int offset, int count) {
try {
return JSONObject.fromObject( new String(HttpsUtil.post(BATCHGET_MATERIAL+"?access_token="+ getAccessToken(appid, secret), "{\"type\":\""+type+"\",\"offset\":"+offset+",\"count\":"+count+"}", "UTF-8"), "UTF-8"));
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 上传图文消息内的图片获取URL
* @param file 表单名称media
* @param token access_token
*/
public static JSONObject uploadImg(File file, String token) {
if(file==null||token==null){
return null;
}
if(!file.exists()){
return null;
}
String url = UPLOAD_IMG;
JSONObject jsonObject = null;
PostMethod post = new PostMethod(url);
post.setRequestHeader("Connection", "Keep-Alive");
post.setRequestHeader("Cache-Control", "no-cache");
HttpClient httpClient = new HttpClient();
//信任任何类型的证书
Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
try {
Part[] parts = new Part[] { new StringPart("access_token", token), new FilePart("media", file) };
MultipartRequestEntity entity = new MultipartRequestEntity(parts,
post.getParams());
post.setRequestEntity(entity);
int status = httpClient.executeMethod(post);
if (status == HttpStatus.SC_OK) {
String text = post.getResponseBodyAsString();
jsonObject = JSONObject.fromObject(text);
} else {
}
} catch (FileNotFoundException execption) {
} catch (HttpException execption) {
} catch (IOException execption) {
}
return jsonObject;
}
/**
* 图文信息推送
* @param list 图文信息列表
* @param wx 微信账号信息
*/
public String send(List<MicroWechatInfo> list,MicroWechatAccount wx){
StringBuilder sb=new StringBuilder();
sb.append("{\"articles\":[");
boolean t=false;
for(MicroWechatInfo info:list){
if(t)sb.append(",");
Pattern p = Pattern.compile("src\\s*=\\s*'(.*?)'",Pattern.CASE_INSENSITIVE);
String content = info.getMicrowechatcontent().replace("\"", "'");
Matcher m = p.matcher(content);
while (m.find()) {
String[] str = m.group().split("'");
if(str.length>1){
try {
if(!str[1].contains("//mmbiz.")){
content = content.replace(str[1], uploadImg(UrlToFile(str[1]),getAccessToken(wx.getAppid(), wx.getAppkey())).getString("url"));
}
} catch (Exception e) {
}
}
}
sb.append("{\"thumb_media_id\":\""+uploadMedia(new File(info.getMicrowechatcover()), getAccessToken(wx.getAppid(), wx.getAppkey()), "image").get("media_id")+"\"," +
"\"author\":\""+info.getMicrowechatauthor()+"\"," +
"\"title\":\""+info.getMicrowechattitle()+"\"," +
"\"content_source_url\":\""+info.getOriginallink()+"\"," +
"\"digest\":\""+info.getMicrowechatabstract()+"\"," +
"\"show_cover_pic\":\""+info.getShowcover()+"\"," +
"\"content\":\""+content+"\"}");
t=true;
}
sb.append("]}");
JSONObject tt = httpRequest("https://api.weixin.qq.com/cgi-bin/material/add_news?access_token="+getAccessToken(wx.getAppid(), wx.getAppkey()), "POST", sb.toString());
JSONObject jo = getUserOpenIDs(getAccessToken(wx.getAppid(), wx.getAppkey()));
String outputStr = "{\"touser\":"+jo.getJSONObject("data").getJSONArray("openid")+",\"msgtype\": \"mpnews\",\"mpnews\":{\"media_id\":\""+tt.getString("media_id")+"\"}}";
httpRequest("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token="+getAccessToken(wx.getAppid(), wx.getAppkey()), "POST", outputStr);
return tt.getString("media_id");
}
}
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java字符与字符串操作技巧总结》、《Java数组操作技巧总结》、《Java数学运算技巧总结》、《Java编码操作技巧总结》和《Java数据结构与算法教程》
希望本文所述对大家java程序设计有所帮助。
# Java
# 微信
# 接口
# 图文信息
# 推送
# 基于java使用钉钉机器人向钉钉群推送消息
# java实现钉钉机器人消息推送的示例代码
# Java利用jenkins做项目的自动化部署
# Input 特殊事件onpopertychange和oninput
# 详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送
# 上传
# 操作技巧
# 表单
# 相关内容
# 感兴趣
# 数据结构
# 给大家
# 时间为
# 管理器
# 四种
# 更多关于
# 所述
# 程序设计
# 中得
# 替换成
# 文档
# 单引号
# 双引号
# 二进制数
# 讲述了
相关文章:
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何用搬瓦工VPS快速搭建个人网站?
如何快速重置建站主机并恢复默认配置?
Python lxml的etree和ElementTree有什么区别
免费视频制作网站,更新又快又好的免费电影网站?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何用PHP快速搭建高效网站?分步指南
建站主机解析:虚拟主机配置与服务器选择指南
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
如何访问已购建站主机并解决登录问题?
公众号网站制作网页,微信公众号怎么制作?
网站制作的步骤包括,正确网址格式怎么写?
C#如何序列化对象为XML XmlSerializer用法
安云自助建站系统如何快速提升SEO排名?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何在搬瓦工VPS快速搭建网站?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
建站主机如何选?性能与价格怎样平衡?
如何选择高效可靠的多用户建站源码资源?
如何获取PHP WAP自助建站系统源码?
,石家庄四十八中学官网?
如何在Windows虚拟主机上快速搭建网站?
如何正确选择百度移动适配建站域名?
如何高效生成建站之星成品网站源码?
XML的“混合内容”是什么 怎么用DTD或XSD定义
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
建站之星ASP如何实现CMS高效搭建与安全管理?
css网站制作参考文献有哪些,易聊怎么注册?
建站之星价格显示格式升级,你的预算足够吗?
郑州企业网站制作公司,郑州招聘网站有哪些?
网站图片在线制作软件,怎么在图片上做链接?
如何在腾讯云免费申请建站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
再谈Python中的字符串与字符编码(推荐)
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
建设网站制作价格,怎样建立自己的公司网站?
定制建站流程步骤详解:一站式方案设计与开发指南
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
微课制作网站有哪些,微课网怎么进?
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何登录建站主机?访问步骤全解析
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
c++ stringstream用法详解_c++字符串与数字转换利器
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
实例解析angularjs的filter过滤器
完全自定义免费建站平台:主题模板在线生成一站式服务
*请认真填写需求信息,我们会在24小时内与您取得联系。