SpringBoot开发微信公众号(四)

SpringBoot开发微信公众号(一) java开发微信公众号的环境搭建 前言:这段时间接触了下微信公众号的开发,回顾下学习的过程,做了学习的总结。微信公众号的开发有两种模式,第一种微信公众号提供的编辑模式,使用起来还是挺方便的。可以进行信息回复,自定义菜单等等。第二种提供了开发者模式。本学习系列采用的是java语言做后台服务器开发。当然也可以用其他语言实现,例如PHP等。本系列采用的是SpringBoot框架基础上开发,实现自定义菜 阅读详情

图片、语音消息回复

一、图片、语音消息回复xml结构

1.1 回复图片消息XML

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>

1.2 图片消息的bean

/**
 * 
 * 类名称: Image
 * 类描述: 图片
 * @author yuanjun
 * 创建时间:2017年12月8日下午6:42:39
 */
public class Image {
	private String MediaId;//素材id

	public String getMediaId() {
		return MediaId;
	}

	public void setMediaId(String mediaId) {
		MediaId = mediaId;
	}
	
}

import com.yuanjun.weixindemo.bean.BaseMessage;
import com.yuanjun.weixindemo.bean.Image;
/**
 * 
 * 类名称: ImageMessage
 * 类描述: 图片消息
 * @author yuanjun
 * 创建时间:2017年12月8日下午6:44:10
 */
public class ImageMessage extends BaseMessage{
	
	private Image Image;//Image节点

	public Image getImage() {
		return Image;
	}

	public void setImage(Image image) {
		Image = image;
	}
	
	
}
注明:如何根据回复信息的xml结构,构建实体类,看xml的节点特征,名字需要对应,并且注意大小写

1.3回复语音消息XML结构结构

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>

1.4 语音消息bean

/**
 * 
 * 类名称: Voice
 * 类描述:
 * @author yuanjun
 * 创建时间:2017年12月8日下午6:49:41
 */
public class Voice {
	
	private String MediaId;

	public String getMediaId() {
		return MediaId;
	}

	public void setMediaId(String mediaId) {
		MediaId = mediaId;
	}
	
	
}
/**
 * 
 * 类名称: VoiceMessage
 * 类描述: 语音消息
 * @author yuanjun
 * 创建时间:2017年12月8日下午6:48:36
 */
public class VoiceMessage extends BaseMessage{
	
	private Voice Voice;

	public Voice getVoice() {
		return Voice;
	}

	public void setVoice(Voice voice) {
		Voice = voice;
	}
	
	
}

二、 获取MediaId

通过素材管理中的接口上传多媒体文件,得到的id。图片,语音,视频都是类似的结构。可在开发文档的素材管理新增临时素材找到如何获取
MediaId,通过调用接口获取MediaId。具体可参考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726的文档说明。由于个人
订阅号没有接口权限,此时需要采用测试账号进行接口开发。在开发管理选择公众平台的测试账号,并开通。

2.1 获取的步骤参考文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726

注意:在获取access_token时,需将appid和秘钥换成测试账号的,可参考http://blog.youkuaiyun.com/shenbug/article/details/78752888
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;


import net.sf.json.JSONObject;
/**
 * 
 * 类名称: UploadUtil
 * 类描述: 文件上传工具类
 * @author yuanjun
 * 创建时间:2017年12月8日下午6:57:18
 */
public class UploadUtil {
	
	private static final String UPLOAD_URL ="https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
	/**
	 * 文件上传
	 * @param filePath
	 * @param accessToken
	 * @param type
	 * @return
	 * @throws IOException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchProviderException
	 * @throws KeyManagementException
	 */
	public static String upload(String filePath, String accessToken,String type) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException {
		File file = new File(filePath);
		if (!file.exists() || !file.isFile()) {
			throw new IOException("文件不存在");
		}

		String url = UPLOAD_URL.replace("ACCESS_TOKEN", accessToken).replace("TYPE",type);
		
		URL urlObj = new URL(url);
		//连接
		HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();

		con.setRequestMethod("POST"); 
		con.setDoInput(true);
		con.setDoOutput(true);
		con.setUseCaches(false); 

		//设置请求头信息
		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=\"file\";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;
		String result = 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) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				reader.close();
			}
		}

		JSONObject jsonObj = JSONObject.fromObject(result);
		String typeName = "media_id";
		if("thumb".equals(type)){
			typeName = type + "_media_id";
		}
		String mediaId = jsonObj.getString(typeName);
		return mediaId;
	}
}

