JAVA调用微信接口(包含图文信息推送)

JAVA调用微信接口工具类,包含素材上传、获取素材列表、上传图文消息内的图片获取URL、图文信息推送,

微信图文信息推送因注意html代码字符串中将双引号(")替换成单引号('),不然信息页面中包含图片将无法显示且图片后面的内容也不会显示

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

你可能感兴趣的:(JAVA调用微信接口(包含图文信息推送))