java微信获取临时素材_Java企业微信开发_08_素材管理之下载微信临时素材到本地服务器...

该博客详细介绍了如何使用Java实现从微信获取并下载临时素材到本地服务器的完整过程,包括设置SSLContext、发起HTTPS请求、处理响应以及文件保存等关键步骤。
摘要由CSDN通过智能技术生成

packagecom.ray.util;importjava.io.BufferedReader;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.UnsupportedEncodingException;importjava.net.ConnectException;importjava.net.HttpURLConnection;importjava.net.URL;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.Formatter;importjava.util.HashMap;importjava.util.Map;importjava.util.UUID;importjavax.net.ssl.HttpsURLConnection;importjavax.net.ssl.SSLContext;importjavax.net.ssl.SSLSocketFactory;importjavax.net.ssl.TrustManager;importjavax.servlet.http.HttpServletRequest;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importcom.ray.pojo.AccessToken;importnet.sf.json.JSONException;importnet.sf.json.JSONObject;public classWeiXinUtil {private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class);//微信的请求url//获取access_token的接口地址(GET) 限200(次/天)

public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";//获取jsapi_ticket的接口地址(GET) 限200(次/天)

public final static String jsapi_ticket_url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESSTOKEN";/*** 1.发起https请求并获取结果

*

*@paramrequestUrl 请求地址

*@paramrequestMethod 请求方式(GET、POST)

*@paramoutputStr 提交的数据

*@returnJSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/

public staticJSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {

JSONObject jsonObject= null;

StringBuffer buffer= newStringBuffer();try{//创建SSLContext对象,并使用我们指定的信任管理器初始化

TrustManager[] tm = { newMyX509TrustManager() };

SSLContext sslContext= SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, newjava.security.SecureRandom());//从上述SSLContext对象中得到SSLSocketFactory对象

SSLSocketFactory ssf =sslContext.getSocketFactory();

URL url= newURL(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= newBufferedReader(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) {

log.error("Weixin server connection timed out.");

}catch(Exception e) {

log.error("https request error:{}", e);

}returnjsonObject;

}/*** 2.发送https请求之获取临时素材

*@paramrequestUrl

*@paramsavePath 文件的保存路径,此时还缺一个扩展名

*@return*@throwsException*/

public static File getFile(String requestUrl,String savePath) throwsException {//String path=System.getProperty("user.dir")+"/img//1.png";//创建SSLContext对象,并使用我们指定的信任管理器初始化

TrustManager[] tm = { newMyX509TrustManager() };

SSLContext sslContext= SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, newjava.security.SecureRandom());//从上述SSLContext对象中得到SSLSocketFactory对象

SSLSocketFactory ssf =sslContext.getSocketFactory();

URL url= newURL(requestUrl);

HttpsURLConnection httpUrlConn=(HttpsURLConnection) url.openConnection();

httpUrlConn.setSSLSocketFactory(ssf);

httpUrlConn.setDoOutput(true);

httpUrlConn.setDoInput(true);

httpUrlConn.setUseCaches(false);//设置请求方式(GET/POST)

httpUrlConn.setRequestMethod("GET");

httpUrlConn.connect();//获取文件扩展名

String ext=getExt(httpUrlConn.getContentType());

savePath=savePath+ext;

System.out.println("savePath"+savePath);//下载文件到f文件

File file = newFile(savePath);//获取微信返回的输入流

InputStream in =httpUrlConn.getInputStream();//输出流,将微信返回的输入流内容写到文件中

FileOutputStream out = newFileOutputStream(file);int length=100*1024;byte[] byteBuffer = new byte[length]; //存储文件内容

int byteread =0;int bytesum=0;while (( byteread=in.read(byteBuffer)) != -1) {

bytesum+= byteread; //字节数 文件大小

out.write(byteBuffer,0,byteread);

}

System.out.println("bytesum: "+bytesum);

in.close();//释放资源

out.close();

in= null;

out=null;

httpUrlConn.disconnect();returnfile;

}/*** @desc :2.微信上传素材的请求方法

*

*@paramrequestUrl 微信上传临时素材的接口url

*@paramfile 要上传的文件

*@returnString 上传成功后,微信服务器返回的消息*/

public staticString httpRequest(String requestUrl, File file) {

StringBuffer buffer= newStringBuffer();try{//1.建立连接

URL url = newURL(requestUrl);

HttpURLConnection httpUrlConn= (HttpURLConnection) url.openConnection(); //打开链接//1.1输入输出设置

httpUrlConn.setDoInput(true);

httpUrlConn.setDoOutput(true);

httpUrlConn.setUseCaches(false); //post方式不能使用缓存//1.2设置请求头信息

httpUrlConn.setRequestProperty("Connection", "Keep-Alive");

httpUrlConn.setRequestProperty("Charset", "UTF-8");//1.3设置边界

String BOUNDARY = "----------" +System.currentTimeMillis();

httpUrlConn.setRequestProperty("Content-Type","multipart/form-data; boundary="+BOUNDARY);//请求正文信息//第一部分://2.将文件头输出到微信服务器

StringBuilder sb = newStringBuilder();

sb.append("--"); //必须多两道线

sb.append(BOUNDARY);

sb.append("\r\n");

sb.append("Content-Disposition: form-data;name=\"media\";filelength=\"" +file.length()+ "\";filename=\""+ file.getName() + "\"\r\n");

sb.append("Content-Type:application/octet-stream\r\n\r\n");byte[] head = sb.toString().getBytes("utf-8");//获得输出流

OutputStream outputStream = newDataOutputStream(httpUrlConn.getOutputStream());//将表头写入输出流中:输出表头

outputStream.write(head);//3.将文件正文部分输出到微信服务器//把文件以流文件的方式 写入到微信服务器中

DataInputStream in = new DataInputStream(newFileInputStream(file));int bytes = 0;byte[] bufferOut = new byte[1024];while ((bytes = in.read(bufferOut)) != -1) {

outputStream.write(bufferOut,0, bytes);

}

in.close();//4.将结尾部分输出到微信服务器

byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");//定义最后数据分隔线

outputStream.write(foot);

outputStream.flush();

outputStream.close();//5.将微信服务器返回的输入流转换成字符串

InputStream inputStream =httpUrlConn.getInputStream();

InputStreamReader inputStreamReader= new InputStreamReader(inputStream, "utf-8");

BufferedReader bufferedReader= newBufferedReader(inputStreamReader);

String str= null;while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

bufferedReader.close();

inputStreamReader.close();//释放资源

inputStream.close();

inputStream= null;

httpUrlConn.disconnect();

}catch(IOException e) {

System.out.println("发送POST请求出现异常!" +e);

e.printStackTrace();

}returnbuffer.toString();

}/*** 2.发起http请求获取返回结果

*

*@paramrequestUrl 请求地址

*@return

*/

