Java 微信公众号上传永久素材的方法

本文介绍如何使用Java实现向微信公众号上传不同类型的永久素材,包括图片、图文消息等,并提供了HTTPS请求的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


用 Java 实现微信公众号上传永久素材,代码如下:

	/**
	 * 上传其他永久素材(图片素材的上限为5000,其他类型为1000)
	 * @param appid
	 * @param secret
	 * @return
	 * @throws Exception
	 */
	public JSONObject addMaterialEver(String appid, String secret,File file,String type) throws Exception {
		try {
			PrintUtil.println("开始上传"+type+"永久素材---------------------");	
			
			//开始获取证书
			String accessToken=new AccessTokenBizImpl().getAccessToken(appid, secret);			
			if(!StringUtil.isEmptyString(accessToken)){
				PrintUtil.println("accessToken is null");	
				return null;
			}			
			
			//上传素材	
			String path="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token="+accessToken+"&type="+type;
			String result=HttpsUtil.connectHttpsByPost(path, null, file);
			result=result.replaceAll("[\\\\]", "");
			PrintUtil.println("result:"+result);	
			JSONObject resultJSON=JSONObject.fromObject(result);
			if(resultJSON!=null){
				if(resultJSON.get("media_id")!=null){
					PrintUtil.println("上传"+type+"永久素材成功");
					return resultJSON;
				}else{
					PrintUtil.println("上传"+type+"永久素材失败");
				}
			}
			
			return null;
		} catch (Exception e) {
			PrintUtil.println("程序异常", e);
			throw e;
		}finally{
			PrintUtil.println("结束上传"+type+"永久素材---------------------");	
		}
	}
	
	/**
	 * 上传图片到微信服务器(本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下)
	 * @param appid
	 * @param secret
	 * @param type
	 * @param file
	 * @return
	 * @throws Exception
	 */
	public JSONObject addMaterialEver(String appid, String secret,File file) throws Exception {
		try {
			PrintUtil.println("开始上传图文消息内的图片---------------------");	
			
			//开始获取证书
			String accessToken=new AccessTokenBizImpl().getAccessToken(appid, secret);			
			if(!StringUtil.isEmptyString(accessToken)){
				PrintUtil.println("accessToken is null");	
				return null;
			}			
			
			//上传图片素材	
			String path="https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token="+accessToken;
			String result=HttpsUtil.connectHttpsByPost(path, null, file);
			result=result.replaceAll("[\\\\]", "");
			PrintUtil.println("result:"+result);	
			JSONObject resultJSON=JSONObject.fromObject(result);
			if(resultJSON!=null){
				if(resultJSON.get("url")!=null){
					PrintUtil.println("上传图文消息内的图片成功");
					return resultJSON;
				}else{
					PrintUtil.println("上传图文消息内的图片失败");
				}
			}
			
			return null;
		} catch (Exception e) {
			PrintUtil.println("程序异常", e);
			throw e;
		}finally{
			PrintUtil.println("结束上传图文消息内的图片---------------------");	
		}
	}

具体的HTTPS请求:

    		String result =null;
			con.setDoInput(true);

			con.setDoOutput(true);

			con.setUseCaches(false); // post方式不能使用缓存

			// 设置请求头信息

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

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

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

			con.setRequestProperty("Content-Type",
					"multipart/form-data; boundary="

					+ BOUNDARY);

			// 请求正文信息

			// 第一部分:

			StringBuilder sb = new StringBuilder();

			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 out = new DataOutputStream(con.getOutputStream());

			// 输出表头

			out.write(head);

			// 文件正文部分

			// 把文件已流文件的方式 推入到url中

			DataInputStream in = new DataInputStream(new FileInputStream(file));

			int bytes = 0;

			byte[] bufferOut = new byte[1024];

			while ((bytes = in.read(bufferOut)) != -1) {

				out.write(bufferOut, 0, bytes);

			}

			in.close();

			// 结尾部分

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

			out.write(foot);

			out.flush();

			out.close();

			StringBuffer buffer = new StringBuffer();

			BufferedReader reader = null;

			try {

				// 定义BufferedReader输入流来读取URL的响应

				reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

				String line = null;

				while ((line = reader.readLine()) != null) {

					buffer.append(line);

				}

				if (result == null) {

					result = buffer.toString();

				}

			} catch (IOException e) {

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

				e.printStackTrace();

				throw new IOException("数据读取异常");

			} finally {

				if (reader != null) {

					reader.close();

				}

			}
			return result;



### 使用 Spring Boot 开发微信公众号教程 #### 1. 前置准备工作 为了能够顺利地集成微信公众号到Spring Boot应用程序中,需完成以下前置工作: - 注册微信公众平台账号并创建相应的公众号。 - 获取`appId`和`appSecret`这两个核心参数用于后续的身份验证与授权操作[^1]。 #### 2. 引入必要的依赖项 在项目的`pom.xml`文件内加入如下Maven依赖来支持微信功能模块的开发: ```xml <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp-spring-boot-starter</artifactId> <version>${wx.java.version}</version> </dependency> ``` 此部分配置使得开发者可以更便捷地调用微信开放平台所提供的API接口[^2]。 #### 3. 应用程序配置 (`application.yml`) 接下来,在`src/main/resources/application.yml`中添加关于微信公众号的相关设置信息: ```yaml wechat: mp: appId: wxxxxxxxxxxxxxxx # 替换成自己的AppID secret: xxxxxxxxxxxxxxxx # 替换成自己的AppSecret token: yourTokenHere aesKey: yourAesKeyIfNeed ``` 这些属性对于初始化SDK以及实现消息加密解密等功能至关重要。 #### 4. 编写 Java 类 ##### Properties 配置类 定义一个名为WeChatConfig.properties的Bean对象用来加载上述YAML中的配置值: ```java @ConfigurationProperties(prefix = "wechat.mp") public class WeChatMpProperties { private String appId; private String secret; private String token; private String aesKey; // Getters and Setters... } ``` ##### Service 实现类 通过继承自WxMpService并重载相应的方法来自定义业务逻辑处理流程。这里提供了一个简单的例子展示如何获取已发布图文素材列表: ```java @Service @Slf4j @RequiredArgsConstructor(onConstructor_ = {@Autowired}) public class WxMpServiceImpl implements InitializingBean { private final WxMpDefaultConfigImpl configStorage; private final WxMpMaterialService materialService; @Override public void afterPropertiesSet() throws Exception { this.configStorage.setAppid(appId); this.configStorage.setSecret(secret); this.materialService = new WxMpMaterialServiceImpl(); } /** * 查询永久素材总数及各类型数量. */ public Integer getMaterialCount(){ try{ return materialService.getMaterialCount(); }catch (Exception e){ log.error("查询失败",e); throw new RuntimeException(e.getMessage()); } } } ``` 以上代码片段展示了如何利用WxJava库提供的工具和服务来进行具体的交互操作。 #### 5. 创建菜单结构 可以通过编写专门的服务端点或命令行工具来动态构建导航栏目。下面是一个简单示例——创建名为InitMenu的类负责向服务器发送请求以建立基础菜单布局[^3]: ```java @RestController @RequestMapping("/menu") public class MenuController { @PostMapping("/init") public ResponseEntity<String> initMenu(@RequestBody Map<String, Object> body) { // 构建菜单数据体... boolean result = menuService.createMenu(menuData); if(result){ return ResponseEntity.ok().body("成功"); }else{ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值