加密版接口
内测功能
开启升级版API
(该操作无法回退,开启后无法使用老版本的api发消息),开启后会自动生成AppKey
、AppSecret
、EncodingAESKey
。Appkey
accessToken
的参数之一,不可重置。AppSecret
AppSecret
是小组用于保障数据安全的“钥匙”,每一个小组都有一个独立的访问密钥,为了保证数据的安全,AppSecret
务必不能泄漏。用于生成access_token的参数之一,可以重置,重置后会生成新的AppSecret
,并且依赖之前AppSecrt对应生成的accessToken
也会失效。AccessToken
accessToken
默认有效时间是7200s,调用者可以传入时间来指定accessToken
的有效时间。EncodingAESKey
EncodingAESKey
用于回调消息内容加密,由英文或数字组成且长度为43位的自定义字符串。EncodingAESKey
可以重置,暂无通过接口获取EncodingAESKey
,一经重置,客户需要通过手动复制粘贴到代码中使用。相关api
生成accessToken
Body 请求参数
{
"token": "62a2e8169dddfbdd9aea5c85",
"appKey": "62a2a0c3989d7260ff537c36",
"appSecret": "nQm3X59gmyu58zvHICAFp8oIymDS5wLKPVnL3xQhYzJHEizpdX",
}
名称 | 位置 | 类型 | 必选 | 说明 |
---|---|---|---|---|
token | body | string | 是 | 用来鉴权你是否有权限生成accessToken |
appKey | body | string | 是 | 页面中生成的appKey |
appSecret | body | string | 是 | 页面中生成的appSecret |
{
"code": 0,
"message": "",
"data": {
"accessToken":"4tKm1ncg4Pxe9wN4M7dMhQqPITLYfyVShc8BHNNsdLfK7WKFy2Kufq6Sfqh5vzhB",
"expiresIn":7200
}
}
appKey
和appSecre
t生成的token。accessToken
的有效期。单位:秒accessToken
,当accessToken
失效或过期时,需要重新获取。accessToken
的有效期通过返回的expiresIn来传达,正常情况下为7200秒(2小时),有效期超过1200秒(20分钟)重复获取返回相同结果,有效期剩余不超过1200秒(20分钟)获取会返回新的accessToken
。appSecret
会使之前生成的accessToken立即失效。关于EncodingAESKey
说明
EncodingAESKey
作为密钥来加密。一些参数说明
Base64
编码。解码后即为32字节长的AESKey
PKCS#7
填充至32字节的倍数;IV初始向量大小为16字节,取AESKey前16字节,详见:http://tools.ietf.org/html/rfc2315Base64
编码。回调函数返回值
{
msgEncrypt: 'YOh0ibimQ4YGo9xNURbGP9kKe0ZBfp4ewNYE5NNM1n6vcuSLEQhZ+6aW7W2pghGT3HTWUbsngEgHKFIzCJShEeEtWMnedSM8rcnLn3b7KiptLxtHYU45WfdqFZ6/Al2kk0Z347sRkWmlwyB5V+8KzmgY/c97QpeJjeAxDUCw752A3HIIzPrIE3IoGBf+PuaA+U6/7mRltcWd8YUVwnQXp095MUZhNI5etpBpQcSJd/lOtv7NJISZ3ei8ez1TLQXCeDfA25785fY5TBwK/KJN7p30otMseTatxeaCnai4xM76P3xk6UdUZl5V5R1V3POrUeA2ZZbXlVRBGJ+fx0tfIPNBkwNVnFGUGCrzRgImUquYmdXvElfls71wEYarHvC/jwjM9YstFkRCJisDN7FIhN9sV/hoLux72o4qj96mlxNogcZ+0e169cNLbrBKbVTyiVZbuuk1pSHudaOIWQxDMZrL6EdwZ04eKbJztAkmUcPLPwvidzsssBLeZrfa9bHIqS4zjGWBSTxY5UclAkKGSThWExvXwpHuwOOkyUTjA3RUZrr4/S+NGJL20nuA6P/EAlaLyAv5XP8rPS/9M66/wy+bVaAuRvR+JIfpdO2zwe1IV4EN4NfD/PydGptSpR6vgBUyBNHC7LixprTwbbf8TvleDZYLnBF/e/L2VXplGuc=',
msgSignature: 'fe9a0e585838cc0a5cfaba60666c035244d64591',
timestamp: 1655437691133,
nonce: '1548674977'
}
{
message: '{"data":{"messageId":"1224501","chatId":"62a2a13e634db54d8183b2fd","avatar":"https://wx.qlogo.cn/mmhead/Q3auHgzwzM4o5pDPk656opaSJrUGlicw0xicWV9GKhKyfyo7RwSdXJiaw/0","roomTopic":"","roomId":"","contactName":"福利官是你2","contactId":"7881302521067024","payload":{"text":"test"},"type":7,"timestamp":1655437690022,"token":"62a2e8169dddfbdd9aea5c85","contactType":1,"coworker":false,"botId":"62a2a0c747939dae52ec3f32","botWxid":"1688857603302323","botWeixin":"lihuiming"}}',
id: '',
random: <Buffer 75 3f 6b f9 ed bc b2 a0 4d 7a 91 dd 90 b7 9c e7>
}
{
data: {
messageId: '1224501',
chatId: '62a2a13e634db54d8183b2fd',
avatar: 'https://wx.qlogo.cn/mmhead/Q3auHgzwzM4o5pDPk656opaSJrUGlicw0xicWV9GKhKyfyo7RwSdXJiaw/0',
roomTopic: '',
roomId: '',
contactName: '福利官是你2',
contactId: '7881302521067024',
payload: { text: 'test' },
type: 7,
timestamp: 1655437690022,
token: '62a2e8169dddfbdd9aea5c85',
contactType: 1,
coworker: false,
botId: '62a2a0c747939dae52ec3f32',
botWxid: '1688857603302323',
botWeixin: 'lihuiming'
}
}
本部分的内容,与企业微信的加解密原理相同。 参考:https://developer.work.weixin.qq.com/devtool/introduce?id=36388
验证签名
devMsgSignature=sha1(sort(AppSecret、timestamp、nonce、msgEncrypt))。
1.
sort
的含义是将参数值按照字母字典排序,然后从小到大拼接成一个字符串 sha1
处理结果要编码为可见字符,编码的方式是把每字节散列值打印为%02x(即16进制,C printf语法)格式,全部小写2.
devMsgSignature
和msgSignature
是否相等,相等则表示验证通过解密函数
加密函数
randMsg = random(16B) + msgLen(4B) + msg + receiveid
msg_encrypt = Base64_Encode(AES_Encrypt(rand_msg))
回调案例
/message
{
data: {
messageId: '1227832',
chatId: '62ac932b191e766df2f378d7',
avatar: 'https://wx.qlogo.cn/mmhead/Q3auHgzwzM4o5pDPk656opaSJrUGlicw0xicWV9GKhKyfyo7RwSdXJiaw/0',
roomTopic: '',
roomId: '',
contactName: '福利官是你2',
contactId: '7881302521067024',
payload: { text: '测试1' },
type: 7,
timestamp: 1655692898706,
token: '62ac92c52c4b8587132ab8da',
contactType: 1,
coworker: false,
botId: '62ac92d05a1297d122822b96',
botWxid: '1688857603302323',
botWeixin: 'lihuiming'
}
}
{
msgEncrypt: 'dr4zEQpV3M9lfu2Bx0rUKPGyzxUs9vP+bWd0nXAP24bgqzgJGIQ0TEaZxeVF4oEwXAR1lI5TiknrIhu0RuDF5+nDjVuX/wHzaLVnNbpTbNZu1StBkMqnvINWii8DGwbRkOc4lcz8ca5RTw0yTDR5ZkKEggr68wVPlBoiifptepgYhZwN5R9jW6pGyg1vtUDmrGK4trtlmipH2ZAJjg/wwvq/mdAcMdIKnuCfWzO+HHNbvEShXrROHJ4PWYI6pibKKDDxFd2vz8qbIoFxWeX7ELsqr4iKOEYG9WTB0ukfQn9k/PcWn4YrKWsutnYhQseXhyWy7GAv22kyCIyXR5vP13lGvkyUjVD8HhSw1ExiopydP4AuFFeWX5Yb4zN2uczL6r4jTXIYcnm7evHaPMZN/wLCQiiezLizdoiEeuvaZbqVsgfKWZi6wfS8sOhvi2mDxGRF9dItSOkjq7QIRqJ2fBjv/xfCyj1Ev3T1n9EalbLbGQFVvjza705vC8LlslAgTIvclRiq2ynT62WeLdKWco+bb4E+NA3M6v1BpT136+2Ajz0KCMaEwAF+y+ssg4TNyjC92yVhRAiSLWCFnw/DQcQ7D9BBJ17tOWaneqLZ3mjOdcKZ1f55H74w98ksOJXXqzsp60JJK7EvoR4i6HqA9luEazhFdrvKiyU3VifYtjc=',
msgSignature: 'e236ba4180eb9c242cbe6ecdeabc5dc52ed17f6c',
timestamp: 1655692899577,
nonce: '0678228500'
}
{
message: '{"data":{"messageId":"1227832","chatId":"62ac932b191e766df2f378d7","avatar":"https://wx.qlogo.cn/mmhead/Q3auHgzwzM4o5pDPk656opaSJrUGlicw0xicWV9GKhKyfyo7RwSdXJiaw/0","roomTopic":"","roomId":"","contactName":"福利官是你2","contactId":"7881302521067024","payload":{"text":"测试1"},"type":7,"timestamp":1655692898706,"token":"62ac92c52c4b8587132ab8da","contactType":1,"coworker":false,"botId":"62ac92d05a1297d122822b96","botWxid":"1688857603302323","botWeixin":"lihuiming"}}',
id: '',
random: <Buffer 81 a6 c4 9d 5b 0c 33 22 a7 b5 d3 54 23 f1 78 39>
}
message
字段就是原消息明文。message
进行JSON.parse{
data: {
messageId: '1227832',
chatId: '62ac932b191e766df2f378d7',
avatar: 'https://wx.qlogo.cn/mmhead/Q3auHgzwzM4o5pDPk656opaSJrUGlicw0xicWV9GKhKyfyo7RwSdXJiaw/0',
roomTopic: '',
roomId: '',
contactName: '福利官是你2',
contactId: '7881302521067024',
payload: { text: '测试1' },
type: 7,
timestamp: 1655692898706,
token: '62ac92c52c4b8587132ab8da',
contactType: 1,
coworker: false,
botId: '62ac92d05a1297d122822b96',
botWxid: '1688857603302323',
botWeixin: 'lihuiming'
}
}
修改于 2025-05-08 02:40:40