public staticString httpRequest(String requestUrl) {

StringBuffer buffer= newStringBuffer();try{

URL url= newURL(requestUrl);

HttpURLConnection httpUrlConn=(HttpURLConnection) url.openConnection();

httpUrlConn.setDoOutput(false);

httpUrlConn.setDoInput(true);

httpUrlConn.setUseCaches(false);

httpUrlConn.setRequestMethod("GET");

httpUrlConn.connect();//将返回的输入流转换成字符串

InputStream inputStream =httpUrlConn.getInputStream();//InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

InputStreamReader inputStreamReader = newInputStreamReader(inputStream);

BufferedReader bufferedReader= newBufferedReader(inputStreamReader);

String str= null;while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

bufferedReader.close();

inputStreamReader.close();//释放资源

inputStream.close();

inputStream= null;

httpUrlConn.disconnect();

}catch(Exception e) {

}returnbuffer.toString();

}/*** 3.获取access_token

*

*@paramappid 凭证

*@paramappsecret 密钥

*@return

*/

public staticAccessToken getAccessToken(String appid, String appsecret) {

AccessToken accessToken= null;

String requestUrl= access_token_url.replace("{corpId}", appid).replace("{corpsecret}", appsecret);

JSONObject jsonObject= httpRequest(requestUrl, "GET", null);//如果请求成功

if (null !=jsonObject) {try{

accessToken= newAccessToken();

accessToken.setToken(jsonObject.getString("access_token"));

accessToken.setExpiresIn(jsonObject.getInt("expires_in"));

}catch(JSONException e) {

accessToken= null;//获取token失败

log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));

}

}returnaccessToken;

}/*** 4. 获取JsapiTicket

*@paramaccessToken

*@return

*/

public staticString getJsapiTicket(String accessToken){

String requestUrl= jsapi_ticket_url.replace("ACCESSTOKEN", accessToken);

JSONObject jsonObject= httpRequest(requestUrl, "GET", null);

String jsapi_ticket="";//如果请求成功

if (null !=jsonObject) {try{

jsapi_ticket=jsonObject.getString("ticket");

}catch(JSONException e) {//获取token失败

log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));

}

}returnjsapi_ticket;

}/*** 3.获取企业微信的JSSDK配置信息

*@paramrequest

*@return

*/

public static MapgetWxConfig(HttpServletRequest request) {

Map ret = new HashMap();//1.准备好参与签名的字段

String nonceStr= UUID.randomUUID().toString(); //必填,生成签名的随机串//System.out.println("nonceStr:"+nonceStr);

String accessToken=WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();

String jsapi_ticket=getJsapiTicket(accessToken);//必填,生成签名的H5应用调用企业微信JS接口的临时票据//System.out.println("jsapi_ticket:"+jsapi_ticket);

String timestamp = Long.toString(System.currentTimeMillis() / 1000); //必填,生成签名的时间戳//System.out.println("timestamp:"+timestamp);

String url=request.getRequestURL().toString();//System.out.println("url:"+url);//2.字典序 ,注意这里参数名必须全部小写,且必须有序

String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr+ "&timestamp=" + timestamp + "&url=" +url;//3.sha1签名

String signature = "";try{

MessageDigest crypt= MessageDigest.getInstance("SHA-1");

crypt.reset();

crypt.update(sign.getBytes("UTF-8"));

signature=byteToHex(crypt.digest());//System.out.println("signature:"+signature);

} catch(NoSuchAlgorithmException e) {

e.printStackTrace();

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

ret.put("appId", WeiXinParamesUtil.corpId);

ret.put("timestamp", timestamp);

ret.put("nonceStr", nonceStr);

ret.put("signature", signature);returnret;

}/*** 方法名:byteToHex

* 详述:字符串加密辅助方法

* 开发人员:souvc

* 创建时间:2016-1-5

*@paramhash

*@return说明返回值含义

*@throws说明发生此异常的条件*/

private static String byteToHex(final byte[] hash) {

Formatter formatter= newFormatter();for (byteb : hash) {

formatter.format("%02x", b);

}

String result=formatter.toString();

formatter.close();returnresult;

}private staticString getExt(String contentType){if("image/jpeg".equals(contentType)){return ".jpg";

}else if("image/png".equals(contentType)){return ".png";

}else if("image/gif".equals(contentType)){return ".gif";

}return null;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值