SpringBoot整合微信小程序开发工具

news/2024/7/20 4:13:02 标签: 小程序, java, spring

一、介绍

  • 通常进行微信开发时,不建议直接使用restful的方式调用微信官方提供的开发文档。一方面在于微信官方文档杂乱,影响开发效率;另一方面开源社区提供了众多微信开发的工具的封装。

  • 本文将为快速开发微信小程序后端提供解决方案,并集成推荐使用的微信小程序开发工具包,参考:

    https://github.com/Wechat-Group/weixin-java-tools

  • 附:微信小程序开发文档:

    https://mp.weixin.qq.com/debug/wxadoc/dev/api/

二、框架集成

  • 引入pom

      <!-- 微信小程序开发工具包 -->
     <dependency>
     	<groupId>com.github.binarywang</groupId>
     	<artifactId>weixin-java-miniapp</artifactId>
     	<version>2.9.6.BETA</version>
     </dependency>
    
  • application.properties配置项中添加如下配置

     ###################微信小程序配置信息####################
     wechat.miniapp.appid=小程序的appid
     wechat.miniapp.secret=小程序的secret
     wechat.miniapp.token=
     wechat.miniapp.aesKey=
    
  • 注入配置项信息

         import org.apache.commons.lang3.builder.ToStringBuilder;
     import org.apache.commons.lang3.builder.ToStringStyle;
     import org.springframework.boot.context.properties.ConfigurationProperties;
     
     /**
      * @author xiaojin_wu
      */
     @ConfigurationProperties(prefix = "wechat.miniapp")
     public class WxMaProperties {
         /**
          * 设置微信小程序的appid
          */
         private String appid;
     
         /**
          * 设置微信小程序的Secret
          */
         private String secret;
     
         /**
          * 设置微信小程序的token
          */
         private String token;
     
         /**
          * 设置微信小程序的EncodingAESKey
          */
         private String aesKey;
     
         /**
          * 消息格式,XML或者JSON
          */
         private String msgDataFormat;
     
         public String getAppid() {
             return this.appid;
         }
     
         public void setAppid(String appid) {
             this.appid = appid;
         }
     
         public String getSecret() {
             return this.secret;
         }
     
         public void setSecret(String secret) {
             this.secret = secret;
         }
     
         public String getToken() {
             return this.token;
         }
     
         public void setToken(String token) {
             this.token = token;
         }
     
         public String getAesKey() {
             return this.aesKey;
         }
     
         public void setAesKey(String aesKey) {
             this.aesKey = aesKey;
         }
     
         public String getMsgDataFormat() {
             return msgDataFormat;
         }
     
         public void setMsgDataFormat(String msgDataFormat) {
             this.msgDataFormat = msgDataFormat;
         }
     
         @Override
         public String toString() {
             return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
         }
     }
    
  • 如果需要使用模板功能,通过以下配置注入

         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.WxMaTemplateMessage;
     import cn.binarywang.wx.miniapp.config.WxMaConfig;
     import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
     import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
     import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
     import com.google.common.collect.Lists;
     import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
     import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
     import org.springframework.boot.context.properties.EnableConfigurationProperties;
     import org.springframework.context.annotation.Bean;
     import org.springframework.context.annotation.Configuration;
     
     import java.io.File;
     
     /**
      * @author xiaojin_wu
      */
     @Configuration
     @ConditionalOnClass(WxMaService.class)
     @EnableConfigurationProperties(WxMaProperties.class)
     public class WxMaConfiguration {
         private static final WxMaMessageHandler templateMsgHandler = (wxMessage, context, service, sessionManager) ->
                 service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()
                         .templateId("此处更换为自己的模板id")
                         .formId("自己替换可用的formid")
                         .data(Lists.newArrayList(
                                 new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177")))
                         .toUser(wxMessage.getFromUser())
                         .build());
     
         private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
             System.out.println("收到消息:" + wxMessage.toString());
             service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
                     .toUser(wxMessage.getFromUser()).build());
         };
     
         private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) ->
                 service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
                         .toUser(wxMessage.getFromUser()).build());
     
         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();
             }
         };
     
         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();
             }
         };
         @Autowired
         private WxMaProperties properties;
     
         @Bean
         @ConditionalOnMissingBean
         public WxMaConfig config() {
             WxMaInMemoryConfig config = new WxMaInMemoryConfig();
             config.setAppid(this.properties.getAppid());
             config.setSecret(this.properties.getSecret());
             config.setToken(this.properties.getToken());
             config.setAesKey(this.properties.getAesKey());
             config.setMsgDataFormat(this.properties.getMsgDataFormat());
     
             return config;
         }
     
         @Bean
         @ConditionalOnMissingBean
         public WxMaService wxMaService(WxMaConfig config) {
             WxMaService service = new WxMaServiceImpl();
             service.setWxMaConfig(config);
             return service;
         }
     
         @Bean
         public WxMaMessageRouter router(WxMaService service) {
             final WxMaMessageRouter router = new WxMaMessageRouter(service);
             router
                     .rule().handler(logHandler).next()
                     .rule().async(false).content("模板").handler(templateMsgHandler).end()
                     .rule().async(false).content("文本").handler(textHandler).end()
                     .rule().async(false).content("图片").handler(picHandler).end()
                     .rule().async(false).content("二维码").handler(qrcodeHandler).end();
             return router;
         }
     
     }
    

三、如何使用

  • 在业务层(Controller)调用时,只需要通过自动装配即可;

     import cn.binarywang.wx.miniapp.api.WxMaService;
    
     /** 小程序工具服务 */
     @Autowired
     private WxMaService wxService;
    
  • 获取openid实例,此处会抛出WxErrorException异常,微信网关返回的信息通过该异常打出;

     import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
     import me.chanjar.weixin.common.exception.WxErrorException;
    
     WxMaJscode2SessionResult session = this.wxService.getUserService().getSessionInfo(code);
     		String openid = session.getOpenid();
     		String unionid = session.getUnionid();
    

http://www.niftyadmin.cn/n/924362.html

相关文章

xmpp登录SASL认证流程

Tigase提供三种SASL认证机制&#xff1a;SCRAM-SHA-1、PLAIN、ANONYMOUS&#xff1b; SCRAM-SHA-1&#xff0c;如果帐号和密码都在Client对象中提供了&#xff0c;这种机制是首选&#xff0c;即使没有TLS加密也是安全的。关于SCRAM-SHA-1加密过程&#xff0c;参考&#xff1a; …

Tigase Muc报文流程

查询当前聊天室 <iq to"muc.teemo.com" id"klk5b-401" type"get"><query xmlns"http://jabber.org/protocol/disco#items"/></iq>服务器返回报文 <iq xmlns"jabber:client" to"bbbteemo.com/…

Springboot整合RocketMq项目订阅方无法接收消息解决方法

RocketMq的消息订阅方使用springboot集成时&#xff0c;在0.0.5及以下版本时会产生订阅方无法接收消息的问题。 <dependency><groupId>com.maihaoche</groupId><artifactId>spring-boot-starter-rocketmq</artifactId><version>0.0.5</…

itunes没法ipa_上传了ipa但iTunes Connect没有构建版本问题

AU上传ipa出现下图红框提示说明成功上传&#xff0c;如果App Store后台没有出现构建版本&#xff0c;请查看下面详细说明&#xff01;一、首先登录iTunes Connect 后台、查看ipa构建情况点击进入APP&#xff0c;点击活动&#xff0c;所有构建版本选项(下图所示)&#xff0c;有两…

audio 上一首 下一首 自定义样式_用audio标签打造一个属于自己的HTML5音乐播放器...

上一章节&#xff0c;我们刚刚讲了标签&#xff0c;今晚&#xff0c;我们讲的是标签&#xff0c;这两个东东除了表示的内容不一样以外&#xff0c;其他的特性相似的地方真的太多了&#xff0c;属性和用法几乎一样&#xff0c;也就说&#xff0c;如果上一章节你理解了&#xff0…

ad19原理图标注_AD19原理图ID复位

一般情况下原理图复位有两种情况&#xff1a;第一种就是我们在更改了原理图&#xff0c;重新再导入PCB中没有变化&#xff0c;那么就是我们的原理图ID没有复位处理了。第二种就是我们原理图导入PCB 中不成功&#xff0c;其封装都是对应的&#xff0c;也没有出现unkown pin报错&…

按钮图片拉伸_早上好图片大全 早上好问候语 早安心语唯美配图

早安&#xff0c;一声问候祝福在其间&#xff01;每天给你问候语&#xff0c;让你有个好心情&#xff01;早安视频分享早上好视频、经典老歌、广场舞等视频点击下方播放按钮&#xff0c;打开大家早上好&#xff0c;免费观看图片点击放大&#xff0c;长按图片保存&#xff01;1、…

docker 关闭_win10家庭版安装docker

1.Docker可以支持在 Mac、Windows、Linux 上安装&#xff0c;但是在 Windows10 系统中Docker for Windows目前只能在 64 位的 Windows10 专业版、企业版、教育版下才能安装&#xff0c;Win7/Win8/Win10 家庭版需要通过Docker Toolbox来安装下载地址&#xff1a;http://mirrors.…