本文包含了企业号回调企业时加解密的详细方案、库和示例代码的下载,以及企业号api接口返回的错误码。
一、关于加解密方案的详细说明
1、术语及说明
开启回调模式时,有以下术语需要了解:
1)msg_signature是签名,用于验证调用者的合法性
2)EncodingAESKey用于消息体的加密,长度固定为43个字符,从a-z, A-Z, 0-9共62个字符中选取,是AESKey的Base64编码。解码后即为32字节长的AESKey
3)AESKey=Base64_Decode(EncodingAESKey + “=”),是AES算法的密钥,长度为32字节。AES采用CBC模式,数据采用PKCS#7填充;IV初始向量大小为16字节,取AESKey前16字节。具体详见:http://tools.ietf.org/html/rfc2315
4)msg为消息体明文,格式为XML
5)msg_encrypt = Base64_Encode( AES_Encrypt[random(16B) + msg_len(4B) + msg + $CorpID] ),是对明文消息msg加密处理后的Base64编码
2、消息体签名
为了验证调用者的合法性,微信在回调url中增加了消息签名,以参数msg_signature标识,企业需要验证此参数的正确性后再解密。验证步骤:
1)企业计算签名:dev_msg_signature=sha1(sort(Token、timestamp、nonce、msg_encrypt))。sort的含义是将参数按照字母字典排序,然后从小到大拼接成一个字符串
2)比较dev_msg_signature和msg_signature是否相等,相等则表示验证通过。
3、加解密方案说明
对明文msg加密的过程如下:
msg_encrypt = Base64_Encode( AES_Encrypt[random(16B) + msg_len(4B) + msg + $CorpID] )
AES加密的buf由16个字节的随机字符串、4个字节的msg长度、明文msg和$CorpID组成。其中msg_len为msg的字节数,网络 字节序;$CorpID为企业号的CorpID。经AESKey加密后,再进行Base64编码,即获得密文msg_encrypt。
对应于加密方案,解密方案如下:
1)对密文BASE64解码:aes_msg=Base64_Decode(msg_encrypt)
2)使用AESKey做AES解密:rand_msg=AES_Decrypt(aes_msg)
3)验证解密后$CorpID、msg_len
4)去掉rand_msg头部的16个随机字节,4个字节的msg_len,和尾部的$CorpID即为最终的消息体原文msg。
内容导航
二、加解密库下载和返回码
1、加解密库的返回码
返回码
说明
0
请求成功
-40001
签名验证错误
-40002
xml解析失败
-40003
sha加密生成签名失败
-40004
AESKey 非法
-40005
corpid 校验错误
-40006
AES 加密失败
-40007
AES 解密失败
-40008
解密后得到的buffer非法
-40009
base64加密失败
-40010
base64解密失败
-40011
生成xml失败
2、加解密库下载及示例
c++库(点击下载)
注意事项:
1)WXBizMsgCrypt.h声明了WXBizMsgCrypt类,提供用户接入企业微信的三个接口。WXBizMsgCrypt.cpp文件提供了三个接口的实现。Sample.cpp文件提供了如何使用这三个接口的示例。
2)WXBizMsgCrypt类封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url,收到用户回复消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.cpp文件。
3)加解密协议请参考企业微信官方文档。
4)加解密过程使用了开源的openssl和tinyxml2库,请开发者自行安装之后使用。
*openssl的版本号是openssl-1.0.1h,http://www.openssl.org/
*tinyxml2的版本号是tinyxml2-2.1.0,https://github.com/leethomason/tinyxml2
python库(点击下载)
注意事项:
1)WXBizMsgCrypt.py文件封装了WXBizMsgCrypt接口类,提供了用户接入企业微信的三个接口,Sample.py文件提供了如何使用这三个接口的示例,ierror.py提供了错误码。
2)WXBizMsgCrypt封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.py文件。
3)本代码用到了pycrypto第三方库,请开发者自行安装此库再使用。
php库(点击下载)
注意事项:
1)WXBizMsgCrypt.php文件提供了WXBizMsgCrypt类的实现,是用户接入企业微信的接口类。Sample.php提供了 示例以供开发者参考。errorCode.php, pkcs7Encoder.php, sha1.php, xmlparse.php文件是实现这个类的辅助类,开发者无须关心其具体实现。
2)WXBizMsgCrypt类封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.php文件。
java库(点击下载)
注意事项:
1)com\qq\weixin\mp\aes目录下是用户需要用到的接入企业微信的接口,其中WXBizMsgCrypt.java文件提供的 WXBizMsgCrypt类封装了用户接入企业微信的三个接口,其它的类文件用户用于实现加解密,用户无须关心。sample.java文件提供了接口 的使用示例。
2)WXBizMsgCrypt封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.java文件。
3)请开发者使用jdk1.7以上的版本。针对org.apache.commons.codec.binary.Base64,需要导入jar包commons-codec-1.9(或comm ons-codec-1.8等其他版本),我们有提供,官方下载地址:
http://commons.apache.org/proper/commons-codec/download_codec.cgi
4)异常java.security.InvalidKeyException:illegal Key Size的解决方案:
在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。如果安装了JRE, 将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件,如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录 下覆盖原来文件。
c#库(点击下载)
注意事项:
1)Cryptography.cs文件封装了AES加解密过程,用户无须关心具体实现。WXBizMsgCrypt.cs文件提供了用户接入企业微信的三个接口,Sample.cs文件提供了如何使用这三个接口的示例。
2)WXBizMsgCrypt.cs封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.cs文件。
内容导航
三、全局返回码说明
企业号每次调用接口时,可能获得正确或错误的返回码,企业可以根据返回码信息调试接口,排查错误。
全局返回码说明如下:
返回码
说明
-1
系统繁忙
0
请求成功
40001
获取access_token时Secret错误,或者access_token无效
40002
不合法的凭证类型
40003
不合法的UserID
40004
不合法的媒体文件类型
40005
不合法的文件类型
40006
不合法的文件大小
40007
不合法的媒体文件id
40008
不合法的消息类型
40013
不合法的corpid
40014
不合法的access_token
40015
不合法的菜单类型
40016
不合法的按钮个数
40017
不合法的按钮类型
40018
不合法的按钮名字长度
40019
不合法的按钮KEY长度
40020
不合法的按钮URL长度
40021
不合法的菜单版本号
40022
不合法的子菜单级数
40023
不合法的子菜单按钮个数
40024
不合法的子菜单按钮类型
40025
不合法的子菜单按钮名字长度
40026
不合法的子菜单按钮KEY长度
40027
不合法的子菜单按钮URL长度
40028
不合法的自定义菜单使用员工
40029
不合法的oauth_code
40031
不合法的UserID列表
40032
不合法的UserID列表长度
40033
不合法的请求字符,不能包含\uxxxx格式的字符
40035
不合法的参数
40038
不合法的请求格式
40039
不合法的URL长度
40040
不合法的插件token
40041
不合法的插件id
40042
不合法的插件会话
40048
url中包含不合法domain
40054
不合法的子菜单url域名
40055
不合法的按钮url域名
40056
不合法的agentid
40057
不合法的callbackurl
40058
不合法的红包参数
40059
不合法的上报地理位置标志位
40060
设置上报地理位置标志位时没有设置callbackurl
40061
设置应用头像失败
40062
不合法的应用模式
40063
红包参数为空
40064
管理组名字已存在
40065
不合法的管理组名字长度
40066
不合法的部门列表
40067
标题长度不合法
40068
不合法的标签ID
40069
不合法的标签ID列表
40070
列表中所有标签(用户)ID都不合法
40071
不合法的标签名字,标签名字已经存在
40072
不合法的标签名字长度
40073
不合法的openid
40074
news消息不支持指定为高保密消息
41001
缺少access_token参数
41002
缺少corpid参数
41003
缺少refresh_token参数
41004
缺少secret参数
41005
缺少多媒体文件数据
41006
缺少media_id参数
41007
缺少子菜单数据
41008
缺少oauth code
41009
缺少UserID
41010
缺少url
41011
缺少agentid
41012
缺少应用头像mediaid
41013
缺少应用名字
41014
缺少应用描述
41015
缺少Content
41016
缺少标题
41017
缺少标签ID
41018
缺少标签名字
42001
access_token超时
42002
refresh_token超时
42003
oauth_code超时
42004
插件token超时
43001
需要GET请求
43002
需要POST请求
43003
需要HTTPS
43004
需要接收者关注
43005
需要好友关系
43006
需要订阅
43007
需要授权
43008
需要支付授权
43009
需要认证
43010
需要处于回调模式
43011
需要企业授权
44001
多媒体文件为空
44002
POST的数据包为空
44003
图文消息内容为空
44004
文本消息内容为空
45001
多媒体文件大小超过限制
45002
消息内容超过限制
45003
标题字段超过限制
45004
描述字段超过限制
45005
链接字段超过限制
45006
图片链接字段超过限制
45007
语音播放时间超过限制
45008
图文消息超过限制
45009
接口调用超过限制
45010
创建菜单个数超过限制
45015
回复时间超过限制
45016
系统分组,不允许修改
45017
分组名字过长
45018
分组数量超过上限
46001
不存在媒体数据
46002
不存在的菜单版本
46003
不存在的菜单数据
46004
不存在的员工
47001
解析JSON/XML内容错误
48002
Api禁用
50001
redirect_uri未授权
50002
员工不在权限范围
50003
应用已停用
50004
员工状态不正确(未关注状态)
50005
企业已禁用
60001
部门长度不符合限制
60002
部门层级深度超过限制
60003
部门不存在
60004
父亲部门不存在
60005
不允许删除有成员的部门
60006
不允许删除有子部门的部门
60007
不允许删除根部门
60008
部门名称已存在
60009
部门名称含有非法字符
60010
部门存在循环关系
60011
管理员权限不足,(user/department/agent)无权限
60012
不允许删除默认应用
60013
不允许关闭应用
60014
不允许开启应用
60015
不允许修改默认应用可见范围
60016
不允许删除存在成员的标签
60017
不允许设置企业
60102
UserID已存在
60103
手机号码不合法
60104
手机号码已存在
60105
邮箱不合法
60106
邮箱已存在
60107
微信号不合法
60108
微信号已存在
60109
QQ号已存在
60110
部门个数超出限制
60111
UserID不存在
60112
成员姓名不合法
60113
身份认证信息(微信号/手机/邮箱)不能同时为空
60114
性别不合法