Wechat-Group / WxJava

微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,视频号,公众号等的后端开发
Apache License 2.0
29.48k stars 8.5k forks source link

企微第三方加好友回调,创建时间一样被判定为重复消息 #3311

Open wayne-wei-q opened 1 month ago

wayne-wei-q commented 1 month ago

简要描述

在企微第三方回调接口使用消息路由时发现,当加好友回调消息的创建时间一样,但外部联系人不同,企微用户也不同时会被判断为重复消息,导致没有进入到后续的handle,造成该客户的相关业务未能处理。

模块版本情况

详细描述

Class: me.chanjar.weixin.cp.tp.message.WxCpTpMessageRouter Mehtod: isMsgDuplicated() `private boolean isMsgDuplicated(WxCpTpXmlMessage wxMessage) { StringBuilder messageId = new StringBuilder(); if (wxMessage.getInfoType() != null) { messageId.append(wxMessage.getInfoType()) .append("-").append(StringUtils.trimToEmpty(wxMessage.getSuiteId())) .append("-").append(wxMessage.getTimeStamp()) .append("-").append(StringUtils.trimToEmpty(wxMessage.getAuthCorpId())) .append("-").append(StringUtils.trimToEmpty(wxMessage.getUserID())) .append("-").append(StringUtils.trimToEmpty(wxMessage.getChangeType())) .append("-").append(StringUtils.trimToEmpty(wxMessage.getServiceCorpId())) .append("-").append(StringUtils.trimToEmpty(wxMessage.getExternalUserID())); }

if (wxMessage.getMsgType() != null) {
  if (wxMessage.getMsgId() != null) {
    messageId.append(wxMessage.getMsgId())
      .append("-").append(wxMessage.getCreateTime())
      .append("-").append(wxMessage.getFromUserName());
  } else {
      messageId.append(wxMessage.getMsgType())
      .append("-").append(wxMessage.getCreateTime())
      .append("-").append(wxMessage.getFromUserName())
      .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()))
      .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()));

  }
}

return this.messageDuplicateChecker.isDuplicate(messageId.toString());

}`

image 在加好友回调中,InfoType为空,MsgID为空会进入到如图所示的逻辑中,此处createTime和FromUserName是相同的,而Event必定也是相同的,eventKey为空。所以会判定为重复消息,此处的messageId应加上ExternalUserID和userID作为唯一判定的key。

wayne-wei-q commented 1 month ago

@binarywang

binarywang commented 1 month ago

可以加上,欢迎直接提交PR修复代码