基于WXJava开发,最终目的:实现关注回复自定义消息(一条文本、一条图片),点击菜单发送视频或音频。音乐可以发送但是不能正常播放,猜测是填写的地址有问题。音频上传时需要先在接口测试平台多媒体文件上传接口上传缩略图(jpeg)
新建WxMessageService类
@Service
@Slf4j
public class WxMessageService {
@Autowired
private WxMpService wxService;
@Autowired
private WxMpQrcodeService qrcodeService;
@Autowired
private WxMpMaterialService materialService;
@Autowired
private WxMpKefuService wxMpKefuService;
public String messageHandler(WxMpXmlMessage inMessage) throws WxErrorException {
String out = null;
String msgType = inMessage.getMsgType();
log.info("[AN MESSAGE TYPE] - {} ", msgType);
switch (msgType) {
case "text":
if (inMessage.getContent().startsWith("二维码-")){
try {
String name = inMessage.getContent().substring(4);
WxMpQrCodeTicket ticket = qrcodeService.qrCodeCreateTmpTicket(name, 2592000);
File qrPic = qrcodeService.qrCodePicture(ticket);
out = generateImgOutMessage(inMessage, qrPic);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
else if(inMessage.getContent().contains("你好")){
out = generateTextOutMessage(inMessage, inMessage.getContent());
}else if(inMessage.getContent().contains("客服")){
out = generateTextOutMessage(inMessage, "如您需要帮助请联系客服,联系电话:12345678910");
}else if(inMessage.getContent().contains("视频")){
File in = new File("D:\\1111_Trim.mp4");
out = generateVideoOutMessage(inMessage, in);
}else if(inMessage.getContent().contains("音乐")){
File in = new File("D:\\11111.jpeg");
out = generateMusicOutMessage(inMessage, in);
}
else {
out = generateTextOutMessage(inMessage, "这是文本消息");
}
break;
case "event":
String event = inMessage.getEvent();
String key = inMessage.getEventKey();
log.info("[AN EVENT MESSAGE] - {}", event);
if (event.equals("subscribe")) {
WxMpKefuMessage message = new WxMpKefuMessage();
message.setContent("感谢您的关注!");
message.setMsgType("text");
message.setToUser(inMessage.getFromUser());
wxMpKefuService.sendKefuMessage(message);
WxMpQrCodeTicket ticket = qrcodeService.qrCodeCreateTmpTicket("猪八戒吃西瓜", 2592000);
File qrPic = qrcodeService.qrCodePicture(ticket);
out = generateImgOutMessage(inMessage, qrPic);
} else if (event.equals("SCAN")) {
log.info("{} - 你好", inMessage.getEventKey());
out = generateTextOutMessage(inMessage, inMessage.getEventKey());
} else if (event.equals("CLICK")) {
if(key.equals("video")){
log.info("{} - Music", inMessage.getEventKey());
File in = new File("D:\\1111_Trim.mp4");
out = generateVideoOutMessage(inMessage, in);
}else if(key.equals("music")){
log.info("{} - 每日推荐", inMessage.getEventKey());
File in = new File("D:\\11111.jpeg");
out = generateMusicOutMessage(inMessage, in);
//out = generateTextOutMessage(inMessage, "<大力水手>");
}
}
break;
case "image":
out = generateTextOutMessage(inMessage, "这是图片消息");
break;
case "voice":
out = generateTextOutMessage(inMessage, "这是语音消息");
break;
case "video":
out = generateTextOutMessage(inMessage, "这是视频消息");
break;
case "shortvideo":
out = generateTextOutMessage(inMessage, "这是短视频消息");
break;
case "location":
out = generateTextOutMessage(inMessage, "这是地理位置消息");
break;
case "link":
out = generateTextOutMessage(inMessage, "这是链接消息");
break;
default:
out = "success";
}
return out;
}
private String generateTextOutMessage(WxMpXmlMessage inMessage, String content) {
WxMpXmlOutTextMessage textMessage = WxMpXmlOutTextMessage.TEXT()
.toUser(inMessage.getFromUser())
.fromUser(inMessage.getToUser())
.content(content)
.build();
return textMessage.toXml();
}
private String generateImgOutMessage(WxMpXmlMessage inMessage, File img) {
WxMediaUploadResult result = null;
try {
result = materialService.mediaUpload("image", img);
} catch (WxErrorException e) {
e.printStackTrace();
}
WxMpXmlOutImageMessage outImageMessage = WxMpXmlOutImageMessage.IMAGE()
.toUser(inMessage.getFromUser())
.fromUser(inMessage.getToUser())
.mediaId(result.getMediaId())
.build();
return outImageMessage.toXml();
}
/**
* @Description: TODO 点击菜单回复视频消息
* @author: chenhf
* @date: 2023/7/5 11:29
* @param: [inMessage, video]
* @return: java.lang.String
**/
private String generateVideoOutMessage(WxMpXmlMessage inMessage, File video) {
WxMediaUploadResult result = null;
try {
result = materialService.mediaUpload(WxConsts.MediaFileType.VIDEO, video);
} catch (WxErrorException e) {
e.printStackTrace();
}
assert result != null;
WxMpXmlOutVideoMessage outVideoMessage = WxMpXmlOutVideoMessage.VIDEO()
.toUser(inMessage.getFromUser())
.fromUser(inMessage.getToUser())
.title("洛水之神--片头")
.description("视频消息")
.mediaId(result.getMediaId())
.build();
return outVideoMessage.toXml();
}
/**
* @Description: TODO 点击回复音乐
* @author: chenhf
* @date: 2023/7/5 10:13
* @param: [inMessage, music]
* @return: java.lang.String
**/
private String generateMusicOutMessage(WxMpXmlMessage inMessage, File music) {
WxMediaUploadResult result = null;
try {
result = materialService.mediaUpload(WxConsts.MediaFileType.THUMB, music);
} catch (WxErrorException e) {
e.printStackTrace();
}
assert result != null;
String classes_path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
File classes = new File(classes_path);
// web-inf目录
File webInf = classes.getParentFile();
// 项目目录
File packageName = webInf.getParentFile();
// tomcat webapps 目录
String webapps = packageName.getParent();
// tomcat 下的文件路径
File tomcatPath = new File(webapps+File.separator+"纯吉他曲子---和煦的风.mp3");
String path =tomcatPath.getPath();
//String path = classes_path+File.separator+"纯吉他曲子---和煦的风.mp3";
WxMpXmlOutMusicMessage outMusicMessage = WxMpXmlOutMusicMessage.MUSIC()
.toUser(inMessage.getFromUser())
.fromUser(inMessage.getToUser())
.title("纯吉他曲子---和煦的风")
.description("音乐消息")
.musicUrl(path)
.hqMusicUrl(path)
.thumbMediaId(result.getThumbMediaId())
.build();
return outMusicMessage.toXml();
}
}
修改WxPortalController
需要注意的是:
接收微信请求
接收微信请求:[openid=[oEAz66Rby2HT7OSsHk8m9bZemSoc], [signature=[316236c773c7309cbf8523e18a15a4e410f4fa93], encType=[null], msgSignature=[null], timestamp=[1689233969], nonce=[1223137028], requestBody=[
<xml><ToUserName><![CDATA[gh_c4d62187395d]]></ToUserName>
<FromUserName><![CDATA[oEAz66Rby2HT7OSsHk8m9bZemSoc]]></FromUserName>
<CreateTime>1689233969</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[music]]></EventKey>
</xml>
]
以上完成就能用测试号试验能不能正常收发消息了