介绍
企业微信自建应用接口对接,主要涉及以下几个方面:
- 模块Config
- 消息推送
- 网页登录
- 网页前端JSSDK
- 企业微信网页布局
- 企业微信API调用
1. 模块Config
CabloyJS提供了两种方式来配置Config参数:
-
后台管理页面
:页面路径为系统应用/基础管理/认证管理
-
项目配置
:直接在项目配置文件中覆盖模块Config中的参数,从而配置与企业微信有关的信息
关于如何
覆盖模块Config
,请参见:Config
a-wxwork/backend/src/config/config.js
- 1 // account.wxwork
- 2 config.account.wxwork = {
- 3 client: 'wxwork',
- 4 scope: 'snsapi_base',
- 5 // scenes
- 6 scenes: {
- 7 selfBuilt: {
- 8 title: 'AuthSelfBuiltApp',
- 9 corpId: '',
- 10 agentId: '',
- 11 secret: '',
- 12 message: {
- 13 token: appInfo.name,
- 14 encodingAESKey: '',
- 15 reply: {
- 16 default: 'You are welcome!',
- 17 },
- 18 },
- 19 jssdk: {
- 20 debug: false,
- 21 jsApiList,
- 22 },
- 23 jssdkAgent: {
- 24 jsApiList: jsApiListAgent,
- 25 },
- 26 },
- 27 contacts: {
- 28 title: 'Contacts',
- 29 secret: '',
- 30 message: {
- 31 token: appInfo.name,
- 32 encodingAESKey: '',
- 33 },
- 34 },
- 35 },
- 36 };
名称 | 说明 |
---|---|
scenes | 配置所有微信应用的参数,包括:企业微信内置应用、第三方应用,以及自建应用。如需访问其他应用提供的API接口,直接在scenes 添加新的配置即可 |
scenes.selfBuilt | 自建应用 |
scenes.contacts | 企业微信内置应用 - 通讯录应用 |
2. 消息推送
模块a-wxwork
已经对消息推送的通讯机制进行了封装,并且通过event
机制进行扩展。如果我们要对用户发送的消息进行定制化的回复,可以这样操作:
关于
event
机制,请参见:后端事件
2.0 消息推送配置
名称 | 说明 |
---|---|
服务器地址(URL) | https://xxx.yyy.com/api/a/wxwork/message/wxwork/selfBuilt |
令牌(Token) | 随机值 |
消息加解密密钥(EncodingAESKey) | 随机值 |
2.1 meta
test-wxwork/backend/src/meta.js
- 1event: {
- 2 implementations: {
- 3 'a-wxwork:wxworkMessage': 'wxworkMessage',
- 4 },
- 5},
名称 | 说明 |
---|---|
a-wxwork:wxworkMessage | 模块名称:事件名称 |
wxworkMessage | 响应事件的Bean组件 |
2.2 定义Bean组件
在本示例中,响应事件a-wxwork:wxworkMessage
,回复用户发送的消息
src/suite-vendor/test-party/modules/test-wxwork/backend/src/bean/event.wxworkMessage.js
- 1module.exports = ctx => {
- 2 // const moduleInfo = ctx.app.meta.mockUtil.parseInfoFromPackage(__dirname);
- 3 class eventBean {
- 4
- 5 async execute(context, next) {
- 6 const data = context.data;
- 7 const message = data.message;
- 8 if (message.MsgType === 'text') {
- 9 context.result = {
- 10 ToUserName: message.FromUserName,
- 11 FromUserName: message.ToUserName,
- 12 CreateTime: new Date().getTime(),
- 13 MsgType: 'text',
- 14 Content: `${ctx.text.locale('zh-cn', 'Reply')}: ${message.Content}`,
- 15 };
- 16 // break
- 17 return;
- 18 }
- 19 // next
- 20 await next();
- 21 }
- 22
- 23 }
- 24
- 25 return eventBean;
- 26};
名称 | 说明 |
---|---|
context.data | 外部传入的参数 |
next | event采用洋葱圈 模型,调用next 从而允许其他事件实现 的执行 |
2.3 注册Bean组件
src/suite-vendor/test-party/modules/test-wxwork/backend/src/beans.js
- 1const eventWxworkMessage = require('./bean/event.wxworkMessage.js');
- 2
- 3module.exports = app => {
- 4 const beans = {
- 5 // event
- 6 'event.wxworkMessage': {
- 7 mode: 'ctx',
- 8 bean: eventWxworkMessage,
- 9 },
- 10 };
- 11 return beans;
- 12};
注册名称 | 场景 | 所属模块 | global | beanFullName |
---|---|---|---|---|
wxworkMessage | event | test-wxwork | false | test-wxwork.event.wxworkMessage |
3. 网页登录
模块a-wxwork
自动判断,如果当前网页处于企业微信app
中,会自动转向企业微信登录,然后自动进行用户认证
4. 网页前端JSSDK
模块a-wxwork
提供了便捷的组件,可以自动注入微信JSSDK,并且自动进行config配置
测试模块test-wxwork
演示了如何调用微信的二维码扫描操作:
src/suite-vendor/test-party/modules/test-wxwork/front/src/pages/test/index.vue
- 1 created() {
- 2 const action = {
- 3 actionModule: 'a-wxwork',
- 4 actionComponent: 'jssdk',
- 5 name: 'config',
- 6 };
- 7 this.$meta.util.performAction({ ctx: this, action }).then(res => {
- 8 this.wx = res && res.wx;
- 9 }).catch(e => {
- 10 this.$view.toast.show({ text: e.message });
- 11 })
- 12 },
- 13 methods: {
- 14 onPerformScanQRCode() {
- 15 this.wx.scanQRCode({
- 16 needResult: 1,
- 17 scanType: ['qrCode', 'barCode'],
- 18 success: res => {
- 19 this.$view.toast.show({ text: res.resultStr });
- 20 },
- 21 fail: res => {
- 22 this.$view.toast.show({ text: res.errMsg });
- 23 }
- 24 });
- 25 },
- 26 }
- 先通过
this.$meta.util.performAction
调用模块a-wxwork
提供的组件,返回wx
对象 - 调用
wx
对象执行扫描二维码的微信接口
5. 企业微信网页布局
CabloyJS可以创建App应用
,一个App应用是菜单页面+主页+用户页面
组合。我么可以专门针对企业微信场景定义一个专属的App应用
测试模块test-wxwork
演示了如何定制企业微信场景下的App应用:
-
App应用配置:
src/suite-vendor/test-party/modules/test-wxwork/backend/src/config/static/app/appTest.js
-
App菜单页面配置:
src/suite-vendor/test-party/modules/test-wxwork/backend/src/config/static/layout/layoutAppMenuTest.js
6. 企业微信API调用
模块a-wxwork
提供了全局Bean组件wxwork
,用于调用所有企业微信API,格式如下:
ctx.bean.wxwork.app.{providerScene}
名称 | 说明 |
---|---|
providerScene | 场景名称,比如selfBuilt (自建应用) |
企业微信API基于
songbug1024/co-wxwork-api
。为了便于更灵活的添加新API,CabloyJS对主仓库发起了一个新分支,详细的API清单请参见:co-wxwork-api
下面以JSSDK Config为例:
src/module-system/a-wxwork/backend/src/service/jssdk.js
- 1async jsconfig({ url }) {
- 2 ...
- 3 return await this.ctx.bean.wxwork.app.selfBuilt.getJsConfig(params);
- 4}
7. 如何判断是否在企业微信
中
由于CabloyJS后端架构的普适性,我们有时候需要判断当前是否在企业微信中,从而做出相应的处理
7.1 通过中间件判断
可以通过中间件inWxwork
来判断该api接口是否被企业微信
调用,如果不是则自动阻止后续逻辑的执行
src/suite-vendor/test-party/modules/test-wxwork/backend/src/routes.js
- 1 { method: 'post', path: 'test/getMemberId', controller: test, middlewares: 'inWxwork',
- 2 meta: {
- 3 inWxwork: {
- 4 providerName: 'wxwork',
- 5 providerScene: null,
- 6 },
- 7 },
- 8 },
名称 | 说明 |
---|---|
meta.inWxwork | 中间件inWxwork 的参数 |
providerName | 认证提供者名称,如果指定wxwork ,表示该api只能被企业微信 调用 |
providerScene | 如果认证提供者支持多个场景,这里可以指定场景名 |
7.2 通过代码判断
可以直接通过代码进行判断
- 1ctx.bean.wxwork.util.in({ providerName, providerScene })
评论: