From 5bef4af60003045ba976660ab309460c87ec6185 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Mon, 20 Oct 2025 17:31:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/NotifyController.java | 47 +++++++++++++++++-- .../java/com/czg/account/entity/UserInfo.java | 4 ++ .../impl/UserAuthorizationServiceImpl.java | 4 -- .../service/account/util/AcAccountUtil.java | 17 ++++--- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/NotifyController.java b/cash-api/account-server/src/main/java/com/czg/controller/NotifyController.java index ef1b5c73..d72eff9f 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/NotifyController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/NotifyController.java @@ -1,6 +1,10 @@ package com.czg.controller; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.czg.account.entity.UserInfo; import com.czg.account.service.UserInfoService; +import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; @@ -32,7 +36,7 @@ public class NotifyController { @RequestMapping(produces = MediaType.TEXT_PLAIN_VALUE) public String notify(HttpServletRequest request, - @RequestParam(required = false) String signature, // GET 必传,POST 可选,设为非必选 + @RequestParam(required = false) String signature, @RequestParam(required = false) String timestamp, @RequestParam(required = false) String nonce, @RequestParam(required = false) String echostr) { @@ -50,17 +54,50 @@ public class NotifyController { signature, timestamp, nonce); // 读取 POST 请求体中的 XML 数据(微信推送的消息格式为 XML) String xmlData = readPostXml(request); + JSONObject jsonObject = JSON.parseObject(xmlData); log.info("微信 POST 消息内容: {}", xmlData); - - // TODO: 后续可添加消息解析、业务处理逻辑(如关注事件、文本消息回复等) + // 获取消息类型(如 event) + String msgType = jsonObject.getString("MsgType"); + // 获取事件类型(如 unsubscribe:用户取消关注 subscribe:用户关注) + String event = jsonObject.getString("Event"); + // 获取用户 OpenID + String openId = jsonObject.getString("FromUserName"); + //携带参数 + String eventKey = jsonObject.getString("EventKey"); + Long userId = null; + log.info("解析结果 - 消息类型: {}, 事件类型: {}, 用户 OpenID: {} 携带参数: {}", msgType, event, openId, eventKey); + if (eventKey != null && eventKey.startsWith("qrscene_")) { + try { + // 截取 "qrscene_" 前缀后的字符串(长度为 8),并转为 Long + String numberStr = eventKey.substring("qrscene_".length()); + userId = Long.parseLong(numberStr); + } catch (NumberFormatException e) { + log.error("EventKey 后缀不是有效数字,eventKey: {}", eventKey, e); + } + } + updateUserInfoIsAc(event, openId, userId); // 处理完成后,微信要求返回 "SUCCESS" 或空字符串(否则会重试推送) return SUCCESS; } - - // 3. 其他请求方式(如 PUT/DELETE),返回空字符串 return ""; } + //更新userInfo openId 以及 关注表示isAc + private void updateUserInfoIsAc(String event, String openId, Long userId) { + if ("subscribe".equals(event) && userId != null) { + // 关注事件,更新用户关注状态为 1 + UserInfo userInfo = new UserInfo(); + userInfo.setIsAc(1); + userInfo.setWechatAcOpenId(openId); + userInfoService.update(userInfo, new QueryWrapper().eq(UserInfo::getId, userId)); + } else if ("unsubscribe".equals(event)) { + // 取消关注事件,更新用户关注状态为 0 + UserInfo userInfo = new UserInfo(); + userInfo.setIsAc(0); + userInfoService.update(userInfo, new QueryWrapper().eq(UserInfo::getWechatAcOpenId, openId)); + } + } + /** * 工具方法:读取 POST 请求体中的 XML 数据 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/UserInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/UserInfo.java index 92d60bec..2056746a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/UserInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/UserInfo.java @@ -86,6 +86,10 @@ public class UserInfo implements Serializable { * 登录密码 */ private String password; + /** + * 是否关注微信公众号 0-未绑定 1-已绑定 + */ + private Integer isAc; // 微信公众号二维码有效时间 private LocalDateTime acQrcodeValidTime; // 微信公众号二维码 diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java index baa1ea8a..11eec01b 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/UserAuthorizationServiceImpl.java @@ -1,11 +1,7 @@ package com.czg.service.account.service.impl; -//import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils; - -import cn.hutool.core.codec.Base64; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.symmetric.AES; import com.alibaba.fastjson2.JSONObject; import com.czg.account.dto.auth.GetPhoneDTO; import com.czg.account.dto.auth.LoginTokenDTO; diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/util/AcAccountUtil.java b/cash-service/account-service/src/main/java/com/czg/service/account/util/AcAccountUtil.java index 089a0b1c..ac6f66e6 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/util/AcAccountUtil.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/util/AcAccountUtil.java @@ -61,7 +61,7 @@ public class AcAccountUtil { bodyJson.put("action_name", "QR_SCENE"); JSONObject actionInfo = new JSONObject(); JSONObject scene = new JSONObject(); - scene.put("scene_id", userId); + scene.put("scene_str", userId.toString()); actionInfo.put("scene", scene); bodyJson.put("action_info", actionInfo); @@ -102,23 +102,26 @@ public class AcAccountUtil { } public static void main(String[] args) { - String accessToken = "97_Kgg5H4EvOGc67n2GoR7Kqp-NuREOMuzesG0CpbNrx1JhvM6axp9Ub6OoZzBeANuQI3vExR9onbEeBhLdgiMjLjxpiwgDmXOgvZS_rEL5S766QVJQ7p2eggksyuQFPRdAEALVX"; +// String resp = HttpUtil.get(StrUtil.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}", "wx1fb600d0f5ea6279", "b4c0534c9b5e6c84a7fe5c2078dff876")); +// System.out.println(resp); + String accessToken = "97_-4x_Mt_x243Ixmcm0kEuO5t7y7RGCdCMXQyIBBi_LCX2B7kdGSZj0XZ4poHC1J4bmMWVdMI1Gengm9phoXWbirwPmTjj2mfmEBoCNe4FeZA6dg3ZLBslvCaOijECHUhAJAVAN"; JSONObject bodyJson = new JSONObject(); //二维码有效时间(秒),最大2592000,仅临时二维码需要 bodyJson.put("expire_seconds", "2592000"); //二维码类型:QR_SCENE(临时整型)/QR_STR_SCENE(临时字符串)/QR_LIMIT_SCENE(永久整型)/QR_LIMIT_STR_SCENE(永久字符串) - bodyJson.put("action_name", "QR_SCENE"); + bodyJson.put("action_name", "QR_STR_SCENE"); JSONObject actionInfo = new JSONObject(); JSONObject scene = new JSONObject(); - scene.put("scene_id", 333); + scene.put("scene_str", "43525423"); actionInfo.put("scene", scene); bodyJson.put("action_info", actionInfo); System.out.println(bodyJson); - + //创建临时二维码失败,发送参数: {"action_info":{"scene":{"scene_id":36449}},"action_name":"QR_SCENE","expire_seconds":"2592000"}, 响应内容: {"errcode":40052,"errmsg":"invalid action name rid: 68f5fa37-20fb3162-0f87b4f2"} + //创建临时二维码失败,发送参数: {"action_info":{"scene":{"scene_id":36449}},"action_name":"QR_SCENE","expire_seconds":"2592000"}, 响应内容: {"errcode":40052,"errmsg":"invalid action name rid: 68f5f970-2a84749c-78e4d78f"} String resps = HttpUtil.post(StrUtil.format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={}", accessToken), JSONObject.toJSONString(bodyJson)); JSONObject respInfos = JSONObject.parseObject(resps); System.out.println(respInfos); - //{"action_info":{"scene":{"scene_id":36434}},"action_name":"QR_SCENE","expire_seconds":"2592000"}, 响应内容: {"errcode":40052,"errmsg":"invalid action name rid: 68f5e3ac-7f703951-6a8908fa"} - //{"action_info":{"scene":{"scene_id":36449}},"action_name":"QR_SCENE","expire_seconds":"2592000"} +// {"action_info":{"scene":{"scene_id":333}},"action_name":"QR_SCENE","expire_seconds":"2592000"} +// {"ticket":"gQEZ8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyUFVfTnM2MXhmbUoxYTM3dGhGMXIAAgSD_vVoAwQAjScA","expire_seconds":2592000,"url":"http://weixin.qq.com/q/02PU_Ns61xfmJ1a37thF1r"} } }