2.2 测试


三、封装信息回复xml

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.Date;

import com.thoughtworks.xstream.XStream;
import com.yuanjun.weixindemo.bean.Image;
import com.yuanjun.weixindemo.bean.ImageMessage;
import com.yuanjun.weixindemo.util.BaseMessageUtil;
import com.yuanjun.weixindemo.util.UploadUtil;
import com.yuanjun.weixindemo.util.WeiXinUtil;

public class ImageMessageUtil implements BaseMessageUtil<ImageMessage> {
	/**
	 * 将信息转为xml格式
	 */
	public String messageToxml(ImageMessage imageMessage) {
		XStream xtream = new XStream();
		xtream.alias("xml", imageMessage.getClass());
		xtream.alias("Image", new Image().getClass());
		return xtream.toString();
	}
	/**
	 * 封装信息
	 */
	public String initMessage(String FromUserName, String ToUserName) {
		Image image = new Image();
		image.setMediaId(getmediaId());
		ImageMessage message = new ImageMessage();
		message.setFromUserName(ToUserName);
		message.setToUserName(FromUserName);
		message.setCreateTime(new Date().getTime());
		message.setImage(image);
		return messageToxml(message);
	}
	/**
	 * 获取Media
	 * @return
	 */
	public String getmediaId(){
		String path = "f:/1.jpg";
		String accessToken = WeiXinUtil.getAccess_Token();
		String mediaId = null;
		try {
			mediaId = UploadUtil.upload(path, accessToken, "image");
			
		} catch (KeyManagementException | NoSuchAlgorithmException
				| NoSuchProviderException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mediaId;
	}
}

四、控制器post请求,回复信息,实现回复图片,显示图片

@RequestMapping(value = "wxdemo",method=RequestMethod.POST)
	public void dopost(HttpServletRequest request,HttpServletResponse response){
		response.setCharacterEncoding("utf-8");
		PrintWriter out = null;
		//将微信请求xml转为map格式,获取所需的参数
		Map<String,String> map = MessageUtil.xmlToMap(request);
		String ToUserName = map.get("ToUserName");
		String FromUserName = map.get("FromUserName");
		String MsgType = map.get("MsgType");
		String Content = map.get("Content");
		
		String message = null;
		//处理文本类型,实现输入1,回复相应的封装的内容
		if("text".equals(MsgType)){
			if("图片".equals(Content)){
				ImageMessageUtil util = new ImageMessageUtil();
				message = util.initMessage(FromUserName, ToUserName);
			}else{
				TextMessageUtil textMessage = new TextMessageUtil();
				message = textMessage.initMessage(FromUserName, ToUserName,Content);
			}
		}
		try {
			out = response.getWriter();
			out.write(message);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		out.close();
	}

五、效果(只展示图片的效果,语言可参照图片的方法完成)

注意:需要在关测试的公众号,才能显示功能,否则在原来的公众号会出现该公众号提供的服务出现故障,请稍后再试。


效果展示




springboot开发微信公众号之消息回复 服务器端采用springBoot开发微信公众号功能,实现与用户的交互,返回用户输入的内容 立即下载

相关推荐

SpringBoot微信公众号开发

通过热门框架spring boot来学习微信公众号开发,帮助同学们快速入门微信公众号开发。

基于SpringBoot微信公众号的开发

注册开发者微信公众号; natapp内外网穿透技术; 如何科学的翻墙获取学习资料; 如何获取公众号唯一的token; 开发公众号遇到的诸多问题及解决方法; 使用测试公众号学习众多的接口调用;

东风麦芽糖 8626

微信公众号Java后台自定义分享SpringBoot版本

微信公众号开发 从前台到Java后台 调用微信JS接口分享朋友圈,分享代码Demo,SpringBoot版本,下载后请修改application.properties中的appid和appsecret。

【微信公众号】SpringBoot集成微信公众号

注册地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?注册流程参考:https://kf.qq.com/touch/faq/150804UVr222150804quq6B7.html?

Tm598035415的博客 1131

微信公众号开发所需jar+springboot+jpa

springboot+jpa +微信公众号开发 +扫码登录+扫码支付

sbm - spring Boot + mybatis ,spring boot 公众号开发,有接入聚合数据API

小demo spring boot +mybatis 开发微信公众号, jar包自己用maven 引入 API 接口 搞笑段子,新闻头条 ,部分没有写完以后再补充

SpringBoot对接公众号,自动消息回复

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。 接收文本消息 例如用户给公众号发送消息“欢迎开启公众号开发者模式”,在开发者后台收到的公众平台发送的消息xml如下 &lt;xml&gt; &lt;ToUserName&gt;&lt;![CDATA[公众号]]&gt;&lt;/ToUserName&gt; &lt;FromUserName...

daga_a的博客 4010

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3596

springboot 集成微信公众号详细教程

springboot,微信公众号,二维码,详细demo

Edward的博客 918

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 276

14.4kW大功率母线变换器设计:LLC+矩阵变压器+GaN实战解析

在数据中心供电架构中,隔离母线变换器将高压直流母线转换为48V低压母线,是大功率供电链路的核心环节。随着功率密度与效率要求不断攀升,传统移相全桥与普通LLC方案已难以满足300A级输出需求。基于LLC/CLLC谐振拓扑,结合矩阵变压器与GaN功率器件,成为新一代高性能母线变换器的主流技术路线。矩阵变压器将大功率磁性元件拆分为多个小单元,配合原边串联副边并联结构,有效降低绕组损耗并提升功率密度;GaN器件则通过高频软开关进一步压减开关损耗。本文以一台14.4kW样机为例,完整梳理从拓扑选型、谐振参数计算、同步

weixin_28273593的博客 343

【Vue】Vue实现微信运动步数对接与运动数据分析

首先需要在微信公众平台申请微信运动数据权限,具体申请流程可以参考微信官方文档:https://developers.weixin.qq.com/doc/offiaccount/WeChat_Web_Apps/Wechat_Data_Cube_Interface.html。获取到用户的微信运动数据后,可以对数据进行处理和分析。对获取到的微信运动数据进行处理,计算当日步数、步数排行榜、步数变化趋势等。按照前面的步骤获取用户微信运动数据。2.调用微信运动数据接口。1.获取用户微信运动数据。

Jacker 2016

AI大模型学习(14)AI 小白入门!用 OpenCV+Python 打造人体姿态识别系统,超详细教程来了

这篇教程介绍了如何使用Python+OpenCV+MediaPipe搭建入门级人体姿态识别系统。主要内容包括:人体姿态识别的应用场景(如健身APP、体感游戏)、开发环境搭建(安装Python、OpenCV和MediaPipe库)、核心代码实现(通过30行代码完成摄像头姿态检测),以及进阶功能开发(深蹲动作纠正算法和PPT体感控制器)。教程详细解析了MediaPipe的BlazePose模型架构和33个关键点的生理学意义,并提供了多线程优化等性能提升方案。该项目适合AI初学者实践,无需复杂算法即可实现实时人体

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1553

Springboot开发微信公众号(四)

1.1 数据结构分析 { "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" }, { "name":"菜单", "sub_button":[ ...

成小新的博客 899

H3C模拟器HCL防火墙路由模式主备配置实验

摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商

LQ的博客 1122

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6683

springboot框架开发微信公众号(四)之自定义菜单的使用

关于自定义菜单,微信为我们提供了几个接口分别是创建、查询和删除。我们平时使用最多的就是创建菜单了,往往我们执行了创建菜单的代码后,菜单并不会当即在我们关注过的公众号上显示出来,我们可以通过重新关注的方法,来查看我们创建或更改后的菜单。下面就来跟笔者来学一学这些接口的使用方法吧 一、由于这几个接口都是https协议,所以我们首先要能让我们的程序可以请求https。 对于https请求,我们需要一...

来日可期的博客 6000

STM32面试知识点总结分析

通过Boot引脚设定,寻找初始地址初始化栈指针 __initial_sp指向复位程序 Reset_Hander设置异常中断 HardFault_Handler设置系统时钟 SystemInit调用C库函数 _main。

嵌入式技术开发 2513

springboot-微信公众号开发(接入微信公众号)

JAVA微信公众号开发入门(详细) 有很多在学习公众号开发的小伙伴向我反映了,说在学习的过程中很矛盾,很多的公众号开发教程不够详细,亦或者是完全看不懂,况且官网给的文档也只是PHP的实例教程,而这时候学其他编程语言的学者们往往就容易陷入苦海。小编认为这肯是初次接触新技术的迷茫,因为不知道从哪里下手就盲目的寻找各式各样的教程,不仅没学到,反倒乱了套,又或是一知半解。在这里小编将带带领大家一步一步的学...

qq_41486247的博客 1964

【异常】Hermes Agent调用z.ai接口失败(余额不足)API call failed (attempt 1/3): RateLimitError [HTTP 429]

补充说明:同步尝试解析接口对应网页时,出现“网页解析失败,可能是不支持的网页类型,请检查网页或稍后重试”提示,该提示不影响核心报错排查,仅作为辅助信息。

奶爸的编程之路,也就一周冷个三天 1196

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

微信公众号的开发 springBoot

1、微信公众号的申请         具体申请流程此处略过,百度一下有人教你怎样一步一步申请的。        不过,个人账号什么的限制太多,而其他又要求营业执照等,太麻烦,所以如果是小白只是想学一下的话,可以申请一个测试号,具体申请方法见:https://jingyan.baidu.com/article/e2284b2b95f423e2e6118de3.html 2、springBoot...

hj12312的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Springboot开发微信公众号

最近项目上需要开发一个微信公众号的接口,用于展示、查询用户相关信息,看了一下公众号的接口文档,然后查询了一些资料,大概整理了一下。 一、测试公众号 微信公众平台提供了测试公众账号,登录地址为:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,使用手机登录微信进行扫码,进入配置页面: 说明: URL:填写80或者443端口的...

yuanwxcsdn的博客 1560

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SpringBoot开发微信公众号(七)

系列总结 微信公众号的开发总体来说,还是比较简单。可以参考官网的api文档进行开发帮助。个人订阅号的权限少,大部分的接口未对外开放。还好提供了开发测试号,对于对开发微信公众号的人来说,还是挺不错的,开发了大部分的权限。SpringBoot开发微信公众号系列是开发的入门帮助,了解如何进行开发。适合对微信感兴趣的人学习。总结一下这几天的学习: 一、理解开发套路,面向对象编程 微信提供的api的文

shenbug的博客 6942

正式开始使用springboot进行微信公众号开发

对公众号还没有一定的了解的,请先阅读此博客https://blog.youkuaiyun.com/weixin_42375707/article/details/113251409?spm=1001.2014.3001.5502 之后再来阅读此博客 此博客将手把手教你从0开始用springboot进行微信公众号的开发。当然了,这里只是介绍初步的使用以及学习方法,详细使用或者更深层次的使用,则详细阅读微信公众号官方文档,官方文档就是最好的教材!! 官方文档:https://developers......

weixin_42375707的博客 1147

【一篇就够了】springboot微信公众号开发,你的坑我来踩

前些日子在抖音上看到一个写给女朋友的微信公众号突然心血来潮自己也想写一个,随后就开始在下面的踩坑填坑的阶段了,因为也是第一次写微信公众号再次也是记录一下自己的开发过程。如果你也是刚刚接触的公众号的我认为我们可以慢慢聊聊,再者我是一个喜欢化繁为简的人,不喜欢将问题搞的很复杂,所以我会尽可能的将问题描述的简单、清楚。......

三万少女的梦中刺客的博客 1150
上一篇: Springboot开发微信公众号(三)
下一篇: SpringBoot开发微信公众号(五)
shenbug
博客等级 码龄10年 410粉丝 18原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值