From 2d213e2df5c896625395f65d50c8abb0bc78e36a Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 22 五月 2023 10:43:00 +0800
Subject: [PATCH] 微信公众号、钉钉代码提交

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatController.java   |  110 +++++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatService.java      |   87 +++++++
 ruoyi-admin/pom.xml                                                                |   13 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkController.java |  131 ++++++++++
 ruoyi-admin/src/main/resources/application-druid.yml                               |  112 ++++----
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkService.java    |  127 ++++++++++
 smartor/src/main/java/com/smartor/domain/WeChatSendVo.java                         |   33 ++
 ruoyi-common/pom.xml                                                               |   43 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SendMessageIn.java      |   22 +
 9 files changed, 615 insertions(+), 63 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 0a4e3e1..9d19762 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -68,6 +68,19 @@
             <version>3.8.5</version>
             <scope>compile</scope>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/net.glxn.qrgen/javase -->
+        <dependency>
+            <groupId>net.glxn.qrgen</groupId>
+            <artifactId>javase</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/net.glxn.qrgen/core -->
+        <dependency>
+            <groupId>net.glxn.qrgen</groupId>
+            <artifactId>core</artifactId>
+            <version>2.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkController.java
new file mode 100644
index 0000000..2b5f8a3
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkController.java
@@ -0,0 +1,131 @@
+package com.ruoyi.web.controller.smartor;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+import com.dingtalk.api.request.OapiUserListidRequest;
+import com.dingtalk.api.response.OapiGettokenResponse;
+import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
+import com.dingtalk.api.response.OapiUserListidResponse;
+import com.ruoyi.common.core.controller.BaseController;
+import com.taobao.api.ApiException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 寰俊鎺ュ彛
+ *
+ * @author liusheng
+ * @date 2023-05-15
+ */
+@RestController
+@RequestMapping("/smartor/dingtalk")
+public class DingTalkController extends BaseController {
+
+    @Value("appid")
+    private String dingAppid = "dingn8iip5ubj7clrrsv";
+
+    @Value("appSecret")
+    private String dingAppSecret = "qlEK8D3oOVwGPOTiBQIBYTqQVlAfy9S_qQizEQFjJdSScwemWFryg4gbneu-NqWD";
+
+    /**
+     * 鍙戦�侀拤閽夋秷鎭�
+     *
+     * @param mobile
+     * @param park
+     * @param alarmCode
+     * @param severityDesc
+     * @throws ApiException
+     */
+    public void sendNotification(String mobile, String park, String alarmCode, String severityDesc) throws ApiException {
+        // Log.info("鍙戦�侀拤閽夐�氱煡");
+        String accessToken = getAccessToken();
+        if (StringUtils.isBlank(mobile)) {
+            return;
+        }
+        DingTalkClient client3 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
+
+        OapiUserListidRequest request2 = new OapiUserListidRequest();
+        request2.setDeptId(675909059L); // 璁剧疆瑕佽幏鍙栫殑閮ㄩ棬 ID锛岃繖閲屼互鏍归儴闂ㄤ负渚�
+        // 璁剧疆閮ㄩ棬 ID锛屽鏋滆幏鍙栨墍鏈夊憳宸ユ墜鏈哄彿锛屽彲浠ヨ缃负鏍归儴闂ㄧ殑 ID
+        OapiUserListidResponse response2 = client3.execute(request2, accessToken);
+        String body = response2.getBody();
+        // 瑙f瀽涓篔SONObject
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        // 鎻愬彇鍑篔SONArray
+        JSONArray jsonArray = new JSONArray(jsonObject.getJSONObject("result").getJSONArray("userid_list"));
+        // 灏咼SONArray杞负List鍒楄〃
+        String str = JSONObject.toJSONString(jsonArray);
+        List<String> list = JSONObject.parseObject(str, List.class);
+
+        //userid鏁扮粍
+        for (String urid : list) {
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+            request.setUseridList(urid);
+            request.setAgentId(1779052814L);
+            request.setToAllUser(false);
+            OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+            msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
+            msg.getOa().setMessageUrl("www.baidu.com");
+            msg.getOa().setPcMessageUrl("www.baidu.com");
+            msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
+            msg.getOa().getHead().setText("text");
+            msg.getOa().getHead().setBgcolor("FFBBBBBB");
+            msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
+            msg.getOa().getBody().setContent("msg淇℃伅");
+            OapiMessageCorpconversationAsyncsendV2Request.Form formPark = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formPark.setKey(null);
+            formPark.setValue(null);
+            OapiMessageCorpconversationAsyncsendV2Request.Form formAlarmCode = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formAlarmCode.setKey("宸ュ伐宸 ");
+            formAlarmCode.setValue(alarmCode);
+            OapiMessageCorpconversationAsyncsendV2Request.Form formSeverityDesc = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formSeverityDesc.setKey("鏋楄瑕佽瑕�");
+            formSeverityDesc.setValue(severityDesc);
+            OapiMessageCorpconversationAsyncsendV2Request.Form formConner = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formConner.setKey("鍘呭湪鍦�");
+            ArrayList<OapiMessageCorpconversationAsyncsendV2Request.Form> objects = new ArrayList<>();
+            objects.add(formPark);
+            objects.add(formSeverityDesc);
+            objects.add(formAlarmCode);
+            objects.add(formConner);
+            msg.getOa().getBody().setForm(objects);
+            msg.setMsgtype("oa");
+            request.setMsg(msg);
+            //  log.info("鑾峰彇鍙戦�侀�氱煡娑堟伅浣撳拰鑾峰彇鍙戦�侀�氱煡浜哄畬鎴�");
+            OapiMessageCorpconversationAsyncsendV2Response response = client.execute(request, accessToken);
+            //  log.info("鍙戦�佹秷鎭槸鍚︽垚鍔�"+response.isSuccess());
+            System.out.println(response.isSuccess());
+            //  log.info("娑堟伅浠诲姟ID"+response.getTaskId());
+            System.out.println(response.getTaskId());
+        }
+    }
+
+
+    /**
+     * 鑾峰彇 access_token
+     */
+    private String getAccessToken() throws ApiException {
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        //Appkey
+        request.setAppkey(dingAppid);
+        //Appsecret
+        request.setAppsecret(dingAppSecret);
+        /*璇锋眰鏂瑰紡*/
+        request.setHttpMethod("GET");
+        OapiGettokenResponse response = client.execute(request);
+        return response.getAccessToken();
+    }
+
+}
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkService.java
new file mode 100644
index 0000000..d491ece
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/DingTalkService.java
@@ -0,0 +1,127 @@
+package com.ruoyi.web.controller.smartor;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+import com.dingtalk.api.request.OapiUserGetByMobileRequest;
+import com.dingtalk.api.request.OapiUserListidRequest;
+import com.dingtalk.api.response.*;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.taobao.api.ApiException;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class DingTalkService {
+
+    /**
+     * 鑾峰彇AccessToken
+     *
+     * @return AccessToken
+     * @throws ApiException
+     */
+    private static String getAccessToken() throws ApiException {
+        DefaultDingTalkClient client =
+                new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        //Appkey
+        request.setAppkey("dingn8iip5ubj7clrrsv");
+        //Appsecret
+        request.setAppsecret("qlEK8D3oOVwGPOTiBQIBYTqQVlAfy9S_qQizEQFjJdSScwemWFryg4gbneu-NqWD");
+        /*璇锋眰鏂瑰紡*/
+        request.setHttpMethod("GET");
+        OapiGettokenResponse response = client.execute(request);
+        return response.getAccessToken();
+    }
+
+    public static void sendNotification(String mobile, String park, String alarmCode, String severityDesc) throws ApiException {
+        // Log.info("鍙戦�侀拤閽夐�氱煡");
+        String accessToken = getAccessToken();
+        if (StringUtils.isBlank(mobile)) {
+            return;
+        }
+        // DingTalkClient client3 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
+        DingTalkClient client3 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
+
+        OapiUserListidRequest request2 = new OapiUserListidRequest();
+        request2.setDeptId(675909059L); // 璁剧疆瑕佽幏鍙栫殑閮ㄩ棬 ID锛岃繖閲屼互鏍归儴闂ㄤ负渚�
+        // 璁剧疆閮ㄩ棬 ID锛屽鏋滆幏鍙栨墍鏈夊憳宸ユ墜鏈哄彿锛屽彲浠ヨ缃负鏍归儴闂ㄧ殑 ID
+        OapiUserListidResponse response2 = client3.execute(request2, accessToken);
+        String body = response2.getBody();
+        // 瑙f瀽涓篔SONObject
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        // 鎻愬彇鍑篔SONArray
+        JSONArray jsonArray = new JSONArray(jsonObject.getJSONObject("result").getJSONArray("userid_list"));
+        // 灏咼SONArray杞负List鍒楄〃
+        String str = JSONObject.toJSONString(jsonArray);
+        List<String> list = JSONObject.parseObject(str,List.class);
+
+        //鐢佃瘽鍙风爜鏁扮粍
+        //   String[] split = mobile.split(",");
+//        for (String s : split) {
+//            DingTalkClient client2 = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get_by_mobile");
+//            OapiUserGetByMobileRequest req = new OapiUserGetByMobileRequest();
+//            req.setMobile(s);
+//            req.setHttpMethod("GET");
+//            OapiUserGetByMobileResponse rsp = client2.execute(req, accessToken);
+//            //鑾峰彇鍒癠rid灏辨槸鍦ㄥ叕鍙搁噷瑕佸彂閫佸埌閭d釜浜虹殑id
+//            String urid = rsp.getUserid();
+        for (String urid : list) {
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+            request.setUseridList(urid);
+            request.setAgentId(1779052814L);
+            request.setToAllUser(false);
+            OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+            msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
+            msg.getOa().setMessageUrl("www.baidu.com");
+            msg.getOa().setPcMessageUrl("www.baidu.com");
+            msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
+            msg.getOa().getHead().setText("text");
+            msg.getOa().getHead().setBgcolor("FFBBBBBB");
+            msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
+            msg.getOa().getBody().setContent("msg淇℃伅");
+            OapiMessageCorpconversationAsyncsendV2Request.Form formPark = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formPark.setKey(null);
+            formPark.setValue(null);
+            OapiMessageCorpconversationAsyncsendV2Request.Form formAlarmCode = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formAlarmCode.setKey("宸ュ伐宸 ");
+            formAlarmCode.setValue(alarmCode);
+            OapiMessageCorpconversationAsyncsendV2Request.Form formSeverityDesc = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formSeverityDesc.setKey("鏋楄瑕佽瑕�");
+            formSeverityDesc.setValue(severityDesc);
+            OapiMessageCorpconversationAsyncsendV2Request.Form formConner = new OapiMessageCorpconversationAsyncsendV2Request.Form();
+            formConner.setKey("鍘呭湪鍦�");
+            ArrayList<OapiMessageCorpconversationAsyncsendV2Request.Form> objects = new ArrayList<>();
+            objects.add(formPark);
+            objects.add(formSeverityDesc);
+            objects.add(formAlarmCode);
+            objects.add(formConner);
+            msg.getOa().getBody().setForm(objects);
+            msg.setMsgtype("oa");
+            request.setMsg(msg);
+            //  log.info("鑾峰彇鍙戦�侀�氱煡娑堟伅浣撳拰鑾峰彇鍙戦�侀�氱煡浜哄畬鎴�");
+            OapiMessageCorpconversationAsyncsendV2Response response = client.execute(request, accessToken);
+            //  log.info("鍙戦�佹秷鎭槸鍚︽垚鍔�"+response.isSuccess());
+            System.out.println(response.isSuccess());
+            //  log.info("娑堟伅浠诲姟ID"+response.getTaskId());
+            System.out.println(response.getTaskId());
+        }
+    }
+
+    public static void main(String[] args) throws ApiException {
+//        String appId = "wx1c5243d2337753f4";
+//        String appSecret = "84a2186a0d175e88345267c716516cd3";
+//        WeChatService weChatService = new WeChatService(appId, appSecret);
+//        weChatService.sendMessageToFollowers("浣犲湪璇村暐鍛紵锛燂紵锛�");
+//        // new com.smartor.controller.BaseSmsaccountController().sendMessageToFollowers("AIJSl-IF6M05NzaXofPYbT5wgSP3bWH7I9OBmvJqsaU","www.baidu.com");
+
+        sendNotification("17607179857", "1", "2", "3");
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SendMessageIn.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SendMessageIn.java
new file mode 100644
index 0000000..e64c668
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SendMessageIn.java
@@ -0,0 +1,22 @@
+package com.ruoyi.web.controller.smartor;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SendMessageIn {
+
+    //娑堟伅绫诲瀷
+    private String msgType;
+    //webhook
+    private String webhook;
+    //瀵嗛挜
+    private String secret;
+    //鏂囨湰
+    private String text;
+    //鎸囧畾瀵硅薄
+    private List<String> mobileList;
+    //鏄惁鎺ㄩ�佹墍鏈変汉
+    private boolean isAtAll;
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatController.java
new file mode 100644
index 0000000..65210b2
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatController.java
@@ -0,0 +1,110 @@
+package com.ruoyi.web.controller.smartor;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.controller.BaseController;
+import com.smartor.domain.WeChatSendVo;
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 寰俊鎺ュ彛
+ *
+ * @author liusheng
+ * @date 2023-05-15
+ */
+@RestController
+@RequestMapping("/smartor/wechat")
+public class WeChatController extends BaseController {
+
+    @Value("appid")
+    private String appid = "wx1c5243d2337753f4";
+
+    @Value("appSecret")
+    private String appSecret = "84a2186a0d175e88345267c716516cd3";
+
+    /**
+     * 鑾峰彇妯℃澘淇℃伅
+     *
+     * @return
+     */
+    @GetMapping("/getTemplateList")
+    public JSONArray getTemplateList() {
+        String url = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" + getAccessToken();
+        OkHttpClient httpClient = new OkHttpClient();
+        Request request = new Request.Builder().url(url).build();
+        try {
+            Response response = httpClient.newCall(request).execute();
+            JSONObject jsonObject = JSONObject.parseObject(response.body().string());
+            return jsonObject.getJSONArray("template_list");
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 寰俊鍏紬鍙蜂俊鎭彂閫�
+     *
+     * @param weChatSendVo
+     * @return
+     */
+    @PostMapping("/sendMessageToFollowers")
+    public Boolean sendMessageToFollowers(@RequestBody WeChatSendVo weChatSendVo) {
+        WxMpService wxMpService;
+        wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(new WxMpInMemoryConfigStorage());
+        WxMpInMemoryConfigStorage wxMpConfigStorage = (WxMpInMemoryConfigStorage) wxMpService.getWxMpConfigStorage();
+        wxMpConfigStorage.setAppId(appid);
+        wxMpConfigStorage.setSecret(appSecret);
+        try {
+            List<String> openIdList = wxMpService.getUserService().userList(null).getOpenids();
+            for (String openId : openIdList) {
+                WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder().toUser(openId).templateId(weChatSendVo.getTemplateId()).url(weChatSendVo.getUrl()).build();
+                for (String key : weChatSendVo.getContent().keySet()) {
+                    templateMessage.addData(new WxMpTemplateData(key, weChatSendVo.getContent().get(key).toString()));
+                }
+                wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+            }
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        return true;
+    }
+
+
+
+    /**
+     * 鑾峰彇 access_token
+     */
+    public String getAccessToken() {
+        String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appSecret;
+        OkHttpClient httpClient = new OkHttpClient();
+        Request request = new Request.Builder().url(accessTokenUrl).build();
+        try {
+            Response response = httpClient.newCall(request).execute();
+            JSONObject jsonObject = JSONObject.parseObject(response.body().string());
+            return jsonObject.getString("access_token");
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    //  }
+
+
+}
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatService.java
new file mode 100644
index 0000000..076057d
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/WeChatService.java
@@ -0,0 +1,87 @@
+package com.ruoyi.web.controller.smartor;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.smartor.domain.WeChatSendVo;
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WeChatService {
+    private WxMpService wxMpService;
+
+    public WeChatService(String appId, String appSecret) {
+        wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(new WxMpInMemoryConfigStorage());
+        WxMpInMemoryConfigStorage wxMpConfigStorage = (WxMpInMemoryConfigStorage) wxMpService.getWxMpConfigStorage();
+        wxMpConfigStorage.setAppId(appId);
+        wxMpConfigStorage.setSecret(appSecret);
+    }
+
+    public void sendMessageToFollowers(String messageContent) {
+        try {
+            // 鑾峰彇鎵�鏈夊叧娉ㄨ�呯殑OpenID鍒楄〃
+            List<String> openIdList = wxMpService.getUserService().userList(null).getOpenids();
+            for (String openId : openIdList) {
+                WxMpKefuMessage wxMpKefuMessage = WxMpKefuMessage.TEXT().toUser(openId).content("鍒╂箹鍏紬鍙锋祴璇�").build();
+//                try {
+//                    boolean b = wxMpService.getKefuService().sendKefuMessage(wxMpKefuMessage);
+//                    if(b==false){
+//                        continue;
+//                    }
+//                }catch (WxErrorException e){
+//                    continue;
+//                }
+
+                WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder().toUser(openId).templateId("oG3pJHPVWpE81DmZsua_2tKwgJ97r0qz37z56ns7NB4").url("www.baidu.com").build();
+                templateMessage.addData(new WxMpTemplateData("{first", "浣犲ソ锛屾牴鎹綘鐨勮褰曚俊鎭紝涓轰綘鐢熸垚杩戞湡鐨勫悍澶嶆姤鍛�", "#FFB6C1"));
+                templateMessage.addData(new WxMpTemplateData("keyword1", "2023-05-15-2023-05-16", "#B95EA6"));
+                templateMessage.addData(new WxMpTemplateData("keyword2", "鍏辨祴閲忚绯�10娆★紝鍏朵腑姝e父7娆°�佸亸楂�2娆°�佸亸浣�1娆★紱骞冲潎姣忔棩楗鎽勫叆鐑噺1578澶у崱锛屽湪姣忔棩鐑噺鎺у埗鑼冨洿鍐咃紱骞冲潎姣忔棩鏁f1灏忔椂锛屾弧瓒冲悍澶嶉渶瑕�", "#173177"));
+                templateMessage.addData(new WxMpTemplateData("remark", "213456", "#87cefa"));
+//                templateMessage.addData(new WxMpTemplateData("low","AA","#FF6347"));
+//                templateMessage.addData(new WxMpTemplateData("scq_day","AA","#FF1493"));
+//                templateMessage.addData(new WxMpTemplateData("bir_day","AA","#FF00FF" ));
+//                templateMessage.addData(new WxMpTemplateData("daily_english_cn","AA","#800080"));
+//                templateMessage.addData(new WxMpTemplateData("daily_english_en","AA","#FFA500"));
+                wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+            }
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+//        String appId = "wx1c5243d2337753f4";
+//        String appSecret = "84a2186a0d175e88345267c716516cd3";
+//        WeChatService weChatService = new WeChatService(appId, appSecret);
+//        weChatService.sendMessageToFollowers("浣犲湪璇村暐鍛紵锛燂紵锛�");
+//        // new com.smartor.controller.BaseSmsaccountController().sendMessageToFollowers("AIJSl-IF6M05NzaXofPYbT5wgSP3bWH7I9OBmvJqsaU","www.baidu.com");
+        WeChatController weChatController = new WeChatController();
+        JSONArray templateList = weChatController.getTemplateList();
+        for (int i = 0; i < templateList.size(); i++) {
+            JSONObject template = templateList.getJSONObject(i);
+            System.out.println("Template ID: " + template.getString("template_id"));
+            System.out.println("Title: " + template.getString("title"));
+            System.out.println("Content: " + template.getString("content"));
+            System.out.println("===============================");
+            WeChatSendVo weChatSendVo = new WeChatSendVo();
+            weChatSendVo.setTemplateId(template.getString("template_id"));
+            Map<String, Object> map = new HashMap<>();
+            map.put("first", "姝﹀櫒鐨勫崱");
+            map.put("keyword1", "鐪嬫垜浠樻鐪嬫垜浠樻鏈紑鏀剧湅鎴戜粯娆�");
+            map.put("keyword2", "12657698798797");
+            map.put("remark", "鍟婂晩鎾掑晩鍟婂晩");
+            weChatSendVo.setContent(map);
+            weChatController.sendMessageToFollowers(weChatSendVo);
+        }
+
+    }
+}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index a48a07c..5f4187d 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -1,57 +1,59 @@
 # 鏁版嵁婧愰厤缃�
 spring:
-    datasource:
-        type: com.alibaba.druid.pool.DruidDataSource
-        driverClassName: com.mysql.cj.jdbc.Driver
-        druid:
-            # 涓诲簱鏁版嵁婧�
-            master:
-                url: jdbc:mysql://116.62.18.175:6002/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: hxsoft
-                password: Hxerp2000
-            # 浠庡簱鏁版嵁婧�
-            slave:
-                # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
-                enabled: false
-                url: 
-                username: 
-                password: 
-            # 鍒濆杩炴帴鏁�
-            initialSize: 5
-            # 鏈�灏忚繛鎺ユ睜鏁伴噺
-            minIdle: 10
-            # 鏈�澶ц繛鎺ユ睜鏁伴噺
-            maxActive: 20
-            # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
-            maxWait: 60000
-            # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
-            timeBetweenEvictionRunsMillis: 60000
-            # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
-            minEvictableIdleTimeMillis: 300000
-            # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
-            maxEvictableIdleTimeMillis: 900000
-            # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
-            validationQuery: SELECT 1 FROM DUAL
-            testWhileIdle: true
-            testOnBorrow: false
-            testOnReturn: false
-            webStatFilter: 
-                enabled: true
-            statViewServlet:
-                enabled: true
-                # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
-                allow:
-                url-pattern: /druid/*
-                # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
-                login-username: ruoyi
-                login-password: 123456
-            filter:
-                stat:
-                    enabled: true
-                    # 鎱QL璁板綍
-                    log-slow-sql: true
-                    slow-sql-millis: 1000
-                    merge-sql: true
-                wall:
-                    config:
-                        multi-statement-allow: true
\ No newline at end of file
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://116.62.18.175:6002/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: hxsoft
+        password: Hxerp2000
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  appid : wxf50c5c72265188eb
+  appSecret : 7ab0a81392a96b157efa1df00f9cd939
\ No newline at end of file
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 684c142..b3237a4 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -52,24 +52,37 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
-  
+
         <!-- JSON宸ュ叿绫� -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
-        
+
         <!-- 鍔ㄦ�佹暟鎹簮 -->
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
-			<version>3.5.2</version>
-		</dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
 
         <!-- 闃块噷JSON瑙f瀽鍣� -->
         <dependency>
             <groupId>com.alibaba.fastjson2</groupId>
             <artifactId>fastjson2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.4.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>3.0.0</version>
         </dependency>
 
         <!-- io甯哥敤宸ュ叿绫� -->
@@ -131,7 +144,21 @@
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.26</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/smartor/src/main/java/com/smartor/domain/WeChatSendVo.java b/smartor/src/main/java/com/smartor/domain/WeChatSendVo.java
new file mode 100644
index 0000000..8b35549
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/domain/WeChatSendVo.java
@@ -0,0 +1,33 @@
+package com.smartor.domain;
+
+import com.ruoyi.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class WeChatSendVo {
+
+    /**
+     * 妯℃澘ID
+     */
+    @Excel(name = " 妯℃澘ID ")
+    String templateId;
+
+    /**
+     * 鍙戦�佸唴瀹�
+     * [{
+     * "first":"浣犲ソ锛屾牴鎹綘鐨勮褰曚俊鎭紝涓轰綘鐢熸垚杩戞湡鐨勫悍澶嶆姤鍛�",
+     * 鈥渒eyword1鈥濓細鈥�......鈥�
+     * }]
+     */
+    @Excel(name = " 鍙戦�佸唴瀹� ")
+    Map<String, Object> content;
+
+    /**
+     * 璺宠浆URL
+     */
+    @Excel(name = " 璺宠浆URL ")
+    String url;
+
+}

--
Gitblit v1.9.3