手机版

nodejs开发企业微信第三方应用教程详细介绍

时间:2021-08-27 来源:互联网 编辑:宝哥软件园 浏览:

最近公司想在企业微信端开发Worktile,以前是企业微信的内部应用,所以只适用于私有部署客户,公有云客户无法使用,所以准备开发企业微信的第三方应用。本文主要介绍研究阶段遇到的美食。

在开发之前,您需要注册为第三方服务提供商,然后使用第三方服务提供商的帐户创建应用程序。创建后,只需要管理员对应用进行授权,第三方服务提供商就可以为用户提供服务。

首先,注册第三方服务提供商

登录服务商官网,注册成为服务商,登录服务商管理后台。

二、配置开发信息

在创建应用程序之前,您必须首先配置一般的开发参数

填写系统事件接收网址时,应正确响应企业微信验证网址的请求。这可以参考企业微信后台和自建应用的消息接收api设置。

在企业管理端后台,输入需要设置接收消息的目标应用,点击“接收消息”的“设置API接收”按钮,进入配置页面。

需要填写应用网址、令牌和编码密钥三个参数

URL是企业后台接收企业微信推送请求的访问协议和地址,支持http或https协议(建议使用https以提高安全性)。令牌可以由企业随意填写,用于生成签名。EncodingAESKey用于加密消息正文,是AES密钥的Base64编码。2.1验证url的有效性

点击保存后,企业微信会发出获取请求,要求填写网址

比如url设置为https://api.worktile.com,企业微信会发送如下验证请求:

请求地址:https://api.worktile.com/?消息_签名=ASDFQWEXZCVAQFASDFASDFSS篡改=13500001234 nonce=123412323 echostr=ENCRYTE _ STR

参数描述msg_signature企业微信加密签名,msg_signature结合企业填写的令牌、请求中的时间戳和随机数参数、加密后的消息体时间戳随机数echostr加密字符串。消息内容明文需要解密。解密后有四个字段:random、msg_len、msg和receiveid,其中msg为消息内容明文2.1.1。该请求由参数msg_signature验证

首先,在配置期间随机生成的令牌、时间戳、随机数、msg _ encrypt应该由sha1加密。在这里,我们可以直接使用npm模块sha1进行加密,然后判断得到的str是否等于msg_signature。

