【微信小程序】SpringBoot集成微信小程序(多小程序集成)

SpringBoot集成微信小程序

  • 前言
  • 一、前置工作
    • 1、获取appId和appSecret核心参数
  • 二、SpringBoot集成微信小程序
    • 1、引入pom依赖
    • 2、yml配置
    • 3、java代码文件
      • 3.1、Properties 配置类
      • 3.2 Configuration 服务类
    • 4、使用示例
      • 4.1、获取登录后的session信息:openId
      • 4.2、获取当前用户手机号
    • 5、更多接口使用请参考

前言

本文内容参考于“binarywang”,感谢大佬的开源源码参考:https://github.com/Wechat-Group/WxJavademo参考:https://github.com/binarywang/weixin-java-miniapp-demo

一、前置工作

1、获取appId和appSecret核心参数

在这里插入图片描述

二、SpringBoot集成微信小程序

1、引入pom依赖

        <!-- 小程序依赖 --><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>4.3.0</version></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-common</artifactId><version>4.3.0</version></dependency><!--<dependency>--><!--<groupId>commons-fileupload</groupId>--><!--<artifactId>commons-fileupload</artifactId>--><!--</dependency>--><!--emoji处理--><dependency><groupId>com.vdurmont</groupId><artifactId>emoji-java</artifactId><version>5.1.1</version></dependency>

2、yml配置


wx:miniapp:configs:- appid: wxa3760c4bd118deb3secret: e426f8e0b6c692c8e8410708ae114e9ctoken:  #微信小程序消息服务器配置的tokenaesKey:  #微信小程序消息服务器配置的EncodingAESKeymsgDataFormat: JSON

3、java代码文件

3.1、Properties 配置类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;import java.util.List;/*** @author tm* date 2023/5/15* @version 1.0*/
@Data
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties {private List<Config> configs;@Datapublic static class Config {/*** 设置微信小程序的appid*/private String appid;/*** 设置微信小程序的Secret*/private String secret;/*** 设置微信小程序消息服务器配置的token*/private String token;/*** 设置微信小程序消息服务器配置的EncodingAESKey*/private String aesKey;/*** 消息格式,XML或者JSON*/private String msgDataFormat;}}

