Bladeren bron

订阅授权

15376779826 1 maand geleden
bovenliggende
commit
b1b6d8baa2

+ 53 - 2
fs-company/src/main/java/com/fs/company/controller/wechat/WechatCallbackController.java

@@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
@@ -18,7 +20,8 @@ public class WechatCallbackController {
 
     @Autowired
     private WechatService wechatService;
-    private static final String TOKEN = "PPKOdAlCoMO"; // 与微信后台保持一致
+
+    private static final String TOKEN = "PPKOdAlCoMO";
 
     /** 微信服务器验证 (GET) */
     @GetMapping
@@ -33,7 +36,6 @@ public class WechatCallbackController {
         String content = String.join("", arr);
 
         String hash = DigestUtils.sha1Hex(content);
-
         return hash.equals(signature) ? echostr : "error";
     }
 
@@ -47,12 +49,61 @@ public class WechatCallbackController {
                 ("subscribe".equalsIgnoreCase(event.getEvent()) || "SCAN".equalsIgnoreCase(event.getEvent()))) {
 
             String openid = event.getFromUserName();
+            String fromUser = event.getToUserName();
             String eventKey = event.getEventKey();
+
+            // 绑定二维码场景参数
             if (eventKey != null && !eventKey.isEmpty()) {
                 String sceneKey = eventKey.replace("qrscene_", "");
                 wechatService.bindSellerByScene(sceneKey, openid);
             }
+
+            // 自动回复带订阅授权链接
+            String authUrl = generateAuthUrl();
+            String msgContent = "欢迎关注!点击下方链接开启消息提醒:" + authUrl;
+            return buildTextMessage(openid, fromUser, msgContent);
         }
+
         return "success";
     }
+
+    /** 生成订阅消息授权链接 */
+    private String generateAuthUrl() throws UnsupportedEncodingException {
+        String appid = "wx7670b3b1b1cfcd47"; // 服务号appid
+        String templateId = "CHyzPCokptj4Z9qTpo-UJQzd_OAN4cNa6zpZo9LZ_YY"; // 长期订阅模板ID
+        String redirectUrl = URLEncoder.encode("https://userapp.hbhdt.top//app/common/submsgCallback", StandardCharsets.UTF_8.name());
+
+        return "https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm"
+                + "&appid=" + appid
+                + "&scene=1000"
+                + "&template_id=" + templateId
+                + "&redirect_url=" + redirectUrl
+                + "#wechat_redirect";
+    }
+
+    /** 构建文本消息XML */
+    private String buildTextMessage(String toUser, String fromUser, String content) {
+        return "<xml>" +
+                "<ToUserName><![CDATA[" + toUser + "]]></ToUserName>" +
+                "<FromUserName><![CDATA[" + fromUser + "]]></FromUserName>" +
+                "<CreateTime>" + System.currentTimeMillis() / 1000 + "</CreateTime>" +
+                "<MsgType><![CDATA[text]]></MsgType>" +
+                "<Content><![CDATA[" + content + "]]></Content>" +
+                "</xml>";
+    }
+
+    /** 授权回调接口 (用户点击“允许订阅”后微信回调) */
+    @GetMapping("/submsgCallback")
+    public String submsgCallback(@RequestParam String action,
+                                 @RequestParam String openid,
+                                 @RequestParam String template_id) {
+        if ("confirm".equals(action)) {
+            System.out.println("用户已授权订阅,openid:" + openid + ", template_id:" + template_id);
+            // 保存用户订阅信息,可保存到数据库或Redis
+            //wechatService.saveUserSubscription(openid, template_id);
+            return "您已成功开启订阅提醒!";
+        } else {
+            return "您已取消订阅授权";
+        }
+    }
 }

+ 1 - 0
fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -132,6 +132,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/druid/**").anonymous()
                 .antMatchers("/qw/data/**").anonymous()
                 .antMatchers("/qw/user/selectCloudByCompany").anonymous()
+                .antMatchers("/wechat/callback/submsgCallback").anonymous()
                 .antMatchers("/wechat/callback").anonymous()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()

+ 37 - 1
fs-service/src/main/java/com/fs/company/util/WechatApi.java

@@ -1,5 +1,7 @@
 package com.fs.company.util;
 
+import com.fs.common.core.redis.RedisCache;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
@@ -55,5 +57,39 @@ public class WechatApi {
         return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + URLEncoder.encode(ticket, "UTF-8");
     }
 
-    // 后续可以加模板消息发送方法
+    public static void sendSubscribeMessage(String accessToken, String openId) {
+        accessToken = "97_Pw_YjpbbakVd9Oy9opTVwiKz7vz-ZtglyFdipnion71g-PgRW9PKEN1IxxS-E3m23dU7GrmlktRN6ht3SUOtcKtU7eMeRv3fSMWmX5PBqMF9X6vhsMcUqjcPrsUCOAhACAXJV";
+        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/bizsend?access_token=" + accessToken;
+
+        // 消息体
+        Map<String, Object> data = new HashMap<>();
+        data.put("touser", openId);
+        data.put("template_id", "CHyzPCokptj4Z9qTpo-UJQzd_OAN4cNa6zpZo9LZ_YY");
+
+        // 模板参数
+        Map<String, Object> payloadData = new HashMap<>();
+        payloadData.put("date3", createValue("2025年10月30日 14:00"));
+        payloadData.put("name2", createValue("张三"));
+        payloadData.put("thing5", createValue("问诊咨询"));
+        payloadData.put("thing1", createValue("您有新的咨询消息,请及时回复"));
+        payloadData.put("thing6", createValue("请在服务时间内处理"));
+
+        data.put("data", payloadData);
+
+        RestTemplate restTemplate = new RestTemplate();
+
+        Map<String, Object> result = restTemplate.postForObject(url, data, Map.class);
+
+        System.out.println("微信返回结果:" + result);
+    }
+
+    private static Map<String, String> createValue(String value) {
+        Map<String, String> map = new HashMap<>();
+        map.put("value", value);
+        return map;
+    }
+
+    public static void main(String[] args) {
+        sendSubscribeMessage("","ooWg-6u1yGLDT9xlmV4lvwjLZV5o");
+    }
 }

+ 13 - 0
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -612,4 +612,17 @@ public class CommonController {
 		return ResponseResult.ok(config.getIsOpenIM());
 	}
 
+	@GetMapping("/submsgCallback")
+	public String submsgCallback(@RequestParam String action,
+								 @RequestParam String openid,
+								 @RequestParam String template_id) {
+		if ("confirm".equals(action)) {
+			System.out.println("用户已授权订阅,openid:" + openid + ", template_id:" + template_id);
+			// 保存用户订阅信息,可保存到数据库或Redis
+			//wechatService.saveUserSubscription(openid, template_id);
+			return "您已成功开启订阅提醒!";
+		} else {
+			return "您已取消订阅授权";
+		}
+	}
 }