函数sha1(str){ const MD5 sum=crypto . create hash(' sha1 ');MD5 sum . update(str);const密文=MD5 sum . digest(' hex ');返回密文;}function checkSignature(req,res,encrypt){ const query=req . query;console.log('Request URL: ',req . URL);const signature=query . msg _ signature;const时间戳=query.timestampconst nonce=query.nonce让echostrconsole.log('encrypt ',encrypt);if(!encrypt){ echostr=query . echostr;} else { echostr=encrypt} console.log('timestamp: ',时间戳);console.log('nonce: ',nonce);console . log(' signature re : ',签名);//按字典顺序对标记/时间戳/现时进行排序Const TMPAR=[标记、时间戳、现时、echostar];const tmpStr=sha1(tmpArr.sort()。join(“”);console.log('Sha1 String: ',TMPstr);//如果(tmpStr===signature) {//按原样返回echostar参数content const result=_ decode(echostr),则验证排序和加密的字符串是否等于signature;console.log('last ',result);控制台日志(“检查成功”);返回结果;} else { console.log('检查失败');返回“失败”;}}2.1.2解密echostr以获取消息并返回

密文解密过程:

对刚刚生成的AES密钥执行base64解码

const EncodingAESKey=' 21 pfq j8 qoljbaqpqe1 vtak5 sgkaq 3gqmukuqlwre ';让AES key=buffer . from(encodingaes key '=',' base64 ');aes密钥由aes-256-cbc解密

function _ decode(data){ let aesKey=buffer . from(' 21 pfqj8 qoljbaqpqe1 vtak5 sgkaq3gqmukuqlwre ' '=',' base64 ');让AES cipher=crypto . createdecidepheriv(' AES-256-CBC ',aesKey,aesKey.slice(0,16));AES cipher . setautopadding(false);让deckeredbuff=buffer . concat([AES cipher . update(data,' base64 '),AES cipher . final()]);deckeredbuff=pkcs7 decoder(deckeredbuff);让len _ netOrder _ corpid=deckeredbuff . slice(16);让msg _ len=len _ netOrder _ corpid . slice(0,4). readuint 32 be(0);const result=len _ Netorder _ corpid . slice(4,msg_len 4)。toString();返回结果;//返回解密的明文-}函数pkcs7 decoder(buff){ var pad=buff[buff。长度-1];if(pad 1 | | pad 32){ pad=0;}返回buff.slice(0,buff . length-pad);}然后返回结果

res.end(结果);2.2回调url验证失败

在验证网址时,我们经常会遇到网址验证失败的问题。解决方案是使用微信企业界面调试工具

第三,创建一个应用程序

第四,测试应用

成功创建应用程序后,服务提供商可以授权10家测试企业

当从企业微信应用市场发起授权时,企业微信向应用刚刚设置的指令回调url发送post请求,例如:

https://api.worktile.com/worktile?msg _ signature=b 99605616153 ffbbe 6 ebbb 500 BD 211 e 67 ed 714d timestamp=1551076894 nonce=1551709703,可以直接作为成功返回。

对于每个事件的回调,服务提供者必须在收到推送后直接返回字符串“success”。如果返回值不是“成功”,企业微信会将返回的内容视为错误消息。

app.post('/worktile ',function (req,res) { console.log('req.body ',req . body);res.send('成功');});测试应用注意事项

安装测试的企业微信账号需要服务商注册。每个应用支持同时添加10个测试企业微信账号。安装测试的企业微信账号使用当前应用配置信息,后续修改不会同步;如需更新申请信息,请重新授权安装同一企业微信账号。它不支持同时安装测试应用程序和官方发布的应用程序。5.应用程序在线

企业微信认证服务商可进入申请管理-点击在线提交-勾选申请-在线提交。

第六,用户的网页授权登录

6.1构建第三方应用网页的授权链接

如果第三方应用需要在打开的网页中携带用户的身份信息,第一步是构建以下链接获取代码:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPIDredirect _ uri=REDIRECT _ URIresponse _ type=codescope=scope estate=STATE #微信_redirect

参数必须指示appid是第三方应用程序id(即ww或wx开头的suite_id)。请注意,与企业中的网页授权登录不同,redirect_uri是授权后重定向的回调链接地址。请使用urlencode处理链接。请注意,域名需要设置为第三方应用程序的受信任域名response_type的返回类型。此时固定为:代码范围为应用授权范围。Snsapi_base:静默授权,可以获取成员的基本信息(UserId和device id);Snsapi_userinfo:静默授权,可以获取成员的详细信息,但不包括手机、邮箱等敏感信息;Snsapi_privateinfo:手动授权可以获取成员的详细信息,包括手机、邮箱等敏感信息。如果状态被重定向,会带来状态参数,企业可以填写a-zA-Z0-9的参数值,长度不能超过128字节。#微信_redirect是指终端用这个参数来判断是否需要携带身份信息。

员工点击后,页面会跳转到redirect_uri?Code=CODEstate=STATE,第三方应用可以根据代码参数获取企业员工的corpid和userid。代码的最大长度是512字节。

6.2访问用户身份

请求方法:GET(HTTPS)

请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/getuserinfo3rd?访问令牌=套件访问令牌码=代码

参数必须指示access_token是第三方应用程序的suite_access_token。参见“获取第三方应用证书”。代码由成员授权获得,最大长度为512字节。每次授权会员携带不同的代码,该代码只能使用一次,5分钟不使用将自动失效。6.2.1获取第三方应用程序的套件_访问_令牌

请求方法:POST(HTTPS)

请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token

参数必须指示suite_id是以ww或wx开头的应用程序id(对应于以tj开头的旧suite id)。suite _ secret是一个应用程序secret suite_ticket是企业微信后台推送的一个票证。由于大量企业可能由第三方服务商托管,其安全问题的影响会更加严重,因此除了验证合法的源IP外,在API中增加suite_ticket作为安全证书。

获取suite_access_token时需要参数suite_ticket。Suite_ticket由企业微信后台定时推送至“指令回调URL”,每十分钟更新一次。请参见推送套件_票。

suite_ticket的实际有效期为30分钟,可以容错连续两次获取suite_ticket失败,但请始终使用最新收到的suite_ticket。

通过该接口获取的suite_access_token有效期为2小时,开发者需要缓存,不能频繁获取。

6.2.2获取推送套件_票

企业微信服务器会定时推票(每十分钟一次)。票证将被实时更改,并用于后续的接口调用。

请求方法:POST(HTTPS)

请求地址:https://api.ninesix.cc/worktile? msg _ signature=87276 AAF 15 a 13 E1 EB 2 ebb 6d 93732 ca 668 C3 ddef 8 time stamp=1551850300 nonce=1551051655

如遇授权、通讯录变更、车票变更等。企业微信服务器会将对应的事件消息推送至应用的“指令回调url”。nodejs接收xml,解析后得到encrypt字段,然后使用上面配置通用开发参数URL时使用的解密方法得到suite_ticket。

6.3获取用户敏感信息

请求方法:POST(HTTPS)

请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/getuserdetail3rd?接入令牌=套房接入令牌

{ ' user _ ticket ' : ' user _ ticket ' }参数必须指示access_token是第三方应用程序的suite_access_token。参见“获取第三方申请凭证”。User _ ticket是成员票证的返回结果:

{ 'errcode': 0,' errmsg': 'ok ',' corpid': 'ww

版权声明:nodejs开发企业微信第三方应用教程详细介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。