wxwork-sendmessage-debug-fix.md 11 KB

企业微信发送消息调试与修复指南

🚨 当前问题

1. JSSDK注册回调未触发

现象

🔍 [registerCorpWithSuite] 调用ww.register...
(之后没有任何回调日志)

原因

  • onAgentConfigSuccessonAgentConfigFail回调都未执行
  • Promise一直处于pending状态
  • 可能是企业微信JSSDK环境问题

2. 用户身份显示"未知"

现象:用户实际是"脑控徐福静",但系统显示"未知"

原因

  • currentUser未正确加载
  • 或者企业微信用户信息未同步

3. 消息未发送到群聊

现象:控制台显示准备发送,但群聊中没有消息

原因:JSSDK注册失败导致sendChatMessage无法执行


✅ 修复方案

1. 添加超时机制

文件wxwork-sdk.service.ts

问题:如果回调永不触发,会一直等待

修复

return new Promise((resolve) => {
  // 🔥 添加15秒超时机制
  const timeout = setTimeout(() => {
    console.warn('⚠️ [registerCorpWithSuite] 注册超时(15秒),可能原因:');
    console.warn('  1. 回调函数未被触发');
    console.warn('  2. 企业微信JSSDK加载失败');
    console.warn('  3. 不在正确的群聊会话中');
    console.warn('  4. 应用权限配置错误');
    resolve(false);
  }, 15000);
  
  ww.register({
    // ...
    onAgentConfigSuccess: () => {
      clearTimeout(timeout); // ✅ 清除超时
      resolve(true);
    },
    onAgentConfigFail: (err: any) => {
      clearTimeout(timeout); // ✅ 清除超时
      resolve(false);
    }
  });
});

2. 避免重复初始化SDK

文件delivery-message.service.ts

问题stage-deliveryDeliveryMessageService都会初始化SDK

修复

// 🔥 检查SDK是否已初始化(避免重复初始化)
console.log('🔍 [sendToWxwork] 检查SDK初始化状态...');
console.log('  当前SDK.cid:', this.wxworkService.cid);
console.log('  当前SDK.appId:', this.wxworkService.appId);

if (!this.wxworkService.cid || this.wxworkService.cid !== cid) {
  console.log('🔍 [sendToWxwork] SDK未初始化或CID不匹配,开始初始化...');
  await this.wxworkService.initialize(cid, appId);
  console.log('✅ [sendToWxwork] SDK初始化完成');
} else {
  console.log('✅ [sendToWxwork] SDK已初始化,跳过重复初始化');
}

3. 增强调试日志

文件wxwork-sdk.service.ts

添加的日志

console.log('🔍 [registerCorpWithSuite] corpId:', corpConfig.corpId);
console.log('🔍 [registerCorpWithSuite] agentId:', corpConfig.agentId);
console.log('🔍 [registerCorpWithSuite] suiteId:', suiteId);
console.log('🔍 [registerCorpWithSuite] url:', location.href);
console.log('🔍 [registerCorpWithSuite] 签名生成完成:', {
  nonceStr: '666',
  timestamp: (now.getTime() / 1000).toFixed(0),
  url: location.href
});

🔍 问题排查步骤

步骤1:检查是否在正确的环境中

必须从企业微信群聊侧边栏打开应用

✅ 正确入口:群聊 → 右上角"..." → 应用 → 你的应用
❌ 错误入口:企业微信首页 → 工作台 → 应用
❌ 错误入口:浏览器直接打开

原因

  • sendChatMessage只能在群聊会话上下文中使用
  • 从其他入口打开应用,没有群聊上下文

步骤2:检查URL格式

正确格式

https://app.fmode.cn/dev/yss/#/wxwork/cDL6R1hgSi/project/project-detail/xxx
                                    ↑        ↑         ↑
                                   固定    CID    应用ID

检查日志

console.log('🔍 [sendToWxwork] 当前URL:', window.location.href);
// 应该包含 /wxwork/cDL6R1hgSi/project/

步骤3:等待超时日志

如果看到超时日志

⚠️ [registerCorpWithSuite] 注册超时(15秒),可能原因:
  1. 回调函数未被触发
  2. 企业微信JSSDK加载失败
  3. 不在正确的群聊会话中
  4. 应用权限配置错误

