本文包含了企业号回调企业时加解密的详细方案、库和示例代码的下载,以及企业号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 性别不合法