{"record":{"id":"79c816406f9a00d2","repo":"JeffreySu/WeiXinMPSDK","slug":"event-change-external-chat","errorCode":null,"errorMessage":"未知的客户群变更事件Event.CHANGE_EXTERNAL_CHAT下属请求信息","messagePattern":"未知的客户群变更事件Event\\.CHANGE_EXTERNAL_CHAT下属请求信息","errorType":"exception","errorClass":"UnknownRequestMsgTypeException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs","lineNumber":404,"sourceCode":"                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Create);\n                            break;\n                        case ExternalTagChangeType.update:\n                            responseMessage = await\n                                OnEvent_ChangeExternalTagUpdateRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Update);\n                            break;\n                        case ExternalTagChangeType.delete:\n                            responseMessage = await\n                                OnEvent_ChangeExternalTagDeleteRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Delete);\n                            break;\n                        case ExternalTagChangeType.shuffle:\n                            responseMessage = await\n                                OnEvent_ChangeExternalTagShuffleRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_External_Tag_Shuffle);\n                            break;\n                        default:\n                            throw new UnknownRequestMsgTypeException(\"未知的客户群变更事件Event.CHANGE_EXTERNAL_CHAT下属请求信息\",\n                                null);\n                    }\n\n                    break;\n                case Event.LIVING_STATUS_CHANGE: //直播事件回调\n                    responseMessage = await\n                        OnEvent_Living_Status_ChangeRequestAsync(\n                            RequestMessage as RequestMessageEvent_Living_Status_Change_Base);\n                    break;\n                case Event.SYS_APPROVAL_CHANGE: //系统应用审批状态变化通知回调\n                    responseMessage = await\n                        OnEvent_Sys_Approval_Change_Status_ChangeRequestAsync(\n                            RequestMessage as RequestMessageEvent_SysApprovalChange);\n                    break;\n                case Event.OPEN_APPROVAL_CHANGE: //自建应用审批状态变化通知回调\n                    responseMessage = await\n                        OnEvent_Open_Approval_Change_Status_ChangeRequestAsync(\n                            RequestMessage as RequestMessageEvent_OpenApprovalChange);","sourceCodeStart":386,"sourceCodeEnd":422,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs#L386-L422","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Upgrade Senparc.Weixin.Work so the current ExternalChatChangeType enum and dispatch cases are available","Override the chat-change dispatch in a derived handler to add handling for the unknown ChangeType","Catch UnknownRequestMsgTypeException in the message-handler pipeline, log the ChangeType, and respond 'success' to WeCom"],"exampleFix":"// before\nvar response = await handler.BuildResponseMessageAsync();\n// after\ntry { var response = await handler.BuildResponseMessageAsync(); }\ncatch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, \"Unhandled change_external_chat ChangeType\"); return \"success\"; }","handlingStrategy":"try-catch","validationCode":"if (!Enum.IsDefined(typeof(ExternalChatChangeType), chatEvent.ChangeType)) { return null; }","typeGuard":"bool IsKnownExternalChatChange(RequestMessageEvent_Change_External_Chat_Base e) => Enum.IsDefined(typeof(ExternalChatChangeType), e.ChangeType);","tryCatchPattern":"try { response = await handler.OnEventRequestAsync(evt); } catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, \"Unhandled change_external_chat ChangeType\"); return \"success\"; }","preventionTips":["Update the SDK when enabling 客户群 (customer group) features","Log raw event XML for unknown group-change sub-types","Return 'success' for unhandled ChangeType values","Test against a WeCom test suite before production rollout"],"tags":["wechat-work","external-chat-event","unknown-event"],"backgroundTag":"unsupported-enum-value","analyzedSha":"be573f6f94bdbf718dd5f6cdecb137fbc7ff651e","analyzedAt":"2026-09-12T10:01:50.733Z","contentChangedAt":"2026-09-12T10:01:50.733Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}