一直在用java来做微信的二次开发,经过一段时间的沉淀总算有了一点门路。其实用java这种强大的语言来做微信的二次开发是很简单的事情。只要解决了加密、https请求的发送、xml的解析这些基本的操作后,用java来进行微信二次开发就变的容易了很多。
这里我主要上传一个用httpclient来实现多媒体素材上传的例子。当然也可以使用urlconnection来实现该功能。但是httpclient要简单的多也省心的多。废话不错,直接上代码了,代码注释很详细。
private static String up_temporary_url = "https://api.weixin.qq.com/cgi-bin/media/upload";
public static void httpsClient() throws Exception {
// 获得utf-8编码的mbuilder
MultipartEntityBuilder mBuilder = get_COMPATIBLE_Builder("UTF-8");
/**
* 原生的微信使用的url是https://api.weixin.qq.com/cgi-bin/media/upload?
* access_token=##ACCESS_TOKEN##&type=##TYPE##
* 一般都会使用这个把参数直接携带在url中。我个人不喜欢这样,因为既然使用了httpclient,完全可以把参数
* 设置在我们的body体中。所以我们使用的url是这样的
* https://api.weixin.qq.com/cgi-bin/media/upload 然后通过在body体中设置参数来设置
* access_token和type这两个字段
*
* */
// 设置type,我这里用一个缩略图来做实验,所以type是thumb
mBuilder.addTextBody("type", "thumb");
// 设置access_token,
mBuilder.addTextBody("access_token", getAccessToken());
// 这里就是我要上传到服务器的多媒体图片
mBuilder.addBinaryBody("media", getFile("d:/test.jpg"),
ContentType.APPLICATION_OCTET_STREAM, getFile("d:/test.jpg")
.getName());
// 建造我们的http多媒体对象
HttpEntity he = mBuilder.build();
// 建立一个sslcontext,这里我们信任任何的证书。
SSLContext context = getTrustAllSSLContext();
// 建立socket工厂
SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(
context);
// 建立连接器
CloseableHttpClient client = HttpClients.custom()
.setSSLSocketFactory(factory).build();
try {
// 得到一个post请求的实体
HttpPost post = getMultipartPost();
// 给请求添加参数
post.setEntity(he);
// 执行请求并获得结果
CloseableHttpResponse reponse = client.execute(post);
try {
// 获得返回的内容
HttpEntity entity = reponse.getEntity();
// 输出
System.out.println(EntityUtils.toString(entity));
// 消耗实体
EntityUtils.consume(entity);
} finally {
// 关闭返回的reponse
reponse.close();
}
} finally {
// 关闭client
client.close();
}
}
private static String getBoundaryStr(String str) {
return "------------" + str;
}
private static File getFile(String path) {
return new File(path);
}
private static MultipartEntityBuilder get_COMPATIBLE_Builder(String charSet) {
MultipartEntityBuilder result = MultipartEntityBuilder.create();
result.setBoundary(getBoundaryStr("7da2e536604c8"))
.setCharset(Charset.forName(charSet))
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
return result;
}
private static String getAccessToken() {
// 这里返回一个access_token,我在实际项目中是使用redis来缓存起来的。这里就直接返回了,要改成自己的哦
return "PFKLPAJ6HqxylpsKM7CWUoFoKeQlvLRRfArUmR9QEji2uWIEh9qsbGQ0eEih8gsnKrtjoCME_PgPV2ut_Wt3XTNmoJLDycpjtID0KItfVk";
}
private static String getUrl() {
return up_temporary_url;
}
private static HttpPost getMultipartPost() {
/* 这里设置一些post的头部信息,具体求百度吧 */
HttpPost post = new HttpPost(getUrl());
post.addHeader("Connection", "keep-alive");
post.addHeader("Accept", "*/*");
post.addHeader("Content-Type", "multipart/form-data;boundary="
+ getBoundaryStr("7da2e536604c8"));
post.addHeader("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
return post;
}
private static SSLContext getTrustAllSSLContext() throws Exception {
SSLContext context = SSLContexts.custom()
.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// 这一句就是信任任何的证书,当然你也可以去验证微信服务器的真实性
return true;
}
}).build();
return context;
}
这是最后返回的结果,主要就是那个thumb_media_id了,用这个就可以给用户发送图片消息了。