转载

微信企业号开发之加密方案与全局返回码说明

本文包含了企业号回调企业时加解密的详细方案、库和示例代码的下载,以及企业号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签名验证错误
-40002xml解析失败
-40003sha加密生成签名失败
-40004AESKey 非法
-40005corpid 校验错误
-40006AES 加密失败
-40007AES 解密失败
-40008解密后得到的buffer非法
-40009base64加密失败
-40010base64解密失败
-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

注意事项:

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不合法的插件会话
40048url中包含不合法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
40074news消息不支持指定为高保密消息
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缺少标签名字
42001access_token超时
42002refresh_token超时
42003oauth_code超时
42004插件token超时
43001需要GET请求
43002需要POST请求
43003需要HTTPS
43004需要接收者关注
43005需要好友关系
43006需要订阅
43007需要授权
43008需要支付授权
43009需要认证
43010需要处于回调模式
43011需要企业授权
44001多媒体文件为空
44002POST的数据包为空
44003图文消息内容为空
44004文本消息内容为空
45001多媒体文件大小超过限制
45002消息内容超过限制
45003标题字段超过限制
45004描述字段超过限制
45005链接字段超过限制
45006图片链接字段超过限制
45007语音播放时间超过限制
45008图文消息超过限制
45009接口调用超过限制
45010创建菜单个数超过限制
45015回复时间超过限制
45016系统分组,不允许修改
45017分组名字过长
45018分组数量超过上限
46001不存在媒体数据
46002不存在的菜单版本
46003不存在的菜单数据
46004不存在的员工
47001解析JSON/XML内容错误
48002Api禁用
50001redirect_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不允许设置企业
60102UserID已存在
60103手机号码不合法
60104手机号码已存在
60105邮箱不合法
60106邮箱已存在
60107微信号不合法
60108微信号已存在
60109QQ号已存在
60110部门个数超出限制
60111UserID不存在
60112成员姓名不合法
60113身份认证信息(微信号/手机/邮箱)不能同时为空
60114性别不合法
文章最后发布于: 2016-01-12 14:12:31
展开阅读全文
0 个人打赏
私信求帮助
曾参与过风云系列卫星、碳卫星、子午工程、嫦娥等项目的数据处理工作;有超10年大型项目的开发经验。 专栏收入了作者为Python爱好者精心打造的多篇文章,从小白入门学习的基础语法、基础模块精讲等内容外,还提出了“Python语感训练”的概念和方法,不仅为初学者提供了进阶之路,有一定基础的程序员亦可从中受益。后续,本专栏还将加入2D/3D应用开发、数据处理、实战项目等精品内容,敬请期待。
xufive ¥3.80 1626人订阅

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览