厚积薄发 发表于 2015-4-11 11:53:59

消息体签名与加解密-接入指引

消息体签名与加解密-接入指引
该文档讲述如何使用示例代码接入加解密,参考本文档并使用示例代码,加解密的接入将非常简单。若想进一步的了解细节,请查看技术方案。微信公众平台提供了C++、php、Java、Python和C# 5种语言的示例代码,每种语言的类名和接口名均一致,下面以C++为例说明:
函数说明构造函数
   // @param sToken: 公众平台上,开发者设置的Token   // @param sEncodingAESKey: 公众平台上,开发者设置的EncodingAESKey   // @param sAppid: 公众号的appid   WXBizMsgCrypt(const std::string &sToken,                  const std::string &sEncodingAESKey,                  const std::string &sAppid);
解密函数
   // 检验消息的真实性,并且获取解密后的明文   // @param sMsgSignature: 签名串,对应URL参数的msg_signature   // @param sTimeStamp: 时间戳,对应URL参数的timestamp   // @param sNonce: 随机串,对应URL参数的nonce   // @param sPostData: 密文,对应POST请求的数据   // @param sMsg: 解密后的明文,当return返回0时有效   // @return: 成功0,失败返回对应的错误码   int DecryptMsg(const std::string &sMsgSignature,                   const std::string &sTimeStamp,                   const std::string &sNonce,                   const std::string &sPostData,                   std::string &sMsg);
                                        加密函数
   //将公众号回复用户的消息加密打包   // @param sReplyMsg:公众号待回复用户的消息,xml格式的字符串   // @param sTimeStamp: 时间戳,可以自己生成,也可以用URL参数的timestamp   // @param sNonce: 随机串,可以自己生成,也可以用URL参数的nonce   // @param sEncryptMsg: 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串,当return返回0时有效   // return:成功0,失败返回对应的错误码   int EncryptMsg(const std::string &sReplyMsg,                   const std::string &sTimeStamp,                   const std::string &sNonce,                   std::string &sEncryptMsg); 使用方法在安全模式或兼容模式下,url上会新增两个参数encrypt_type和msg_signature。encrypt_type表示加密类型,msg_signature:表示对消息体的签名。url上无encrypt_type参数或者其值为raw时表示为不加密;encrypt_type为aes时,表示aes加密(暂时只有raw和aes两种值)。公众帐号开发者根据此参数来判断微信公众平台发送的消息是否加密。
兼容模式和安全模式加解密的方法完全一样,兼容模式的xml消息体比安全模式多了几个明文字段,具体请查看《消息加解密详细技术方案》。

实例化对象
使用构造函数,实例化一个对象,传入公众帐号的token, appid, EncodingAESKey。

解密
安全模式或者兼容模式下,公众号收到以下带密文消息体(“……”表示兼容模式下的明文字段):
encrypt_msg = <xml>        <ToUserName><!]></ToUserName>        ……        <Encrypt><!]></Encrypt></xml>
调用DecryptMsg接口,传入收到的url上的参数:msg_signature(注意:不是signature,而是msg_signature), timestamp, nonce和接收到的encrypt_msg,若调用成功,sMsg则为输出结果,其内容为如下的明文的xml消息体:
<xml>        <ToUserName><!]></ToUserName>        <FromUserName><!]></FromUserName>         <CreateTime>1411035097</CreateTime>        <MsgType><!]></MsgType>        <Content><!]></Content>        <MsgId>6060349595123187712</MsgId></xml>公众帐号处理消息
生成需要回复给微信公众平台的xml消息体,假设回复以下内容:
res_msg = <xml>            <ToUserName><!]></ToUserName>        <FromUserName><!]></FromUserName>        <CreateTime>1411034505</CreateTime>        <MsgType><!]></MsgType>        <Content><!]></Content>        <FuncFlag>0</FuncFlag></xml>回包加密
调用EncryptMsg接口,传入需要回复给微信公众平台的res_msg, timestamp, nonce,若加密成功,则sEncryptMsg为密文消息体,内容如下:
<xml>        <Encrypt><!]></Encrypt>        <MsgSignature><!]></MsgSignature>        <TimeStamp>1411034505</TimeStamp>        <Nonce><!]></Nonce></xml> 注意事项
[*]EncodingAESKey长度固定为43个字符,从a-z,A-Z,0-9共62个字符中选取。 公众帐号可以在公众平台的开发者中心的服务器配置修改
[*]出于安全考虑,公众平台网站提供了修改EncodingAESKey的功能(在EncodingAESKey可能泄漏时进行修改),所以建议公众账号保存当前的和上一次的EncodinAESKey,若当前EncodingAESKey解密失败,则尝试用上一次的EncodingAESKey的解密。回包时,用哪个Key解密成功,则用此Key加密对应的回包
[*]兼容模式消息体同时存在明文和密文,消息体会增至以前的3倍左右,开发者注意检查系统,防止因消息变长和URL参数增加而出现接收错误
[*]如果url上无encrypt_type参数或者其值为raw,则回复明文,否则回复密文。兼容模式期间公众账号回复明文或密文均可(不要两种类型都回)
函数错误返回码
函数返回码说明
0 处理成功
-40001 校验签名失败
-40002 解析xml失败
-40003 计算签名失败
-40004 不合法的AESKey
-40005 校验AppID失败
-40006 AES加密失败
-40007 AES解密失败
-40008 公众平台发送的xml不合法
-40009 Base64编码失败
-40010 Base64解码失败
-40011 公众帐号生成回包xml失败

示例代码下载微信公众平台为开发者提供了5种语言的示例代码(包括C++、php、Java、Python和C#版本)点击下载 ../static/assets/a5a22f38cb60228cb32ab61d9e4c414b.zip
微信公众平台接口调试工具点击进入 http://mp.weixin.qq.com/debug

消息体签名与加解密-接入指引
摘自:http://mp.weixin.qq.com/wiki/0/61c3a8b9d50ac74f18bdf2e54ddfc4e0.html

页: [1]
查看完整版本: 消息体签名与加解密-接入指引