本文包含了企业号回调企业时加解密的详细方案、库和示例代码的下载,以及企业号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。
#p#
二、加解密库下载和返回码
1、加解密库的返回码
返回码 | 说明 |
---|---|
0 | 请求成功 |
-40001 | 签名验证错误 |
-40002 | xml解析失败 |
-40003 | sha加密生成签名失败 |
-40004 | AESKey 非法 |
-40005 | corpid 校验错误 |
-40006 | AES 加密失败 |
-40007 | AES 解密失败 |
-40008 | 解密后得到的buffer非法 |
-40009 | base64加密失败 |
-40010 | base64解密失败 |
-40011 | 生成xml失败 |
2、加解密库下载及示例
注意事项:
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
注意事项:
1)WXBizMsgCrypt.py文件封装了WXBizMsgCrypt接口类,提供了用户接入企业微信的三个接口,Sample.py文件提供了如何使用这三个接口的示例,ierror.py提供了错误码。
2)WXBizMsgCrypt封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.py文件。
3)本代码用到了pycrypto第三方库,请开发者自行安装此库再使用。
注意事项:
1)WXBizMsgCrypt.php文件提供了WXBizMsgCrypt类的实现,是用户接入企业微信的接口类。Sample.php提供了 示例以供开发者参考。errorCode.php, pkcs7Encoder.php, sha1.php, xmlparse.php文件是实现这个类的辅助类,开发者无须关心其具体实现。
2)WXBizMsgCrypt类封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.php文件。
注意事项:
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目录 下覆盖原来文件。
注意事项:
1)Cryptography.cs文件封装了AES加解密过程,用户无须关心具体实现。WXBizMsgCrypt.cs文件提供了用户接入企业微信的三个接口,Sample.cs文件提供了如何使用这三个接口的示例。
2)WXBizMsgCrypt.cs封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.cs文件。
#p#
三、全局返回码说明
企业号每次调用接口时,可能获得正确或错误的返回码,企业可以根据返回码信息调试接口,排查错误。
全局返回码说明如下:
返回码 | 说明 |
---|---|
-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 | 性别不合法 |