理解第三方应用开发的流程与概念
开发者,你好,欢迎来到企业微信第三方应用开发教程***课。
企业微信第三方应用与服务商企业、第三方应用、客户企业、客户企业员工多个角色都有关联。从服务商企业开发应用,到企业客户安装使用应用,整个流程的链路环节较长,并且涉及到较多的概念。
本教程将带领开发者一起,通过一个***小应用开发的基本流程讲解,帮助开发者理解与应用开发相关的基本概念。
通过本节教程,开发者将了解:
- 第三方应用开发的基本流程
- 第三方应用开发的基本概念
应用接入流程
从第三方应用整个项目周期的接入流程来看,主要分成两个阶段:
一、应用开发阶段
- 创建应用,配置基本信息
- 开发应用,测试应用逻辑
- 上线应用,提交审核信息
二、应用推广阶段
- 服务商自有渠道推广
- 企业微信应用市场推广
作为第三方应用的开发人员,主要的精力会聚焦应用的开发阶段,即从应用的创建、开发测试,再到应用的上线的这个流程。
为了帮助开发者对第三方应用开发的基本模式有一个清晰的理解,本教程将从开发人员开发应用的实际开发过程来讲解这个流程,并且结合每个阶段的工作,来引出当前这个阶段所需要和必须理解的基本概念,尽可能减少理解的成本。
基本流程
第三方应用开发的核心模式大致分为四阶段:
一、前期应用准备
创建应用
填写应用的名称、描述、图标等基本信息;选择应用需要使用的基本权限,比如通讯录权限、组织架构权限和企业客户权限等;填写应用主页、可信域名、回调服务等开发信息。
获取 suite_id 与 suite_scret
应用创建成功后,在应用详情页的基本信息,可以查看该应用的***身份标识 suite_id 和 对应的调用身份密钥 suite_secret 等,这些是用于后续应用授权等操作的重要参数,须妥善保管。
请参考开发教程 一:如何创建第三方应用

