Skip to content

elixirChain/dingtalk-encrypt

Repository files navigation

dingtalk-encrypt

Node.js 版钉钉回调事件消息体加解密工具库。

参考 Java 版本


快速开始

源码使用

git clone <repo>
cd dingtalk-encrypt
npm install
node EncryptTest.js   # 查看主要 API 和 Utils 用法

作为 npm 模块使用

npm install --save dingtalk-encrypt

API 用法见下方 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));

致谢

About

dingTalk encrypt Node Version. 钉钉的非官方nodejs版AES加解密库 sdk

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors