• 微信小程序模板消息后端代码


    利用spring 事件发送模板消息

    1.定义事件

     1 import com.ruoyi.project.salerauth.domain.TemplateMessage;
     2 import org.springframework.context.ApplicationEvent;
     3 
     4 public class TemplateMessageEvent extends ApplicationEvent {
     5 
     6 
     7     public TemplateMessageEvent(TemplateMessage templateMessage) {
     8         super(templateMessage);
     9     }
    10 
    11 
    12 }

     2.定义事件监听

    import com.ruoyi.framework.config.WpFactoryConfig;
    import com.ruoyi.framework.templateMessageEvent.event.TemplateMessageEvent;
    import com.ruoyi.framework.web.domain.WMTemplateData;
    import com.ruoyi.framework.web.domain.WMTemplateMessage;
    import com.ruoyi.framework.web.service.TemplateMessageService;
    import com.ruoyi.project.salerauth.domain.TemplateMessage;
    import com.ruoyi.project.salerauth.mapper.ShopSalerAuthMapper;
    import me.chanjar.weixin.common.exception.WxErrorException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationListener;
    import org.springframework.stereotype.Component;
    
    import java.util.Map;
    import java.util.TreeMap;
    
    @Component
    public class TemplateMessageListener implements ApplicationListener<TemplateMessageEvent> {
    
    
        @Autowired
        private TemplateMessageService templateMessageService;
    
        @Autowired
        private WpFactoryConfig wpFactoryConfig;
    
        @Autowired
        private ShopSalerAuthMapper shopSalerAuthMapper;
    
        @Override
        public void onApplicationEvent(TemplateMessageEvent templateMessageEvent) {
    
            Object source = templateMessageEvent.getSource();
    
            if (null != source && source instanceof TemplateMessage) {
                TemplateMessage templateMessage = (TemplateMessage) source;
    
    
                //获得认证工厂的名称
                String companyName = templateMessage.getShortName();
    
                //获得提交认证时的form_id
                String formId = shopSalerAuthMapper.querySalerAuthById(templateMessage.getAuthId()).getFormId();
    
                //获得openId
                String openId = templateMessage.getOpenId();
    
                String templateId = "";
                String page = "";
    
                Map<String, WMTemplateData> data = new TreeMap<>();
                //认证审核通过
                if (templateMessage.getAuthStatus().equals("1")) {
    
                    //获得申请人的姓名
                    String authorApplyName = templateMessage.getMemName();
    
                    data.put("keyword1", new WMTemplateData(companyName));
                    data.put("keyword2", new WMTemplateData(templateMessage.getMessage()));
                    data.put("keyword3", new WMTemplateData(authorApplyName));
                    data.put("keyword4", new WMTemplateData(""));
                    page = wpFactoryConfig.getPage() + "?authStatus='1'";
                    templateId = wpFactoryConfig.getOtemplateId();
    
                    //认证审核失败
                } else {
    
                    data.put("keyword1", new WMTemplateData(companyName));
                    data.put("keyword2", new WMTemplateData(templateMessage.getMessage()));
                    data.put("keyword3", new WMTemplateData(templateMessage.getRefuseReason()));
                    page = wpFactoryConfig.getPage() + "?authStatus='2'";
                    templateId = wpFactoryConfig.getFtemplateId();
    
                }
    
                try {
                    sendTemplateMessage(openId, page, templateId, formId, data);
                } catch (WxErrorException e) {
                    e.printStackTrace();
                }
    
            }
    
        }
    
        /**
         * 发送微信小程序模板消息
         *
         * @param touser
         * @param page
         * @param form_id
         * @param data
         */
        public void sendTemplateMessage(String touser, String page, String templateId, String form_id, Map<String, WMTemplateData> data) throws WxErrorException {
    
            WMTemplateMessage wmTemplateMessage = new WMTemplateMessage();
            wmTemplateMessage.setTouser(touser);
            wmTemplateMessage.setTemplate_id(templateId);
            wmTemplateMessage.setPage(page);
            wmTemplateMessage.setForm_id(form_id);
            wmTemplateMessage.setData(data);
            wmTemplateMessage.setEmphasis_keyword("keyword1.DATA");
            templateMessageService.send(wmTemplateMessage);
    
        }
    
    }


    import com.ruoyi.project.salerauth.domain.TemplateMessage;
    import org.springframework.context.ApplicationEvent;
    
    public class TemplateMessageEvent extends ApplicationEvent {
    
    
        public TemplateMessageEvent(TemplateMessage templateMessage) {
            super(templateMessage);
        }
    
    
    }
    

      

    3.定义小程序模板消息的请求体模型

     1 import lombok.Data;
     2 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     3 
     4 import java.io.Serializable;
     5 import java.util.Map;
     6 import java.util.TreeMap;
     7 
     8 /**
     9  *
    10  * 小程序模板消息实体
    11  *
    12  */
    13 @Data
    14 public class WMTemplateMessage implements Serializable {
    15 
    16     /**
    17      * 微信用户的openId
    18      */
    19     private String touser;
    20 
    21     private String template_id;
    22 
    23     private String page;
    24 
    25     private String form_id;
    26 
    27     private Map<String,WMTemplateData> data=new TreeMap<>();
    28 
    29     /**
    30      * 加大字段信息
    31      */
    32     private String emphasis_keyword;
    33 
    34 
    35     public String toJson() {
    36         return WxMpGsonBuilder.INSTANCE.create().toJson(this);
    37     }
    38 }

    4.调用发送执行的业务类

    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.internal.Streams;
    import com.google.gson.stream.JsonReader;
    import com.ruoyi.framework.web.domain.WMTemplateMessage;
    import me.chanjar.weixin.common.bean.result.WxError;
    import me.chanjar.weixin.common.exception.WxErrorException;
    import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
    import me.chanjar.weixin.mp.api.WxMpService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.io.StringReader;
    
    @Service
    public class TemplateMessageService {
    
    
       @Autowired
        private  WxMpService wxMpService;
    
    
        /**
         * 发送模板消息
         *
         * @param wmTemplateMessage
         * @return
         * @throws WxErrorException
         */
       public String send(WMTemplateMessage wmTemplateMessage) throws WxErrorException {
    
           String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send";
           String responseContent =wxMpService.execute(new SimplePostRequestExecutor(), url, wmTemplateMessage.toJson());
           JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
           final JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
    
           if (jsonObject.get("errcode").getAsInt() == 0)
               return jsonObject.get("msgid").getAsString();
           throw new WxErrorException(WxError.fromJson(responseContent));
    
       }
    
    
    }
    import java.io.Serializable;
    import java.util.Map;
    
    /**
     * 微信小程序模板消息
     *
     */
    public class WMTemplateData  implements Serializable {
    
        /**
         * 模板字段对应的值
         */
        private String value;
    
    
        public WMTemplateData(String value) {
            this.value = value;
        }
    
        public WMTemplateData() {
        }
    }

    5.配置具体的发送执行者的Bean

    import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
    import me.chanjar.weixin.mp.api.WxMpService;
    import me.chanjar.weixin.mp.api.WxMpServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
    
    /**
     * @author wanghong
     * @version 2.0.0
     * @title
     * @date 2018/11/26 9:48
     */
    @Configuration
    @Component
    public class WxMpServiceConfig {
    
    
        @Autowired
        private WPConfig wechatConfig;
    
        @Bean
        public WxMpService getWxMpService(){
    
            WxMpService wxMpService = new WxMpServiceImpl();
    
            WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
            wxMpConfigStorage.setAppId(wechatConfig.getAppId());
            wxMpConfigStorage.setSecret(wechatConfig.getSecret());
            wxMpService.setWxMpConfigStorage(wxMpConfigStorage);
    
            return wxMpService;
    
        }
    
    
    
    
    
    }

    6.读取配置文件的实体

    import lombok.Data;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Data
    @Component
    public class WpFactoryConfig {
    
        @Value("wpFactory.ftemplateId")
        private String ftemplateId;
    
        @Value("wpFactory.otemplateId")
        private String otemplateId;
    
        @Value("wpFactory.page")
        private String page;
    
    }

    7.使用

     @Autowired
        private TemplateMessagePublish templateMessagePublish;
    ......
    
    
      //审核失败
               if (salerAuth.getAuthStatus().equals("2")) {
    
                  TemplateMessage templateMessage = new TemplateMessage(salerAuth.getAuthStatus());
                   templateMessage.setAuthStatus(salerAuth.getAuthStatus());
                 templateMessage.setRefuseReason(salerAuth.getRefuseReason());
                    templateMessage.setShortName(salerAuth.getShortName());
                  templateMessage.setMemName(salerAuth.getMemName());
                   templateMessage.setShopSalerId(salerAuth.getShopSalerId());
                  templateMessage.setAuthId(salerAuth.getId());
                  templateMessagePublish.publish(new TemplateMessageEvent(templateMessage));
    
               }
    
              //审核成功
              if (salerAuth.getAuthStatus().equals("1")) {
                  salerAuth.setShopSalerId(salerAuth.getShopSalerId());
                  TemplateMessage templateMessage = new TemplateMessage(salerAuth.getAuthStatus());
                  templateMessage.setAuthStatus(salerAuth.getAuthStatus());
                  templateMessage.setAuthId(salerAuth.getId());
                   templateMessagePublish.publish(new TemplateMessageEvent(templateMessage));
               }

    8.使用的第三方的SDK,不要重复造轮子,哈哈哈哈

          <dependency>
                <groupId>me.chanjar</groupId>
                <artifactId>weixin-java-mp</artifactId>
                <version>1.3.3</version>
            </dependency>

     注意小程序发送模板消息必须要前端在执行具体的业务逻辑时传一个form_id给后端,而且这个form_id的具体的有效时长只有七天,哈哈哈,过时不候啊。。。。

  • 相关阅读:
    Auto.js脚本程序控制手机APP
    jemter运行报错,{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.13","title":"Unsupported Media Type","status":415,"traceId":"00-d0eeccb9ae68f44798713724724a4353-4623dc713e44b34c-00"
    解决ModuleNotFoundError: No module named 'pip'问题
    'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    vue配置
    创建分支,提交代码
    Navicat 12.1安装与破解之Navicat Keygen Patch使用方法
    vue--04
    Maven 打包程序如何使用可在外部修改的配置文件
    Vue 2.6 中部分引入 TypeScript 的方法
  • 原文地址:https://www.cnblogs.com/java-le/p/10582554.html
Copyright © 2020-2023  润新知