JeffreySu/WeiXinMPSDK · error · UnknownRequestMsgTypeException

未知的客户群变更事件Event.CHANGE_EXTERNAL_CHAT下属请求信息

Error message

未知的客户群变更事件Event.CHANGE_EXTERNAL_CHAT下属请求信息

What it means

OnEventRequestAsync dispatches Event.CHANGE_EXTERNAL_CHAT (customer group change) callbacks by ExternalChatChangeType (create, update, dismiss). The default case throws UnknownRequestMsgTypeException when the ChangeType matches none of the handled values. The message text is mislabeled as '客户群变更' vs the tag branch, but it guards the chat-change dispatch.

Solutions

  1. Upgrade Senparc.Weixin.Work so the current ExternalChatChangeType enum and dispatch cases are available
  2. Override the chat-change dispatch in a derived handler to add handling for the unknown ChangeType
  3. Catch UnknownRequestMsgTypeException in the message-handler pipeline, log the ChangeType, and respond 'success' to WeCom

Example fix

// before
var response = await handler.BuildResponseMessageAsync();
// after
try { var response = await handler.BuildResponseMessageAsync(); }
catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, "Unhandled change_external_chat ChangeType"); return "success"; }
Defensive patterns

Strategy: try-catch

Validate before calling

if (!Enum.IsDefined(typeof(ExternalChatChangeType), chatEvent.ChangeType)) { return null; }

Type guard

bool IsKnownExternalChatChange(RequestMessageEvent_Change_External_Chat_Base e) => Enum.IsDefined(typeof(ExternalChatChangeType), e.ChangeType);

Try / catch

try { response = await handler.OnEventRequestAsync(evt); } catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, "Unhandled change_external_chat ChangeType"); return "success"; }

Prevention

When it happens

Trigger: A 'change_external_chat' callback arrives with a ChangeType outside {create, update, dismiss} — e.g. a new WeCom group-change sub-event not present in your library version.

Common situations: Group chat (客户群) feature events arriving at older library versions; WeCom introducing new group lifecycle events; callback URL configured to a broader event scope than expected.

Related errors


AI-assisted analysis of JeffreySu/WeiXinMPSDK@be573f6f94 (2026-09-12). Data as JSON: /api/errors/79c816406f9a00d2. Report an issue: GitHub.

Appendix: source

Thrown at src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs:404

                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Create);
                            break;
                        case ExternalTagChangeType.update:
                            responseMessage = await
                                OnEvent_ChangeExternalTagUpdateRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Update);
                            break;
                        case ExternalTagChangeType.delete:
                            responseMessage = await
                                OnEvent_ChangeExternalTagDeleteRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Delete);
                            break;
                        case ExternalTagChangeType.shuffle:
                            responseMessage = await
                                OnEvent_ChangeExternalTagShuffleRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Shuffle);
                            break;
                        default:
                            throw new UnknownRequestMsgTypeException("未知的客户群变更事件Event.CHANGE_EXTERNAL_CHAT下属请求信息",
                                null);
                    }

                    break;
                case Event.LIVING_STATUS_CHANGE: //直播事件回调
                    responseMessage = await
                        OnEvent_Living_Status_ChangeRequestAsync(
                            RequestMessage as RequestMessageEvent_Living_Status_Change_Base);
                    break;
                case Event.SYS_APPROVAL_CHANGE: //系统应用审批状态变化通知回调
                    responseMessage = await
                        OnEvent_Sys_Approval_Change_Status_ChangeRequestAsync(
                            RequestMessage as RequestMessageEvent_SysApprovalChange);
                    break;
                case Event.OPEN_APPROVAL_CHANGE: //自建应用审批状态变化通知回调
                    responseMessage = await
                        OnEvent_Open_Approval_Change_Status_ChangeRequestAsync(
                            RequestMessage as RequestMessageEvent_OpenApprovalChange);

View on GitHub (pinned to be573f6f94)