二、基础环境搭建
获取第三方应用凭证
企业微信服务会向第三方应用服务器定时推送该第三方应用的 `suite_ticket,在成功接收到 suite_ticket 后,连同应用创建时得到的 suite_id , suite_secret 作为参数,调用 获取第三方应用凭证接口 得到第三方应用凭证 suite_access_token。
suite_access_token 在应用授权阶段非常重要,用于获取第 三方应用的预授权码,获取授权企业信息等。
请参考开发教程 二:如何接收企业微信回调与 三:获取第三方应用凭证。

三、企业授权安装
获取临时授权码
企业管理员通过服务商官网的授权链接,或企业微信官方应用市场,授权安装第三方应用 时,将得到该企业对应于该第三方应用的 临时授权码 auth_code。
请参考开发教程 四:如何将应用安装到企业工作台
获取***授权码
第三方应用服务后台通过使用 auth_code 与上一步得到的 suite_access_token 作为参数, 调用 获取***授权码 接口,便能够获得企业***授权码 permanent_code。
permanent_code 是记录企业授权第三方应用的***凭证,该授权码***有效,须妥善保管。
请参考开发教程 四:如何将应用安装到企业工作台

四、调用企业接口
获取登录用户身份
企业授权安装第三方应用后,企业员工可通过企业微信工作台打开该应用。在打开应用页面时使用 网页授权链接 的重定向,得到一个可以换取当前访问用户身份的 code。通过 code 与 suite_access_token 调用 获取访问用户身份 接口即可得到当前访问用户的 user_id 等基本信息。
请参考开发教程 五:如何获取登录用户信息
获取企业凭证
第三方应用服务在调用企业业务接口前,比如通讯录管理、向成员推送应用消息等企业业务场景,需要先通过 获取企业凭证 接口将 permanent_code 换取成企业凭证 access_token。
access_token 是用于操作授权企业相关接口的统一凭证,所有的企业数据接口都依赖这个凭证,须妥善保管。安全起见 access_token 有一定的有效期,第三方应用服务在使用前,须确保当前 access_token 有效。
调用企业接口
在获得 access_token 后,可以结合企业内的业务逻辑,进行通讯录管理、消息推送、审批单据等能力接口的调用。
请参考开发教程 六:如何向成员发送消息 与 七:如何提交上线第三方应用

所以,企业微信第三方应用开发的基本流程大致如图所示,在这个简化的流程中,目前仅需要关注几个核心的概念即可。

基本概念
虽然与第三方应用相关的概念较多,本教程中仅列举出开发第三方应用过程***常见也***必须的一些概念:
第三方应用相关
- suite_id
第三方应用 ID,是每一个第三方应用的***身份标识。
- suite_secret
第三方应用密钥,是第三方应用对应的调用身份密钥,与 suite_id 配套使用。
- suite_ticket
第三方应用票据,与 suite_id、suite_secret 配套使用,用于获取suite_access_token。
- suite_access_token
第三方应用凭证,是通过 suite_id、suite_secret 、suite_ticket 换取而来的,代表第三方应用的身份的凭证,用于获取第三方应用的预授权码,获取授权企业信息等。
企业授权相关
- pre_auth_code
预授权码,是用于企业授权时的第三方服务商安全验证。预授权码仅用于企业从服务商网站链接授权安装的场景,企业进行授权后,第三方应用后台将收到临时授权码。
- auth_code
临时授权码,是企业对第三方应用进行授权时,第三方应用服务收到的一个临时授权的标记,收到临时授权码之后应该尽快换取成***授权码 permanent_code。
- permanent_code
企业***授权码,是记录企业授权第三方应用的***凭证,该授权码***有效。通过 auth_code 和 suite_access_token 换取得到。
企业相关
- corp_id
企业ID,每个企业都拥有***的企业身份标记。
- access_token
企业凭证,access_token是企业后台去企业微信的后台获取信息时的重要票据,由corpid和secret产生。所有接口在通信时都需要携带此信息用于验证接口的访问权限。
成员相关
- user_id
员工ID,企业员工在企业内的***身份标记。
结语
在本节教程中,我们了解了企业微信第三方应用的开发流程和基本的概念。在下一节教程,我们将开始真正的实操,创建一个第三方应用,并且配置基本信息,为开发***个应用做准备。
一:如何创建第三方应用
在上一节教程中,我们了解了企业微信第三方应用开发的基本流程与概念,本节课程,我们将迈出开发工作的***步,创建一个第三方应用。
通过本节教程,开发者将了解:
- 如何创建第三方应用,并配置基本的信息
- 怎样得到第三方应用的 suite_id 和 suite_secret
准备工作
- 请确保已经注册成为了企业微信服务商企业;如果还没有,请参考企业微信应用接入指引的 成为企业微信的服务商 部分。
登录服务商后台
登录 服务商后台,进入 【应用管理】 - 【标准应用开发】 - 【网页应用】 ,点击 【创建应用】。

配置基础信息
应用基础信息主要是在企业微信应用市场的分类展示,以及企业客户安装以后工作台的展示。
请根据实际需要选择应用的基本类型,填写 Logo、名称、简介等基本信息,选择应用所对应的分类以及目标行业。
关于应用基本信息填写的标准,请参考企业微信应用接入指引的 基本信息填写 部分。

配置应用权限
根据应用实际使用的需要,选择是否需要企业授权相应的企业应用权限。当启用某一项权限后,企业管理员在授权安装应用时,将看到该权限的授权说明,请根据实际需要进行选择和填写。
关于应用权限信息填写的标准,请参考企业微信应用接入指引的 基本信息填写 部分。

配置开发信息
配置完应用权限信息后,需要配置应用开发的详细信息。
应用主页用于成员从工作台点击应用时打开的 URL;为了使支持应用内 Oauth 认证登录或者使用 JSSDK,须要配置对应的可信域名。
指令回调地址,是该第三方应用用来接收企业微信应用授权变更事件(应用添加、删除、修改)的***地址。
数据回调地址,是该第三方应用用来接收托管企业微信应用的用户消息、进入应用事件、通讯录变更事件的***地址。
Token、EncodingAESKey 点击随机获取即可。
关于指令回调地址、数据回调地址的验证和配置,在下节课程中会详细介绍,在本教程中可以先暂时根据习惯填写保存即可,后续可以再次编辑和修改。
关于应用配置信息填写的标准,请参考企业微信应用接入指引的 使用配置填写 部分。

获取 suite_id / suite_secret
填写完应用的基础信息、应用权限、开发信息后,这个应用便创建成功了,随后页面将跳转到对应的应用详情页面。

在应用的【基本信息】这一栏,可以看到当前应用的 suite_id 和 suite_secret 信息,这两个数据在后续的流程中会多次用到,请妥善保管。
但是在应用的【回调配置】这一栏,页面提示 数据回调URL 和 指令回调URL “服务商未响应请求,将无法获取用户事件回调”。

因为我们当前设置的 URL 还并没有正确对企业微信的请求进行正确的响应,在下一节,我们将着手开发服务端的逻辑,了解第三方应用的回调服务是如何进行工作的。
二:如何接收企业微信回调
在上一节教程中,我们创建了一个第三方应用,得到了对应的 suite_id/ suite_secret 信息,但是并没有对数据回调和接口回调进行响应,网页提示验证不通过。
在本节课程中,我们将完善服务端的逻辑,接收企业微信的回调,使回调 URL 的配置能够通过验证。
通过本节教程,开发者将了解:
- 如何接收企业微信的指令和数据回调
- 如何对企业微信的回调进行验证
- 如何实现第三方应用的回调服务
准备工作
在开始本教程内容前,开发者需要做如下准备:
- 已创建第三方应用,并在第三方【应用详情】-【回调配置】找到对应的 Token 和 EncodingAESKey,可参考 一:如何创建第三方应用。
- 在回调的实现逻辑中需要进行加解密计算,企业微信已经提供了 C++ Python PHP Java Go C# Node.js 等语言版本的加解密库,并且均提供了解密、加密、验证URL三个接口,开发者可以根据开发需要 下载加解密库。
- 根据实际开发需要,搭建内网穿透服务。
本节教程将以 Node.js 作为代码语言示例,讲解对应的操作流程。
回调的实现类型
在配置应用的开发信息时,我们已经知道了第三方应用的回调配置有数据回调和指令回调两种。
数据回调,用于接收托管企业微信应用的用户消息、进入应用事件、通讯录变更事件。
指令回调,用于接收应用授权变更事件(应用添加、删除、修改)以及ticket参数,ticket说明详API接口说明。
对于数据回调和指令回调的两个 URL ,在服务端的实现时,都必须同时支持 HttpGet 以及 HttpPost两种能力。
1、Get 类型
仅用于在应用创建配置应用信息时的验证,企业微信服务端会向回调URL发起一个 Get 请求,当该回调URL按照约定进行了响应后,表明第三方服务具备解析企业微信推送消息的能力。
2、Post 类型
用于实际的业务请求,比如应用菜单的点击事件,用户消息等。当有回调的行为发生时,企业微信服务端会向该回调URL发起一个 Post 请求,同时数据会已加密的形式推送到该回调 URL,第三方服务商接受信息、解密信息,处理业务逻辑,并且按照约定进行响应即可。
回调内网穿透
回调服务的 URL 是一个公网的 URL,如果在实际进行应用开发时,代码和服务是部署在本地机器的话,那么需要搭建一个内网穿透服务,要让企业微信服务器发来的数据回调和指令回调,能够到达本地服务。
目前社区有许多较成熟的内网穿透解决方案,开发者可根据实际需要进行选择。企业微信开发者中心也会在近期的版本中,推出企业微信开发者官方的内网穿透工具。
Get 回调实现
根据创建第三方应用时填写的回调URL,假设为 http://myapp.com/callback/command
,我们将来实现这个URL的 get 请求路由,并且按照要求响应。
1、实现 get 路由
数据回调URL 和 指令回调URL 均需要支持 HttpGet 形式的请求回调。
const express = require('express');const router = express.Router();// get方式 用于验证router.get('/callback/data', validateCallback);router.get('/callback/command', validateCallback);
2、解析回调参数
企业微信回调服务会通过 HttpGet 的形式请求回调 URL,并将 msg_signature、timestamp、nonce、echostr 以 query 参数的形式传递过来。我们在回调URL的逻辑中,解析出这些参数。
// 从 query 中获取相关参数const { msg_signature, timestamp, nonce, echostr } = req.query;
3、计算签名并校验
根据在上一步获取的参数timestamp、nonce、echostr,连同 Token一起,使用加解密库的加密函数重新加密计算签名。
// 引入官方的加解密库const crypto = require('@wecom/crypto');// 在应用详情页找到对应的tokenconst token = '';// 重新计算签名const signature = crypto.getSignature(token, timestamp, nonce, echostr);console.log('signature', signature);
4、解密回调的加密串,并将内容返回
通过 EncodingAESKey 和解析出来的 echostr 作为参数,使用加解密库的解密函数,解密出对应的 message,并立即以明文的形式直接返回。
// 校验签名是否正确if (signature === msg_signature) {console.info('签名验证成功')// 在应用详情页找到对应的EncodingAESKeyconst aeskey = '';// 如果签名校验正确,解密 messageconst { message } = crypto.decrypt(aeskey, echostr);console.log('message', message);// 返回 message 信息res.send(message);}
到这里,我们已经完成了回调URL的 get 实现,在【应用详情】-【回调配置】重新点击编辑保存,便可以重新触发指令回调URL和数据回调URL的验证,确保网页不再提示“服务商未响应请求,将无法获取用户事件回调”。

想要了解更多 Get 回调的实现,可以参考 支持http-get请求验证url有效性。
Post 回调实现
1、实现 post 路由
数据回调URL 和 指令回调URL 均需要支持 HttpPost 形式的请求回调。
const express = require('express');const router = express.Router();// post方式 用于授权、业务数据回调router.post('/callback/command', function (req, res, next) {});
2、解析参数,并校验签名
企业微信回调服务会通过 HttpPost 的形式请求该回调URL,并将 msg_signature、timestamp、nonce 以 query 参数的形式传递过来,像 HttpGet 形式一样,需要先对参数进行解析,并且校验签名有效。
获取的参数 timestamp、nonce、echostr,连同 Token一起,使用加解密库的加密函数重新加密计算签名。
// 引入官方的加解密库const crypto = require('@wecom/crypto');// 从 query 中获取相关参数const { msg_signature, timestamp, nonce } = req.query;// 在应用详情页找到对应的tokenconst token = '';// 重新计算签名const signature = crypto.getSignature(token, timestamp, nonce, echostr);console.log('signature', signature);
3、解密密文消息
在 HttpPost 回调中,密文内容是以 XML 字符串的形式放在 RawBody 中,通过对该 XML 字符的解析读取出对应的加密消息 Encrypt。
通过 EncodingAESKey 和加密消息 Encrypt 作为参数,使用加解密库的解密函数,解密出对应的 message。
而 message 仍然是一个 XML 字符串格式,再次对该 XML 解析,便可以得到本次 HttpPost 回调实际的数据信息。
// 解析 xml 的字符串内容let wholeXML = await getRawBody(req, {length: req.headers['content-length'],limit: '1mb',encoding: 'utf-8'});// 将 xml 解析成 jsonlet formatJson = await parseXML(wholeXML);// 得到加密消息体let encrypt = formatJson.Encrypt;// 在应用详情页找到对应的EncodingAESKeyconst aeskey = '';// 将加密消息体进行解密,解密后仍旧是 xml 字符串let messageXML = crypto.decrypt(aeskey, encrypt);// 把解密后 xml 消息体字符串,解析成 jsonlet callbackDataBody = await parseXML(messageXML.message);console.log('CallbackData', callbackDataBody);
4、响应本次请求
不同的业务回调要求返回不同内容,在本节中我们直接返回 success
字符串即可。
// 响应返回res.send('success');
想要了解企业微信回调设置的更详细信息,可以参考文档 回调配置。
到这里,我们已经完成了第三方应用的 HttpPost 回调配置逻辑框架,在下一节教程,我们就可以利用这个指令回调实现 suite_ticket 的接收,从而获得 suite_access_token。
三:如何获取第三方应用凭证
在上一节教程中,我们对完成了回调 URL 两种形式的实现。在本节教程,我们将使用指令回调 URL 的 HttpPost 回调方式,来接收 suite_ticket,获取 suite_access_token。
通过本节教程,开发者将了解:
- 如何使用指令回调 URL 接收 suite_ticket
- 如何获取第三方应用凭证 suite_access_token
准备工作
在开始本教程内容前,开发者需要做如下准备:
- 已创建第三方应用,在第三方【应用详情】-【基本信息】找到对应的 suite_id 和 suite_secret 信息,可参考 一:如何创建第三方应用
- 确保指令回调 URL 能够正确接收回调,并正确响应,可参考 二:如何接收企业微信回调
接收 suite_ticket
企业微信服务器会定时(每十分钟)向指令回调 URL 推送 suite_ticket,在指令回调的后台逻辑中解密消息体即可得到对应的 InfoType 和 SuiteTicket 。
不同类型的指令回调会通过不同的 InfoType 进行区分,在每次解密得到 suite_ticket 后,应在服务端临时缓存起来。
// 读取对应的回调 typeconst info_type = callbackDataBody.InfoType;console.log('InfoType', info_type);switch (info_type) {// 推送suite_ticketcase 'suite_ticket':console.log('SuiteTicket', callbackDataBody.SuiteTicket);// 将 suite_ticket 缓存起来Tool.SaveSuiteTicket(callbackDataBody.SuiteTicket);break;default:break;}
关于 suite_ticket 的接收与使用更详细的内容,请参考 推送 suite_ticket。
获取 suite_access_token
在成功接受并且缓存 suite_ticket 之后,我们可以主动来获取 suite_access_token。获取suite_access_token时,需要 suite_id suite_secret suite_ticket 作为参数。
const axios = require('axios');// 读取先前缓存的 suite_ticketlet suite_ticket = Tool.GetSuiteTicket();// 【应用详情】-【回调配置】对应的 suite_id 和 suite_secret 信息const suite_id = '';const suite_secret = '';// 发起请求获取 suite_access_tokenconst {data} = await axios.post('https://testapi.work.weixin.qq.com/cgi-bin/service/get_suite_token', {suite_id,suite_secret,suite_ticket,});const{ suite_access_token,expires_in } = data;if (suite_access_token) {console.log('获取成功',suite_access_token);// 将 suite_access_token 缓存起来Tool.SaveSuiteAccessToken(suite_access_token);}else{console.error('获取失败');}
通过本接口获取的 suite_access_token 有效期为 2 小时,开发者需要进行缓存,不可频繁获取。
关于获取 suite_access_token 更详细的内容,请参考 获取第三方凭证 。
结语
在本节教程中,我们通过接收 suite_ticket ,获取了 suite_access_token,在下节课程中,我们将演示如何进行企业授权安装应用,以及如何通过 suite_access_token 获取企业的***授权。
四:如何将应用安装到企业工作台
在上节教程中,我们通过指令回调接收来自企业微信 suite_ticket 的推送,并且主动获取了该第三方应用的 suite_access_token。在本节教程中,我们把第三方应用安装到测试企业的工作台,并进一步获取企业的***授权码。
通过本节教程,开发者将了解:
- 如何将应用安装到测试企业的工作台
- 如何获取测试企业的***授权码
准备工作
在开始本教程内容前,开发者需要做如下准备:
- 已创建第三方应用,在第三方【应用详情】-【回调配置】找到对应的 suite_id 和 suite_secret 信息,请参考 一:如何创建第三方应用
- 准备一个用于安装测试应用的测试企业,且具备管理员权限;如果还没有测试企业,请在 企业微信官网 进行注册
- 确保指令回调 URL 能够正确接收回调,并正确响应,可参考 二:如何接收企业微信回调
安装测试应用
客户企业授权安装第三方应用有两种发起方式:
- 通过服务商网站的授权链接安装
- 通过企业微信应用市场直接安装
服务商网站的授权链接方式需要应用已经上线才可实施,本教程仅讲解如何测试应用市场安装的方式。
企业微信提供两种安装测试途径:
- 从服务商后台安装测试:服务商可在本地应用中对已创建的应用进行安装测试
- 自行构造测试授权链接:调用设置授权配置接口,构造测试授权链接进行测试授权
在【应用详情】页面,点击【安装测试】,确保指令回调 URL 和数据回调URL 均已通过验证。

在【安装测试】中点击【添加企业安装测试】。安装测试之前,请先确保当前测试已经加入测试企业列表中。

在【测试安装】确认页面,点击【确认】

使用测试企业的管理员企业微信,扫码【管理员授权】

确认【可见范围】、【授权应用权限】等安装信息

接收临时授权码
当【点击同意授权并添加】按钮后,企业微信服务器会已指令回调的形式,通知第三方应用后台企业已授权成功。授权成功回调指令的类型 InfoType 为 create_auth,额外附带了本次授权的临时授权信息。
// 读取对应的回调 typeconst info_type = callbackDataBody.InfoType;switch (info_type) {// 企业授权成功的回调case 'create_auth':console.log('AuthCode', callbackDataBody.AuthCode);// 临时授权码缓存起来Tool.SaveAuthCode(callbackDataBody.AuthCode);break;default:break;}res.send('success');
第三方应用服务后台必须在 1000ms 内完成响应,以保证用户安装应用的体验。临时授权码10分钟后会失效,建议在接收到此事件时,先记录下 AuthCode,并立即回应企业微信,之后再做相关业务的处理。
关于企业授权相关的详细信息,请参考 企业授权应用;关于授权通知更多的内容,请参考 授权通知事件。
获取***授权码
在获得临时授权码 auth_code 后,须要尽快换取成对应的企业***授权码。后续可以通过***授权码获取企业 access_token,进而调用企业微信相关API为授权企业提供服务。
获取***授权码需要 suite_access_token 和 auth_code,关于如何获得 suite_access_token 请参考 三:如何获取第三方应用凭证 内容。
// 从缓存中读取 suite_access_tokenlet suite_access_token = Tool.GetSuiteAccessToken(); // 从缓存中读取 临时授权码 auth_codelet auth_code = Tool.GetAuthCode(); const { data } = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token=${suite_access_token}`, {auth_code});const {permanent_code,auth_corp_info} = data;if(permanent_code){console.log('获取***授权码成功',permanent_code);// 将企业信息与对应的***授权码保存起来Tool.SavePermanentCode(auth_corp_info.corpid,permanent_code);return permanent_code;}else{console.error('获取***授权码失败',data);}
关于获取***授权码接口的详细信息,请参考 获取***授权码。
结语
到这里,我们已经完成了企业授权安装的测试,我们的第三方应用已经安装到了企业的工作台。通过授权通知获得了临时授权码,***通过调用接口得到了***授权码 permanent_code 信息,有了企业的***授权码,便可以进行企业接口的调用了。

在下节教程中,我们将了解当企业成员通过工作台入口打开了企业应用时,怎样通过网页授权获取登录用户基本信息。
五:如何获取登录用户信息
在上节教程中,我们通过管理员的授权安装,把第三方应用安装到了测试企业,并且企业员工能通过工作台入口打开应用。在本节教程中,我们将在企业员工打开的应用主页时,获取当前用户的身份信息。
通过本节教程,开发者将了解:
- 如何通过工作台应用主页入口实现用户登录授权
- 如何获取访问用户的身份信息
准备工作
在开始本教程内容前,开发者需要做如下准备:
基本流程
企业微信提供了 OAuth 的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。在开始前,我们需要花一点点时间了解下网页授权大致的流程。

- 第三方应用服务后台,根据授权约定构造包含了 suite_id、授权重定向 URL 的授权链接
- 员工从工作台点击应用主页,应用主页向授权链接进行跳转
- 企业微信服务验证授权链接数据的有效性,并且向重定向 URL 跳转,同时带上成员授权code
- 第三方应用服务后台,在重定向 URL 的后台逻辑中,解析 code 并调用接口获取当前用户信息。
关于 OAuth 的详细内容,请参考网页授权登录。
在我们当前的教程中,我们有几个 URL 需要注意和区分:
- 应用主页 URL
从工作台点击打开的页面 URL ,在创建应用是配置填写的,用来向授权链接 URL 跳转。 - 重定向 URL
当用户授权成功后,会带着成员授权 code 跳转的URL,用来接收 code 并获取成员身份。 - 授权链接 URL
企业微信域名下的 URL,包含了suite_id、重定向URL 等信息,当企业微信服务参数验证成功后,会跳转到重定向 URL。
构造授权链接
在【应用详情】-【应用主页】配置的主页 URL 为 http://myapp.com/login
,对于这个 URL 访问的实现构造授权链接,并跳转的逻辑。
// 第三方应用主页 URLrouter.get('/login', function(req, res, next) {// 重定向 URLlet redirect_uri = encodeURI('http://myapp.com/app'); // 【应用详情】-【回调配置】对应的 suite_id 和 suite_secret 信息const suite_id = ''; // 授权链接 URLlet login_url =`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${suite_id}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`// 向授权链接 URL 跳转res.redirect(login_url);});
注意,重定向 URL 必须在可信域名下,关于可信域名的更多信息,请参考 网页授权的可信域名。关于授权链接更多的内容,请参考 构造网页授权链接。
解析用户 code
企业成员从工作台点击应用,打开应用主页 URL,向授权链接 URL 跳转;企业微信对授权链接上的信息进行校验之后,会重定向 URL 跳转,并以 query 的形式带上当前访问成员的 code 信息。
在上一步,我们定义了重定向 URL 为 http://myapp.com/app
,在这个 URL 的访问里我们解析出 code 参数。
// 重定向 URL router.get('/app',async function(req, res, next) {// 从 query 参数中解析 codelet {code} = req.query;// 展示登录后的页面res.render('helloworld');});
获取访问用户身份
在解析出成员授权 code 之后,使用 suite_access_token ,调用 获取访问用户身份 接口,即可得到访问用户的身份信息。
通常在获取到用户身份之后,可以把身份信息写入 session ,供后续访问使用。
// 重定向 URL router.get('/app',async function(req, res, next) {// 从query 参数中解析 codelet {code} = req.query;// 从缓存中读取 suite_access_tokenlet suite_access_token = Tool.GetSuiteAccessToken();// 获取访问用户信息let {data:user_data} = await axios.get('https://qyapi.weixin.qq.com/cgi-bin/service/getuserinfo3rd',{params:{suite_access_token,code }});// 将登录态写入 sessionreq.session.user = user_data;// 展示登录后的页面res.render('helloworld', user_data);});
在前端页面中展示访问用户的基本信息:
Hello World
Hello World!
Your user_id is <%= UserId %>
在这一步,可以获取到当前访问用户的基本信息 user_id,如果想要获取用户更详细的信息,请参考 获取访问用户敏感信息。第三方应用不会返回用户的真实 name,使用 user_id 代替name 返回,第三方页面需要通过 通讯录展示组件 来展示名字。

在本节教程中,我们通过网页登录授权,在企业成员打开应用主页时获得了当前访问成员的身份信息。下节课程,我们将开始调用企业的开放接口,向企业员工推送应用消息。
六:如何向成员发送消息
在上节教程中,我们通过网页登录授权,在企业成员打开应用主页时获得了当前访问成员的身份信息。本节课程,我们将开始调用企业的开放接口,通过当前访问成员的 user_id 向企业员工推送一条 “Hello World” 的应用消息。
通过本节教程,开发者将了解:
- 如何通过企业***授权码获取企业凭证
- 如何调用应用消息接口,向成员推送消息
准备工作
在开始本教程内容前,开发者需要做如下准备:
换取企业凭证
第三方服务商在取得企业的***授权码后,通过此接口可以获取到企业的 access_token。获取 access_token是调用企业微信 API 接口的***步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于 access_token 来鉴权调用者身份。
获取企业凭证需要 suite_access_token ,关于如何获得 suite_access_token 请参考 三:如何获取第三方应用凭证 内容。
// 从缓存中读取 permanant_codelet permanent_code = Tool.GetPermanentCode(corp_id);// 从缓存中读取 suite_access_tokenlet suite_access_token = Tool.GetSuiteAccessToken();// 获取企业授权let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=${suite_access_token}`,{permanent_code,auth_corpid});let {access_token} = data;if(access_token){console.log('获取 corp_access_token 成功',access_token);// 缓存当前企业的 access_tokenTool.SaveCorpAccessToken(corp_id);}else{console.error('获取 corp_access_token 失败',data);}
关于获取企业凭证更多的内容,请参考 获取企业凭证。
调用企业业务接口,向成员发送消息
我们在上一步中得到了企业凭证 access_token,在上节课程中得到了登录用户的 user_id。
假设在我们的第三方应用实现这样一个功能,当员工登录到这个第三方应用的时候,我们通过这个第三方应用向这名成员发送一条欢迎信息。
// 从缓存中读取当前企业的信息let corp_info = await Tool.GetCorpInfo(corp_id);// 获取当前第三方应用在企业内的 agent_idlet agent_id = corp_info.auth_info.agent[0].agentid;// 从session中读取当前访问用户的 user_idconst user_id = req.sess.user.UserId;// 读取当前企业的 access_tokenlet access_token = await Tool.GetCorpAccessToken(corp_id);// 调用推送应用消息let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`,{"touser" : UserId,"msgtype" : "text","agentid" : agentID,"text" : {"content" : "Hello world!"}});
通过调用推送应用消息的接口,成员会在会话列表看到第三方应用发送来的 Hello World 消息。

七:如何提交上线第三方应用
关于应用消息推送更详细的使用和说明,请参考 发送应用消息。
结语
在前面的课程中,我们已经了解了企业微信第三方应用开发的基本流程,完成了创建应用,部署回调服务,接收 suite_ticket 推送,获得 suite_access_token,将应用安装到企业工作台,获得企业授权码,调用企业接口发送消息等步骤。
到现在,开发者已经具备了企业微信第三方应用开发的基本技能,使用企业微信更多开放能力创造强大的应用,可以通过 开发文档 了解更多开放能力,开发者还可以通过官方提供的 工具资源 进行***的开发和调试。
在下节课程中,我们将了解如何将应用上线和后续的推广运营。
六:如何向成员发送消息
在上节教程中,我们通过网页登录授权,在企业成员打开应用主页时获得了当前访问成员的身份信息。本节课程,我们将开始调用企业的开放接口,通过当前访问成员的 user_id 向企业员工推送一条 “Hello World” 的应用消息。
通过本节教程,开发者将了解:
- 如何通过企业***授权码获取企业凭证
- 如何调用应用消息接口,向成员推送消息
准备工作
在开始本教程内容前,开发者需要做如下准备:
换取企业凭证
第三方服务商在取得企业的***授权码后,通过此接口可以获取到企业的 access_token。获取 access_token是调用企业微信 API 接口的***步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于 access_token 来鉴权调用者身份。
获取企业凭证需要 suite_access_token ,关于如何获得 suite_access_token 请参考 三:如何获取第三方应用凭证 内容。
// 从缓存中读取 permanant_codelet permanent_code = Tool.GetPermanentCode(corp_id);// 从缓存中读取 suite_access_tokenlet suite_access_token = Tool.GetSuiteAccessToken();// 获取企业授权let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=${suite_access_token}`,{permanent_code,auth_corpid});let {access_token} = data;if(access_token){console.log('获取 corp_access_token 成功',access_token);// 缓存当前企业的 access_tokenTool.SaveCorpAccessToken(corp_id);}else{console.error('获取 corp_access_token 失败',data);}
关于获取企业凭证更多的内容,请参考 获取企业凭证。
调用企业业务接口,向成员发送消息
我们在上一步中得到了企业凭证 access_token,在上节课程中得到了登录用户的 user_id。
假设在我们的第三方应用实现这样一个功能,当员工登录到这个第三方应用的时候,我们通过这个第三方应用向这名成员发送一条欢迎信息。
// 从缓存中读取当前企业的信息let corp_info = await Tool.GetCorpInfo(corp_id);// 获取当前第三方应用在企业内的 agent_idlet agent_id = corp_info.auth_info.agent[0].agentid;// 从session中读取当前访问用户的 user_idconst user_id = req.sess.user.UserId;// 读取当前企业的 access_tokenlet access_token = await Tool.GetCorpAccessToken(corp_id);// 调用推送应用消息let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`,{"touser" : UserId,"msgtype" : "text","agentid" : agentID,"text" : {"content" : "Hello world!"}});
通过调用推送应用消息的接口,成员会在会话列表看到第三方应用发送来的 Hello World 消息。

关于应用消息推送更详细的使用和说明,请参考 发送应用消息。
结语
在前面的课程中,我们已经了解了企业微信第三方应用开发的基本流程,完成了创建应用,部署回调服务,接收 suite_ticket 推送,获得 suite_access_token,将应用安装到企业工作台,获得企业授权码,调用企业接口发送消息等步骤。
到现在,开发者已经具备了企业微信第三方应用开发的基本技能,使用企业微信更多开放能力创造强大的应用,可以通过 开发文档 了解更多开放能力,开发者还可以通过官方提供的 工具资源 进行***的开发和调试。
在下节课程中,我们将了解如何将应用上线和后续的推广运营。
在上节教程中,我们通过网页登录授权,在企业成员打开应用主页时获得了当前访问成员的身份信息。本节课程,我们将开始调用企业的开放接口,通过当前访问成员的 user_id 向企业员工推送一条 “Hello World” 的应用消息。
通过本节教程,开发者将了解:
- 如何通过企业***授权码获取企业凭证
- 如何调用应用消息接口,向成员推送消息
准备工作
在开始本教程内容前,开发者需要做如下准备:
换取企业凭证
第三方服务商在取得企业的***授权码后,通过此接口可以获取到企业的 access_token。获取 access_token是调用企业微信 API 接口的***步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于 access_token 来鉴权调用者身份。
获取企业凭证需要 suite_access_token ,关于如何获得 suite_access_token 请参考 三:如何获取第三方应用凭证 内容。
// 从缓存中读取 permanant_codelet permanent_code = Tool.GetPermanentCode(corp_id);// 从缓存中读取 suite_access_tokenlet suite_access_token = Tool.GetSuiteAccessToken();// 获取企业授权let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=${suite_access_token}`,{permanent_code,auth_corpid});let {access_token} = data;if(access_token){console.log('获取 corp_access_token 成功',access_token);// 缓存当前企业的 access_tokenTool.SaveCorpAccessToken(corp_id);}else{console.error('获取 corp_access_token 失败',data);}
关于获取企业凭证更多的内容,请参考 获取企业凭证。
调用企业业务接口,向成员发送消息
我们在上一步中得到了企业凭证 access_token,在上节课程中得到了登录用户的 user_id。
假设在我们的第三方应用实现这样一个功能,当员工登录到这个第三方应用的时候,我们通过这个第三方应用向这名成员发送一条欢迎信息。
// 从缓存中读取当前企业的信息let corp_info = await Tool.GetCorpInfo(corp_id);// 获取当前第三方应用在企业内的 agent_idlet agent_id = corp_info.auth_info.agent[0].agentid;// 从session中读取当前访问用户的 user_idconst user_id = req.sess.user.UserId;// 读取当前企业的 access_tokenlet access_token = await Tool.GetCorpAccessToken(corp_id);// 调用推送应用消息let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`,{"touser" : UserId,"msgtype" : "text","agentid" : agentID,"text" : {"content" : "Hello world!"}});
通过调用推送应用消息的接口,成员会在会话列表看到第三方应用发送来的 Hello World 消息。

关于应用消息推送更详细的使用和说明,请参考 发送应用消息。
结语
在前面的课程中,我们已经了解了企业微信第三方应用开发的基本流程,完成了创建应用,部署回调服务,接收 suite_ticket 推送,获得 suite_access_token,将应用安装到企业工作台,获得企业授权码,调用企业接口发送消息等步骤。
到现在,开发者已经具备了企业微信第三方应用开发的基本技能,使用企业微信更多开放能力创造强大的应用,可以通过 开发文档 了解更多开放能力,开发者还可以通过官方提供的 工具资源 进行***的开发和调试。
在下节课程中,我们将了解如何将应用上线和后续的推广运营。
在上节教程中,我们通过网页登录授权,在企业成员打开应用主页时获得了当前访问成员的身份信息。本节课程,我们将开始调用企业的开放接口,通过当前访问成员的 user_id 向企业员工推送一条 “Hello World” 的应用消息。
通过本节教程,开发者将了解:
- 如何通过企业***授权码获取企业凭证
- 如何调用应用消息接口,向成员推送消息
准备工作
在开始本教程内容前,开发者需要做如下准备:
换取企业凭证
第三方服务商在取得企业的***授权码后,通过此接口可以获取到企业的 access_token。获取 access_token是调用企业微信 API 接口的***步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于 access_token 来鉴权调用者身份。
获取企业凭证需要 suite_access_token ,关于如何获得 suite_access_token 请参考 三:如何获取第三方应用凭证 内容。
// 从缓存中读取 permanant_codelet permanent_code = Tool.GetPermanentCode(corp_id);// 从缓存中读取 suite_access_tokenlet suite_access_token = Tool.GetSuiteAccessToken();// 获取企业授权let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=${suite_access_token}`,{permanent_code,auth_corpid});let {access_token} = data;if(access_token){console.log('获取 corp_access_token 成功',access_token);// 缓存当前企业的 access_tokenTool.SaveCorpAccessToken(corp_id);}else{console.error('获取 corp_access_token 失败',data);}
关于获取企业凭证更多的内容,请参考 获取企业凭证。
调用企业业务接口,向成员发送消息
我们在上一步中得到了企业凭证 access_token,在上节课程中得到了登录用户的 user_id。
假设在我们的第三方应用实现这样一个功能,当员工登录到这个第三方应用的时候,我们通过这个第三方应用向这名成员发送一条欢迎信息。
// 从缓存中读取当前企业的信息let corp_info = await Tool.GetCorpInfo(corp_id);// 获取当前第三方应用在企业内的 agent_idlet agent_id = corp_info.auth_info.agent[0].agentid;// 从session中读取当前访问用户的 user_idconst user_id = req.sess.user.UserId;// 读取当前企业的 access_tokenlet access_token = await Tool.GetCorpAccessToken(corp_id);// 调用推送应用消息let {data} = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}`,{"touser" : UserId,"msgtype" : "text","agentid" : agentID,"text" : {"content" : "Hello world!"}});
通过调用推送应用消息的接口,成员会在会话列表看到第三方应用发送来的 Hello World 消息。

关于应用消息推送更详细的使用和说明,请参考 发送应用消息。
结语
在前面的课程中,我们已经了解了企业微信第三方应用开发的基本流程,完成了创建应用,部署回调服务,接收 suite_ticket 推送,获得 suite_access_token,将应用安装到企业工作台,获得企业授权码,调用企业接口发送消息等步骤。
到现在,开发者已经具备了企业微信第三方应用开发的基本技能,使用企业微信更多开放能力创造强大的应用,可以通过 开发文档 了解更多开放能力,开发者还可以通过官方提供的 工具资源 进行***的开发和调试。
在下节课程中,我们将了解如何将应用上线和后续的推广运营。