微信公众平台开发笔记4(关注回复自定义消息)

2023-11-13

基于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>
]

以上完成就能用测试号试验能不能正常收发消息了

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信公众平台开发笔记4(关注回复自定义消息) 的相关文章

  • 初学者如何快速练习盲打

    初学者如何快速练习盲打 2012 05 22 15 25 54 转载 标签 打字练习 初学者 手感 杂谈 分类 计算机技巧 盲打要求的是对键盘的熟练 是感觉上的东西 当你看到一句话想到的不应该是每个字有哪个拼音 有那个字母 而是像 手感 一
  • sonar扫描时报Failed to upload report - An error has occurred. Please contact your administrator

    本人新学习使用此软件 参考网络各大神资料后解决问题方法如下 此问题产生的原因在于mysql的max allowed packet 参数限制默认为4M 将设置进行修改就可以了 mysql根据配置文件会限制server接受的数据包大小 有时候大
  • 【应届生必看】技术岗面试应答有哪些话术和技巧?

    很多时候 面试过程中A与B两人工作经历 能力都相差不大时 A能脱颖而出的大部分原因是在面试过程中表现出的较高的情商 稳定性和与企业文化匹配的性格 价值观等 求职者从各项提问中了解面试官想要考察的主旨 根据自己实际情况适当地进行总结和梳理 以
  • Linux操作系统学习,Linux基础命令大全

    目录 第一章 Linux简介和安装 1 1 Linux简介和分类 1 2 安装VMware虚拟机 在虚拟机中安装CentOS 7 第二章 虚拟机中Linux的IP地址配置详解 2 1 什么是IP地址 如何查看 2 2 虚拟机NAT模式中Li

随机推荐

  • JCR分区与中科院分区详解-中科院基础版和升级版详解

    https baijiahao baidu com s id 1642002458698070188 wfr spider for pc JCR分区 科睿唯安每年出版JCR 期刊引用报告 JCR将收录的期刊分为176个不同学科类别 每个学科
  • ubuntu安装NERDTree,Taglist和WinManager

    在ubuntu中要用vim进行开发的话 这三个插件组合在一起 给你一种顺滑的感受 NERDTree NERDTree的安装 nerdtree可以显示当前项目的文件结构 安装方法如下 执行以下命令即可 1 创建文件夹 mkdir vim 如果
  • 线性代数的本质(五)——矩阵的运算

    文章目录 矩阵的运算 矩阵的转置 方阵的运算 初等矩阵 分块矩阵 逆矩阵 矩阵的秩 广义逆矩阵 矩阵的运算 矩阵的转置 转置 矩阵 A A A的行列互换得到的矩阵称为 A A A 的转置 transpose 记作
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】最佳植树距离

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 最佳植树距离 知识点二分查找 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 按照环保公司要求 小明需要在沙化严重的地区进行植树防沙工作 初步目标是种植一条直线的树带
  • git报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining

    今天和朋友聊天 推荐了个项目给我看看 在克隆的过程中发现太大拉不下来 报错如下 error RPC failed curl 18 transfer closed with outstanding read data remaining 远程
  • 黄金矿工(Java)

    先来一张效果图 图片资源 https pan baidu com s 1weCGFLQlzOTvDRY18bizrg pwd ivjt 提取码 ivjt 该项目一共12个类 均处于同一目录 首先是基类 其余用来表示物体的类都继承它 impo
  • Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录

    Tensorflow 1 13训练模型 pb文件转换成Tensorflowlite可以使用的 tflite文件过程记录 前言 之前一直通过1 13版本的TensorflowGpu训练模型 使用范围局限在电脑端 例如opencv调用模型等等
  • unity游戏开发-socket网络通信

    本篇主要是分享基于unity的客户端socket网络通信方案 关于服务器的c socekt搭建放在了这里 基于C 的Tcp服务端通信 其中关于socekt粘包断包的处理放在这里分享了 C socket粘包断包处理 目录 整体设计 TcpCl
  • Spring Security Oauth2 认证(获取token/刷新token)流程(password模式)

    1 本文介绍的认证流程范围 本文主要对从用户发起获取token的请求 oauth token 到请求结束返回token中间经过的几个关键点进行说明 2 认证会用到的相关请求 注 所有请求均为post请求 获取access token请求 o
  • BUUCTF WEB刷题记录

    第一题 刚打开的页面 看源码 发现source php 访问source php 我们要用file参数带出flag 但是有白名单限制 第一个和第二个判断是对file本身的值进行判断 第三个和第四个是对 前面的file值进行判断 所以我们可以
  • jeecg-boot字典翻译改造(支持实体类详情查询自动翻译)

    找到字典切面类 DictAspect 改造方法 parseDictText 支持自动生成的列表接口 单个实体类查询翻译 代码如下 private void parseDictText Object result if result inst
  • 2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)

    文章目录 接上篇 项目构建所需的相关工具 Java IDEA maven NodeJS Vue Visual Studio Code 后端项目创建详细步骤 1 开始创建新项目 2 输入项目名称 选择项目存储位置 项目管理工具 Maven 选
  • Hibernate lazy load.

    HIBERNATE的持久化对象加载策略 延迟加载 也就是用到的时候才去加载 这样可以提高一些性能 Hibernate的lazy loading 采用了一个HibernateSession来管理session 它的逻辑是每进行一次数据库操作
  • unpkg 与 npm 的基本介绍

    目录 定义 特点 原理 使用 npm安装流程 npm install npm update registry 区别 总结 定义 UNPKG是一个基于npm registry 的静态资源 CDN 服务 它可以快速获取和使用任何JavaScri
  • springmvc中操作json,配置FastJson

    目前网络上传递数据大部分都是json和xml 但是xml使用的很少了 这里主要介绍json 一般来说json常用的场景是提供外部接口 请求内使用request域就足够了 springmvc对于json的支持 上图 1 请求json方式分析
  • 搭建AI智能语音外呼系统

    随着人工智能技术的发展 近半年来涌现了大量基于人工智能的呼叫中心业务服务商和集成商 仅电销机器人这一个方向就至少有近百家公司正在推广运营 包括百度 讯飞 智齿 硅基 百应 箭鱼 容联等 商务上的需求非常强烈 整个市场都飞快地热闹起来 一套可
  • Redis优化秒杀系统

    Redis优化秒杀系统 使用背景 普通的基于mss框架的系统在并发量不是很高的情况下 对redis的需求不是很高 redis在系统中的角色相当于一个对象缓存器 在高并发的系统中 比如秒杀系统 在某一刻对数据库中的一条数据可能是成千上万的用户
  • 前端页面生成PDF方案之puppetter

    1 新建一个文件夹 例如 test 2 新建一个js文件 例如test js 3 进入test文件夹 在该目录下运行命令行 并执行下面命令 npm init 4 运行命令安装 npm i puppetter 5 编辑test js cons
  • 常量池、运行时常量池、字符串值基本概念区分

    常量池 Constant Pool 常量池数据编译期被确定 是Class文件中的一部分 存储了类 方法 接口等中的常量 当然也包括字符串常量 字符串池 字符串常量池 String Pool String Constant Pool 是常量池
  • 微信公众平台开发笔记4(关注回复自定义消息)

    基于WXJava开发 最终目的 实现关注回复自定义消息 一条文本 一条图片 点击菜单发送视频或音频 音乐可以发送但是不能正常播放 猜测是填写的地址有问题 音频上传时需要先在接口测试平台多媒体文件上传接口上传缩略图 jpeg 新建WxMess