解决方法

  1. 确认从群聊侧边栏打开
  2. 检查企业微信管理后台权限配置
  3. 确认应用已发布

步骤4:检查应用权限

企业微信管理后台检查清单

1. 登录企业微信管理后台
2. 应用管理 → 你的应用
3. 接口权限:
   ✅ "发送消息到聊天中" (sendChatMessage)
4. 可信域名:
   ✅ app.fmode.cn
5. 应用状态:
   ✅ 已启用

步骤5:检查用户身份

添加调试日志

console.log('👤 当前用户:', this.currentUser);
console.log('👤 用户ID:', this.currentUser?.id);
console.log('👤 用户姓名:', this.currentUser?.get('name'));

如果显示"未知"

  • 检查ngOnInit中是否正确加载了currentUser
  • 检查企业微信用户信息是否同步

🧪 测试方法

测试1:验证JSSDK注册

预期日志顺序

🔐 初始化企业微信SDK...
🔍 [registerCorpWithSuite] 开始注册JSSDK...
🔍 [registerCorpWithSuite] 平台检测: wxwork
🔍 [registerCorpWithSuite] API列表: [...]
🔍 [registerCorpWithSuite] 获取企业配置,CID: cDL6R1hgSi
🔍 [registerCorpWithSuite] 企业配置: {...}
🔍 [registerCorpWithSuite] 套件ID: dk2559ba758f33d8f5
🔍 [registerCorpWithSuite] 调用ww.register...
🔍 [registerCorpWithSuite] corpId: wpAs2qCQAAYofoUhMXBDS8L7z1YCXHYw
🔍 [registerCorpWithSuite] agentId: 1000017
🔍 [registerCorpWithSuite] suiteId: dk2559ba758f33d8f5
🔍 [registerCorpWithSuite] url: https://app.fmode.cn/...
🔍 [registerCorpWithSuite] 获取签名...
🔍 [registerCorpWithSuite] Ticket: ...
🔍 [registerCorpWithSuite] 签名生成完成: {...}
✅ [registerCorpWithSuite] AgentConfig注册成功!  ← 关键!
✅ 企业微信SDK初始化成功

如果15秒后看到超时警告

⚠️ [registerCorpWithSuite] 注册超时(15秒)

说明:回调未触发,需要检查入口和权限

测试2:验证消息发送

点击"发送消息"后的预期日志

📤 [发送消息] 开始发送...
🔍 [sendToWxwork] ========== 开始发送流程 ==========
🔍 [sendToWxwork] 当前URL: https://...
🔍 [sendToWxwork] 企业微信环境检测: true
🔍 [sendToWxwork] 检查SDK初始化状态...
✅ [sendToWxwork] SDK已初始化,跳过重复初始化
📧 准备发送消息到企业微信...
🔍 [sendChatMessage] ========== 开始发送消息 ==========
🔍 [sendChatMessage] 消息类型: text
🔍 [sendChatMessage] 开始注册JSSDK...
✅ [sendChatMessage] URL未变化,使用缓存的注册状态
🔍 [sendChatMessage] JSSDK注册结果: true
🔍 [sendChatMessage] 调用ww.sendChatMessage...
✅ [sendChatMessage] 消息发送成功!
✅ 文本消息已发送
✅ 所有消息已发送到企业微信

📝 使用示例

示例1:发送纯文本消息

// 在stage-delivery.component.ts中
await this.deliveryMessageService.createTextMessage(
  this.project.id!,
  'white_model',
  '老师,白模阶段完成,请查看确认',
  this.currentUser
);

效果:群聊中显示文本消息

示例2:发送文本+图片

await this.deliveryMessageService.createImageMessage(
  this.project.id!,
  'rendering',
  ['https://example.com/image1.jpg', 'https://example.com/image2.jpg'],
  '老师,渲染图已完成,请查看效果',
  this.currentUser
);

效果

  1. 先发送文本消息
  2. 然后逐个发送图文消息(带预览)

示例3:直接调用SDK发送(测试用)

// 直接调用WxworkSDKService(用于测试)
await this.wxworkSDKService.sendChatMessage({
  msgtype: 'text',
  text: {
    content: '测试消息'
  }
});

