Ver código fonte

fix: 修复故障通知二维码扫码无响应问题

1. 微信推送的扫码事件 Event 值为大写 SCAN,修正 case 匹配
2. 被动文本回复需交换 ToUserName/FromUserName 并补充 CreateTime

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 1 dia atrás
pai
commit
cf55e6799d

+ 10 - 4
car-wash-service/src/main/java/com/kym/service/wechat/impl/WeixinMPServiceImpl.java

@@ -93,8 +93,8 @@ public class WeixinMPServiceImpl implements WeixinMPService {
                             // 更新用户的关注状态
                             mpRelationService.lambdaUpdate().set(MpRelation::getSubscribe, false).eq(MpRelation::getMpOpenid, mpOpenid).update();
                             break;
-                        case "scan":
-                            // 扫描二维码
+                        case "SCAN":
+                            // 扫描二维码(微信推送上来的事件是大写 SCAN)
                             log.info("收到微信公众号扫描二维码通知: {}", mpOpenid);
                             // 处理带场景值的扫码(扫码绑定/解绑故障通知)
                             handleSceneBinding(mpOpenid, ret, false);
@@ -188,9 +188,15 @@ public class WeixinMPServiceImpl implements WeixinMPService {
             var result = faultSubscriberService.toggleSubscription(mpOpenid, stationId);
             log.info("故障通知订阅操作: openid={}, stationId={}, result={}", mpOpenid, stationId, result);
 
-            // 将操作结果放入返回的XML中,微信会将其作为文本消息推送给用户
+            // 构造被动文本回复:交换收发方,设置文本消息内容
+            var replyContent = result + "!\n站点:" + stationId + "\n" + ("绑定成功".equals(result) ? "您将收到该站点的设备故障提醒。" : "您将不再收到该站点的设备故障提醒。");
+            var fromUser = eventData.get("FromUserName"); // 用户openid,回复时要变成 ToUserName
+            var toUser = eventData.get("ToUserName");     // 公众号ID,回复时要变成 FromUserName
+            eventData.put("ToUserName", fromUser);
+            eventData.put("FromUserName", toUser);
+            eventData.put("CreateTime", String.valueOf(System.currentTimeMillis() / 1000));
             eventData.put("MsgType", "text");
-            eventData.put("Content", result + "!\n站点:" + stationId + "\n" + ("绑定成功".equals(result) ? "您将收到该站点的设备故障提醒。" : "您将不再收到该站点的设备故障提醒。"));
+            eventData.put("Content", replyContent);
         } catch (Exception e) {
             log.error("处理场景绑定异常: mpOpenid={}", mpOpenid, e);
         }