使用httpclient4.3.2来实现微信临时素材的上传


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

转载于:https://www.cnblogs.com/qzmpc/p/6339542.html

你可能感兴趣的:(使用httpclient4.3.2来实现微信临时素材的上传)