示例4:发送图文消息(带链接)

await this.wxworkSDKService.sendChatMessage({
  msgtype: 'news',
  news: {
    link: 'https://app.fmode.cn/survey/xxx',
    title: '项目需求调查问卷',
    desc: '请填写项目需求,我们会尽快为您设计',
    imgUrl: 'https://example.com/survey-cover.jpg'
  }
});

效果:群聊中显示卡片式图文消息,点击跳转到问卷链接


🔧 常见错误及解决方案

错误1:注册超时

错误信息

⚠️ [registerCorpWithSuite] 注册超时(15秒)

解决方案

  1. 重新从群聊侧边栏打开应用
  2. ✅ 检查企微管理后台的应用权限配置
  3. ✅ 确认应用已发布且启用
  4. ✅ 检查可信域名配置

错误2:Permission Denied

错误信息

❌ [sendChatMessage] 消息发送失败!
errMsg: "sendChatMessage:fail no permission"

解决方案

  1. 企微管理后台 → 应用管理 → 你的应用
  2. 接口权限 → 开启"发送消息到聊天中"
  3. 保存并等待5分钟生效

错误3:Not in Session

错误信息

errMsg: "sendChatMessage:fail not in session"

解决方案

  1. ❌ 不要从企微首页"工作台"打开
  2. 必须从群聊侧边栏打开
  3. 路径:群聊 → 右上角"..." → 应用

错误4:用户身份未知

现象:显示"未知"而不是"脑控徐福静"

解决方案

// 在ngOnInit中确保正确加载用户
if (!this.currentUser && this.cid) {
  console.log('👤 获取当前用户...');
  const wxwork = new WxworkAuth({ cid: this.cid, appId: 'project' });
  this.currentUser = await wxwork.currentProfile();
  
  console.log('👤 当前用户:', this.currentUser);
  console.log('👤 用户姓名:', this.currentUser?.get('name'));
}

🎯 核心要点

1. 入口必须正确

✅ 群聊侧边栏 → 应用
❌ 企微首页工作台
❌ 浏览器直接打开

2. URL必须包含wxwork路径

https://app.fmode.cn/dev/yss/#/wxwork/cDL6R1hgSi/project/...
                                     ↑必须包含这部分

3. SDK初始化顺序

1. 组件ngOnInit → wxworkSDKService.initialize()
2. 用户点击发送 → DeliveryMessageService.sendToWxwork()
3. 检查已初始化 → 跳过重复初始化
4. 调用sendChatMessage → 发送消息

4. 超时机制

  • 15秒内必须完成注册
  • 如果超时,返回false并提示原因
  • 不会一直等待导致UI卡死

📝 修复文件清单

1. wxwork-sdk.service.ts ✅

修改内容

  • 添加15秒超时机制
  • 增强调试日志(corpId、agentId、suiteId、url、签名详情)
  • clearTimeout在回调中清除定时器

2. delivery-message.service.ts ✅

修改内容

  • 检查SDK是否已初始化,避免重复初始化
  • 添加SDK状态检查日志

3. wxwork-sendmessage-debug-fix.md ✅

内容

  • 完整的问题分析
  • 详细的排查步骤
  • 使用示例和常见错误解决方案

🚀 部署后测试步骤

步骤1:构建和部署

ng build yss-project --base-href=/dev/yss/
.\deploy.ps1

步骤2:从群聊侧边栏打开

  1. 在企业微信中打开任意群聊
  2. 点击右上角"..."
  3. 选择你的应用
  4. 进入项目详情

步骤3:观察初始化日志

✅ 应该看到:AgentConfig注册成功!
❌ 如果看到:注册超时

步骤4:发送测试消息

  1. 进入"交付执行"阶段
  2. 点击"发送消息"
  3. 输入或选择消息内容
  4. 点击发送
  5. 检查群聊中是否显示消息

步骤5:验证用户身份

✅ 应该显示:脑控徐福静
❌ 如果显示:未知

修复完成时间:2025-11-30 13:45
修复类型:超时机制 + 重复初始化避免 + 调试增强
优先级:🔥 高
测试状态:待部署验证