wxwork-appid-fix.md 5.7 KB

企业微信消息发送修复 - AppID配置问题

🔥 问题描述

症状:点击"发送消息"后,消息没有出现在企业微信群聊中

日志表现

✅ [sendToWxwork] SDK初始化完成
📧 准备发送消息到企业微信...
  CID: cDL6R1hgSi
  AppID: project  ← 🔥 关键:这里是project而不是crm
  文本内容: 老师我这里硬装模型做好了...
🔍 [sendChatMessage] ========== 开始发送消息 ==========
🔍 [sendChatMessage] 消息类型: text

(之后没有成功或失败的日志)

🔍 根本原因

1. URL路径解析

当前URL

https://app.fmode.cn/wxwork/cDL6R1hgSi/project/project-detail/iKvYck89zE
                           ↑           ↑       ↑
                          CID       AppID   路由路径

代码解析逻辑 (delivery-message.service.ts line 206-207):

const cid = urlParts[wxworkIndex + 1];     // cDL6R1hgSi
const appId = urlParts[wxworkIndex + 2];   // project ← 🔥 问题在这

2. suiteMap配置缺失

原始配置 (wxwork-sdk.service.ts line 32-36):

private suiteMap: any = {
  'crm': {
    suiteId: 'dk2559ba758f33d8f5'
  }
  // ❌ 缺少'project'的配置
};

3. JSSDK注册失败

注册流程 (wxwork-sdk.service.ts line 83):

const suiteId = this.suiteMap[this.appId]?.suiteId;
// 当appId='project'时,suiteId = undefined

结果

  • ww.register() 被调用时 suiteId: undefined
  • JSSDK注册失败,但没有明确的错误提示
  • sendChatMessage 调用被忽略或失败,没有回调

✅ 解决方案

修复代码

文件src/modules/project/services/wxwork-sdk.service.ts

修改内容:添加"project"的suiteId配置

// 应用套件映射
private suiteMap: any = {
  'crm': {
    suiteId: 'dk2559ba758f33d8f5'
  },
  'project': {  // 🔥 添加project应用的配置(使用相同的suiteId)
    suiteId: 'dk2559ba758f33d8f5'
  }
};

原因

  • 企业微信套件是公司级别的,同一个公司的不同应用使用相同的suiteId
  • projectcrm都是映三色公司的应用,共享同一个套件配置

🎯 修复后的预期日志

✅ [sendToWxwork] SDK初始化完成
📧 准备发送消息到企业微信...
  CID: cDL6R1hgSi
  AppID: project
  文本内容: 老师我这里硬装模型做好了...
🔍 [sendChatMessage] ========== 开始发送消息 ==========
🔍 [sendChatMessage] 消息类型: text
🔍 [sendChatMessage] 开始注册JSSDK...
🔍 [registerCorpWithSuite] 套件ID: dk2559ba758f33d8f5  ← ✅ 有值了
🔍 [registerCorpWithSuite] 调用ww.register...
✅ [registerCorpWithSuite] AgentConfig注册成功!
🔍 [sendChatMessage] JSSDK注册结果: true
🔍 [sendChatMessage] 调用ww.sendChatMessage...
✅ [sendChatMessage] 消息发送成功!  ← ✅ 成功!
✅ 文本消息已发送
✅ 所有消息已发送到企业微信

📋 测试步骤

1. 部署修复

# 构建项目
ng build yss-project --base-href=/dev/yss/

# 部署
.\deploy.ps1

2. 清除缓存

  • 刷新企业微信页面(Ctrl+R)
  • 或完全关闭企业微信客户端重新打开

3. 发送测试消息

  1. 打开项目详情页
  2. 进入交付执行阶段
  3. 点击空间的"刷新"按钮
  4. 在弹窗中输入消息或选择预设话术
  5. 点击"发送"按钮

4. 查看日志

打开浏览器控制台(F12),查看:

  • 套件ID: dk2559ba758f33d8f5
  • AgentConfig注册成功
  • 消息发送成功

5. 验证结果

在企业微信群聊中应该看到:

  • 文本消息(如果有)
  • 图文卡片(如果有图片)

🔍 为什么之前需求阶段可能没遇到这个问题?

可能的原因:

  1. URL路径不同

    • 需求阶段可能从 /wxwork/cDL6R1hgSi/crm/... 访问
    • 交付阶段从 /wxwork/cDL6R1hgSi/project/... 访问
  2. 使用不同的SDK方法

    • 需求阶段可能没有直接使用 WxworkSDKService
    • 或者使用了不同的初始化方式

🛡️ 防止类似问题

建议1:添加AppID验证

文件wxwork-sdk.service.ts

async initialize(cid: string, appId: string): Promise<void> {
  this.cid = cid;
  this.appId = appId;
  
  // 🔥 验证appId是否在suiteMap中
  if (!this.suiteMap[appId]) {
    console.error(`❌ 未知的AppID: ${appId}`);
    console.error(`❌ 可用的AppID:`, Object.keys(this.suiteMap));
    throw new Error(`未配置的AppID: ${appId}`);
  }
  
  this.wecorp = new WxworkCorp(cid);
  await this.registerCorpWithSuite();
}

建议2:添加fallback机制

文件delivery-message.service.ts

// 从URL获取cid和appId
const cid = urlParts[wxworkIndex + 1];
let appId = urlParts[wxworkIndex + 2] || 'crm';

// 🔥 如果appId不在suiteMap中,fallback到'crm'
const validAppIds = ['crm', 'project'];
if (!validAppIds.includes(appId)) {
  console.warn(`⚠️ 未知AppID: ${appId}, 使用默认值: crm`);
  appId = 'crm';
}

📚 相关文件

文件 作用 修改内容
wxwork-sdk.service.ts 企业微信SDK封装 添加"project"的suiteId配置
delivery-message.service.ts 交付消息服务 从URL解析appId(未修改)
stage-delivery.component.ts 交付执行组件 调用消息发送服务(未修改)

✅ 总结

问题:URL中的AppID是"project",但suiteMap只配置了"crm"

修复:在suiteMap中添加"project"配置,使用相同的suiteId

结果:消息可以正常发送到企业微信群聊


修复时间:2025-11-29
修复人员:开发团队
文档版本:v1.0