企业微信开发日记 - 无备案域名的企业应用?

首先还是为了做一个企业微信授权扫码的应用,基于此,我先查阅资料,总结出 企业微信网页应用授权登录
为帆软添加相关应用,帆软同学可以通过这个方案,进行授权登录。
然后,我发现另外一批同学是没有在帆软的企业微信下面的。
如果想要为他们也创建相应的功能,那么需要有一个备案后的域名。
然而,汇才同学是没有这个域名的。导致项目陷入僵局。基于此,我开始找方案。

由于应用分为自建/第三方。那么自建应用需要备案域名,是否第三方不需要呢?第三方是不是只需要自己的备案域名就够了呢?
完全合情合理的猜想。于是,我开始探索第三方应用的开发之路。

个人开发

首页 - 企业微信开发者中心

说明

回调配置

回调配置 - 文档 - 企业微信开发者中心
二:如何接收企业微信回调
指令回调

文档中有相对详细的说明,我这里提供一个 指令回调 的案例

export async function POST(req: NextRequest) {  
  try {  
    const params = req.nextUrl.searchParams;  
    // 在应用详情页找到对应的token  
    const msg_signature = params.get("msg_signature") ?? "";  
    const timestamp = params.get("timestamp") ?? "";  
    const nonce = params.get("nonce") ?? "";  
    const echostr = params.get("echostr") ?? "";  
    // 重新计算签名  
    const signature = crypto.getSignature(  
      SERVICE.token,  
      timestamp,  
      nonce,  
      echostr,  
    );  
  
    const xmlString = await req.text();  
    const parser = new XMLParser();  
    const result = parser.parse(xmlString);  
    const encryptJson = result?.xml?.Encrypt;  
    if (encryptJson) {  
      // 将加密消息体进行解密,解密后仍旧是 xml 字符串  
      // 把解密后 xml 消息体字符串,解析成 json      const callbackDataBody = crypto.decrypt(SERVICE.aeskey, encryptJson);  
      const message = callbackDataBody?.message;  
      if (message) {  
        const messageJson = parser.parse(message);  
        const infoType = messageJson?.xml?.InfoType  
        if (infoType) {  
          if (infoType === "suite_ticket") {  
            const ticketData = messageJson?.xml?.SuiteTicket;  
            if (ticketData) {  
              SERVICE.suite_ticket = ticketData;  
            }  
          }  
          if (infoType === "create_auth") {  
            const authCode = messageJson?.xml?.AuthCode;  
            if (authCode) {  
              SERVICE.authCode = authCode;  
            }  
          }  
        }  
      }  
    }  
  } catch (e) {}  
  return new NextResponse("success");  
}

这个方法,主要是针对 指令回调 的不同类型 infoType,做了不同的逻辑存储。
从而保证相关的回调信息能够被捕获到。

网页授权

个人应用是不支持网页登录授权的,只支持 oauth 授权

所以参考 构造网页授权链接 - 文档 - 企业微信开发者中心
并设置相关的 ip 白名单

515

既可以完成 ip 授权。

问题

然而,第三方(包括个人/服务商)开发的应用获取的成员 id,是加密的。见 代开发应用安全性升级 - 接口文档 - 企业微信开发者中心
导致成员 id 完全无法和成员具体的值匹配上。

并且,个人开发应用的权限,只有成员基本数据权限,无法访问 通讯录
所以个人开发的应用,天花板就到这里。

服务商应用

服务商后台

服务商应用,基本的说明和 个人应用 一致。因此就不额外讲述。
讲一下和个人应用的区别

区别

  1. 调用需要 API 使用权限
    1. 500
  2. 可以设置网页登录授权,但需要验证后的域名
    1. 525

最重要的是,服务商应用获取的也是 加密 后的 userId 没啥用。

总结

  1. 给企业微信备案,服务器用两个,或者后台可以根据域名访问不一样的逻辑
  2. 给企业微信设置关联主体,但帆软和汇才属于两个公司。
    1. 525
  3. 使用微信来进行绑定,见 微信扫码登录
    1. 限制也很多
  4. 不考虑实名认证,或者通过给授权码的方式,进行授权认证