3.2 Configuration 服务类

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.error.WxRuntimeException;
import org.jeecg.modules.fag.properties.WxMaProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @author tm* date 2023/5/15* @version 1.0*/
@Slf4j
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {private final WxMaProperties properties;private static final Map<String, WxMaMessageRouter> routers = Maps.newHashMap();private static Map<String, WxMaService> maServices;@Autowiredpublic WxMaConfiguration(WxMaProperties properties) {this.properties = properties;}@Beanpublic WxMaService defaultWxMaService() {return WxMaConfiguration.getMaService();}public static WxMaService getMaService() {String appId = null;for (String appIdKey : maServices.keySet()) {appId = appIdKey;}return getMaService(appId);}public static WxMaService getMaService(String appid) {WxMaService wxService = maServices.get(appid);if (wxService == null) {throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));}return wxService;}public static WxMaMessageRouter getRouter(String appid) {return routers.get(appid);}@PostConstructpublic void init() {List<WxMaProperties.Config> configs = this.properties.getConfigs();if (configs == null) {throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!");}maServices = configs.stream().map(a -> {WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
//                WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());// 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常config.setAppid(a.getAppid());config.setSecret(a.getSecret());config.setToken(a.getToken());config.setAesKey(a.getAesKey());config.setMsgDataFormat(a.getMsgDataFormat());WxMaService service = new WxMaServiceImpl();service.setWxMaConfig(config);routers.put(a.getAppid(), this.newRouter(service));return service;}).collect(Collectors.toMap(s -> s.getWxMaConfig().getAppid(), a -> a));}private WxMaMessageRouter newRouter(WxMaService service) {final WxMaMessageRouter router = new WxMaMessageRouter(service);router.rule().handler(logHandler).next().rule().async(false).content("订阅消息").handler(subscribeMsgHandler).end().rule().async(false).content("文本").handler(textHandler).end().rule().async(false).content("图片").handler(picHandler).end().rule().async(false).content("二维码").handler(qrcodeHandler).end();return router;}private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> {service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder().templateId("此处更换为自己的模板id").data(Lists.newArrayList(new WxMaSubscribeMessage.MsgData("keyword1", "339208499"))).toUser(wxMessage.getFromUser()).build());return null;};private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {log.info("收到消息:" + wxMessage.toString());service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson()).toUser(wxMessage.getFromUser()).build());return null;};private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> {service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息").toUser(wxMessage.getFromUser()).build());return null;};private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {try {WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", "png",ClassLoader.getSystemResourceAsStream("tmp.png"));service.getMsgService().sendKefuMsg(WxMaKefuMessage.newImageBuilder().mediaId(uploadResult.getMediaId()).toUser(wxMessage.getFromUser()).build());} catch (WxErrorException e) {e.printStackTrace();}return null;};private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {try {final File file = service.getQrcodeService().createQrcode("123", 430);WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);service.getMsgService().sendKefuMsg(WxMaKefuMessage.newImageBuilder().mediaId(uploadResult.getMediaId()).toUser(wxMessage.getFromUser()).build());} catch (WxErrorException e) {e.printStackTrace();}return null;};}

4、使用示例

4.1、获取登录后的session信息:openId


import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;import org.jeecg.modules.fag.configuration.WxMaConfiguration;
import org.springframework.stereotype.Service;/*** Author:     tm* Version:    1.0*/
@Slf4j
@Service
public class TestServiceImpl {public Result login(String code) {final WxMaService wxService = WxMaConfiguration.getMaService();try {WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(code);if (session == null) {return Result.error("获取小程序用户失败");}log.info(session.getSessionKey());log.info(session.getOpenid());} catch (Exception e) {log.error(e.getMessage(), e);return Result.error(e.getLocalizedMessage());}}}

4.2、获取当前用户手机号


import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.fag.configuration.WxMaConfiguration;
import org.springframework.stereotype.Service;
import javax.validation.constraints.NotEmpty;/*** Author:     tm* Version:    1.0*/
@Slf4j
@Service
public class TestServiceImpl {public Result userPhone(@NotEmpty(message = "code不能为空") String code) {final WxMaService wxService = WxMaConfiguration.getMaService();try {WxMaPhoneNumberInfo newPhoneNoInfo = wxService.getUserService().getNewPhoneNoInfo(code);if (newPhoneNoInfo == null) {return Result.error("获取手机号失败");}log.info("请求结果:{}", newPhoneNoInfo);String phoneNumber = newPhoneNoInfo.getPhoneNumber();return Result.ok("获取手机号成功", phoneNumber);} catch (Exception e) {log.error(e.getMessage(), e);return Result.error(e.getLocalizedMessage());}}}

5、更多接口使用请参考

cn.binarywang.wx.miniapp.api.WxMaService
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

举办知识竞赛是线上好还是线下好

举办知识竞赛线上和线下各有优势&#xff0c;选择哪种方式取决于具体的需求和条件。 线上举办知识竞赛的优缺点&#xff1a; 优点&#xff1a; 便捷性&#xff1a;线上竞赛不受地域限制&#xff0c;参与者可以在任何有网络的地方参与。 选手数&#xff1a;可以同时满足人数较…

密码管理最佳实践:安全存储与定期更换的艺术

在数字化时代&#xff0c;密码作为我们个人信息与资产安全的第一道防线&#xff0c;其重要性不言而喻。然而&#xff0c;随着网络威胁日益复杂多样&#xff0c;仅仅设置一个强密码已不足以保障安全。良好的密码管理实践&#xff0c;特别是安全存储与定期更换密码&#xff0c;成…

数据丢失?四款数据恢复免费版分享

作为一个办公室的文案策划人员&#xff0c;我深知数据的重要性。电脑里不仅有我辛辛苦苦撰写的文案&#xff0c;还有那些珍贵的创意灵感和客户资料。然而&#xff0c;就在上周&#xff0c;我因为一次不小心的误操作&#xff0c;把一个重要的文件夹给删除了。那一刻&#xff0c;…

MySql 忘记 Root 密码

停止 mysql 服务 linux 安装时&#xff0c;使用 $> mysqld_safe --usermysql & 启动&#xff0c;所以关闭时&#xff0c;直接 ps 查询进程&#xff0c;并关闭该进程即可 使用如下命令查询进程号&#xff0c;把 mysql 对应的进程都关闭即可 $> ps -ef | grep mysql …

基于web网上十字绣专营店设计与实现

&#xff08;一&#xff09;业务流程分析 没有实现网上销售的十字绣专营店&#xff0c;即店面销售方式&#xff0c;店面需要专人看管&#xff0c;而且销售范围有限&#xff0c;面向的对象很受限制&#xff0c;销售情况需要店主手工记录到账簿&#xff0c;以备利润汇总&#xf…

黄力医生谈健康:掌握这几个秘诀,帮你远离冠心病困扰!

随着生活水平的提高&#xff0c;人们的饮食结构和生活习惯发生了显著变化&#xff0c;这使得冠心病的患病率呈现出逐年上升的趋势&#xff0c;且发病年龄也越来越年轻化。面对这一严峻的健康挑战&#xff0c;提高对冠心病的认识&#xff0c;及早进行干预显得尤为重要。今天&…

HarmonyOS鸿蒙开发:在线短视频流畅切换最佳实践

简介 为了帮助开发者解决在应用中在线短视频快速切换时容易出现快速切换播放时延过长的问题&#xff0c;将提供对应场景的解决方案。 该解决方案使用&#xff1a; 视频播放框架AVPlayer和滑块视图容器Swiper进行短视频滑动轮播切换。绘制组件XComponent的Surface类型动态渲染…

Spring Boot项目中结合MyBatis详细使用

&#xff08;一&#xff09;、实现分布 1. Controller层 职责: 负责处理HTTP请求和响应&#xff0c;作为前端与后端服务交互的接口。 实现: 通过RestController或Controller注解定义控制器类&#xff0c;并使用如GetMapping, PostMapping等注解来映射HTTP请求。 2. Service层…

10 个最佳网络爬虫工具和软件,零基础入门到精通,收藏这一篇就够了

据 Strait Research 称&#xff0c;数据提取的需求正在不断增加&#xff0c;预计到 2031 年将达到 18 亿美元。 使用最好的网络爬行工具启动您的数据提取项目&#xff0c;并告别烦人的爬行头痛。我们研究和测试了数百种免费和付费软件&#xff0c;然后为您提出了十种最佳网络爬…

JVM 内存参数

文章目录 引言I JVM基础知识Java 语言是解释型的OpenJDK和Sun/Oracle JDK和hotspot的关系JDK、JRE、JVM 之间的关系JVM基础功能JVM组成JIT:Just In Time CompilerJVM内存区域JVM运行时数据区JVM 堆内存布局II JVM 内存参数常用参数JIT编译参数GC信息打印GC参数III 例子引言 J…

disk manager操作教程 如何使用Disk Manager组件 Mac如何打开ntfs格式文件

macOS系统有一个特别明显的弱点&#xff0c;即不能对NTFS格式磁盘写入数据。想要适合Mac系统使用来回转换磁盘格式又十分麻烦&#xff0c;这该怎么办呢&#xff1f;Tuxera ntfs for mac作为一款Mac完全读写软件&#xff0c;大家在安装该软件后&#xff0c;能充分使用它的磁盘管…

centos安装docker并配置加速器

docker安装与卸载&#xff1a; 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容&#xff0c;逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…

4.3 python 编辑单元格

4.3.1 clear_contents()函数和clear()函数–清楚单元格的内容和格式 表达式.clear_contents() Range对象的clear_contects()函数用于清除单元格的内容&#xff0c;但不会清除单元格的格式设置 表达式.clear() Range对象的clear()用于清楚单元格的内容和格式设置。 # 清除指…

Unity面试:使用Unity3d实现2d游戏有几种方式?

在Unity 3D中实现2D游戏&#xff0c;有多种方法和工具可供选择。以下是一些常见的实现方式及其特点&#xff0c;适合不同类型的2D游戏开发需求。 1. 使用Unity的2D工具和特性 Unity提供了专门用于2D游戏开发的一系列工具和功能&#xff0c;以下是主要的几个方面&#xff1a; …

C#面试题系列--动态更新

C#面试题系列 排版排了半天&#xff0c;也是不好看&#xff0c;那就不排版了&#xff0c;尽量由易到难 高级一些 什么是MVC模式C#中特性是什么&#xff1f;如何使用&#xff1f;C#中什么是反射?C#中的委托是什么 事件是不是一种委托C# 不安全代码C# 隐式类型 varC# linqC# 匿名…

监控域名到期发送钉钉消息通知

目的 想象一下&#xff0c;域名到期都不知道&#xff0c;忘了续费&#xff0c;就像忘了交房租&#xff0c;房东&#xff08;互联网&#xff09;会毫不留情地把你扫地出门&#xff01;所以&#xff0c;及时续费&#xff0c;让顾客轻松找到你&#xff0c;生意红红火火&#xff0…

【面试经验】美团基础研发部产品经理面试经验

3.12 投递 4.1 一面 4.11 二面 4.17 oc但拒 一面内容&#xff1a; 1、一个指数增长的脑经急转弯 2、对向量和向量值如何理解 ——类比函数&#xff0c;目的是映射和转化 3、transformer有没有看&#xff08;问到了注意力机制&#xff09; ——transformer的本质是一个编码…

智能合约漏洞(三)

前言 在前几篇文章中&#xff0c;我们探讨了智能合约中的逻辑漏洞和重放攻击。本篇将继续分析两种常见的漏洞类型&#xff1a;整数溢出/下溢和时间依赖漏洞。了解这些漏洞及其防范措施对于智能合约的安全开发至关重要。 5. 整数溢出/下溢&#xff08;Integer Overflow/Underfl…

python反序列化

前言&#xff1a;最近打比赛遇到了就简单记录学习一下 一、概念 什么是序列化&#xff1f; 序列化是将 Python 对象转换为一种可以存储或传输的格式的过程。常见的序列化格式包括 JSON、XML、protobuf 以及 Python 自带的 pickle 模块。 什么是反序列化&#xff1f; 反序列化…

vs2022 C++ 使用MySQL Connector/C++访问mysql数据库

1、下载MySQL Connector/C&#xff0c;我这里下载的是debug版本&#xff0c;下载链接MySQL :: Download MySQL Connector/C (Archived Versions) 2、解压并且放到MySQL文件夹中&#xff0c;便于使用 3、打开vs2022&#xff0c;右键项目&#xff0c;点击属性 4、在 “C/C” ->…