dingtalk-encrypt
v2.1.2
Published
Nodejs Version Message Encryption & Decryption of DingTalk.
Maintainers
Readme
dingtalk-encrypt
Node.js 版钉钉回调事件消息体加解密工具库。
参考 Java 版本。
快速开始
源码使用
git clone <repo>
cd dingtalk-encrypt
npm install
node EncryptTest.js # 查看主要 API 和 Utils 用法作为 npm 模块使用
npm install --save dingtalk-encryptAPI 用法见下方 API 文档。
API 文档
常量说明
| 常量 | 说明 |
|------|------|
| TOKEN | 签名用随机串,不受格式限制,例如 "123456" |
| ENCODING_AES_KEY | 回调数据加密密钥,固定 43 位字符,从 [a-z, A-Z, 0-9] 中随机生成 |
| KEY | 钉钉 suiteKey / customKey / Corpid,见官方文档 |
KEY 填写规则:
| 应用类型 | KEY 填写内容 | |----------|--------------| | 企业内部应用 | Corpid | | 企业定制应用 | customKey | | 第三方企业应用 | suiteKey |
主要 API(DingTalkEncryptor)
| 方法 | 说明 |
|------|------|
| getEncryptedMap(plaintext, timestamp, nonce) | 获取加密响应对象(回调函数用) |
| getDecryptMsg(msgSignature, timestamp, nonce, encryptMsg) | 解密回调数据(含签名校验) |
| getSignature(token, timestamp, nonce, encrypt) | 计算签名 |
| encrypt(random, plainText) | 加密 |
| decrypt(encrypted) | 解密 |
工具函数(dingtalk-encrypt/Utils)
| 函数 | 说明 |
|------|------|
| getRandomStr(size) | 生成指定长度的随机字符串 |
| getRandomEncodingAesKey() | 生成 43 位随机 ENCODING_AES_KEY |
使用示例
处理钉钉回调
参考:钉钉开发文档 — 业务事件回调
const DingTalkEncryptor = require('dingtalk-encrypt');
const utils = require('dingtalk-encrypt/Utils');
/** 加解密需要,可以随机填写。如 "12345" */
const TOKEN = utils.getRandomStr(6);
/** 加密密钥,用于回调数据的加密,固定为43个字符,
* 从 [a-z, A-Z, 0-9] 共62个字符中随机生成,见 getRandomEncodingAesKey */
const ENCODING_AES_KEY = utils.getRandomEncodingAesKey();
console.log('ENCODING_AES_KEY: \n', ENCODING_AES_KEY);
/** KEY 第三方企业应用为 suiteKey,企业定制应用为 customKey,
* 企业内部应用为 Corpid,可以在钉钉企业管理后台查看(https://oa.dingtalk.com/) */
const KEY = 'ding1234567890';
/** 实例化加密类 */
console.log('\nEncryptor Test:');
const encryptor = new DingTalkEncryptor(TOKEN, ENCODING_AES_KEY, KEY);
// 解密钉钉回调数据
const plainText = encryptor.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
console.log('DEBUG plainText: ' + plainText);
const obj = JSON.parse(plainText);
// 回调事件类型,根据事件类型和业务数据处理相应业务
const eventType = obj.EventType;
// 响应数据:加密 'success',签名等等
encryptor.getEncryptedMap('success', timestamp, utils.getRandomStr(8));单独使用加/解密
/** 测试加解密响应报文或者字符串 */
const testJson = {
EventType: 'bpms_instance_change',
processInstanceId: 'ad253df6-e175caf-68085c60ba8a',
key: 'ding2c4d8175651',
createTime: 1495592259000,
title: '自测-1016',
type: 'start',
staffId: 'er5875',
url: 'https://aflow.dingtalk.com/dingtalk/mobile/homepage.htm',
processCode: 'xxx',
};
const unencryptedJson = JSON.stringify(testJson);
console.log(` node unencryptedJson:\n ${unencryptedJson}`);
const encryptedJson = encryptor.encrypt(ENCRYPT_RANDOM_16, unencryptedJson);
console.log(` \nnode encryptedJson:\n ${encryptedJson}`);
const decryptedJson = encryptor.decrypt(encryptedJson);
console.log(` \nnode decryptedJson:\n ${decryptedJson}, (${decryptedJson.length})`);
console.log(' \nnode sign:\n ' + encryptor.getSignature(TOKEN, timeStamp, nonce, encryptedJson));