本文包含了企业号回调企业时加解密的详细方案、库和示例代码的下载,以及企业号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 | 性别不合法 |
本文详细介绍企业号回调加解密方案,包括术语定义、消息签名验证、加解密流程及示例代码下载。提供了C++、Python、PHP、Java和C#等多种语言的加解密库。
3391

被折叠的 条评论
为什么被折叠?



