一直在用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了,用这个就可以给用户发送图片消息了。