- 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 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");
- }
- }