第三方平台开发者在代替授权小程序接收和处理消息时,出于安全考虑,必须对消息内容进行必须的加解密。
本文讲述如何使用示例代码接入加解密,参考本文并使用示例代码,加解密的接入将非常简单。若想进一步的了解细节,请查看 《小程序第三方平台的加密解密技术方案》
首先请注意,开发者在接收消息和事件时,都需要进行消息加解密(某些事件可能需要回复,回复时也需要先进行加密)。但是,通过 API 主动调用接口(包括调用客服消息接口发消息)时,不需要进行加密。
第三方平台可能会接收到两种类型的消息:
success
。具体消息加解密的做法是,当关注者与已授权小程序进行交互时,小程序第三方平台将接收到相应的消息推送、事件推送。为了加强安全性,将对此过程进行 2 个措施:
1、在接收已授权小程序消息和事件的 URL 中,增加 2 个参数(此前已有 2 个参数,为时间戳 timestamp,随机数 nonce),分别是 encrypt_type(加密类型,为 aes)和 msg_signature(消息体签名,用于验证消息体的正确性)
2、postdata 中的 XML 体,将使用第三方平台申请时的接收消息的加密 symmetric_key(也称为 EncodingAESKey)来进行加密。
1 解密
安全模式下,第三方平台方收到以下带密文消息体:
encrypt_msg =
调用示例代码中的 DecryptMsg 函数(需传入 msg_signature、timetamp、nonce 和 postdata,前 3 个参数可从接收已授权小程序消息和事件的 URL 中获得,postdata 即为 POST 过来的数据包内容),若调用成功,sMsg 则为输出结果,其内容为如下的明文的 xml 消息体:
<xml>
<ToUserName>
</ToUserName>
<FromUserName>
</FromUserName>
<CreateTime>
1411035097</CreateTime>
<MsgType>
</MsgType>
<Content>
</Content>
<MsgId>
6060349595123187712</MsgId>
</xml>
1.1 公众帐号处理消息,生成需要回复给QQ小程序平台的 xml 消息体,假设回复以下内容: res_msg =
2.2 回包加密
调用 EncryptMsg 接口,传入需要回复给QQ小程序平台的 res_msg, timestamp, nonce, 若加密成功,则 sEncryptMsg 为密文消息体,内容如下:
<xml>
<Encrypt>
</Encrypt>
<MsgSignature>
</MsgSignature>
<TimeStamp>
1411034505</TimeStamp>
<Nonce>
</Nonce>
</xml>
2. 注意事项
1.EncodingAESKey 长度固定为 43 个字符,从 a-z,A-Z,0-9 共 62 个字符中选取。
2.出于安全考虑,开放平台网站提供了修改 EncodingAESKey 的功能(在 EncodingAESKey 可能泄漏时进行修改),所以建议公众账号保存当前的和上一次的 EncodingAESKey,若当前 EncodingAESKey 解密失败,则尝试用上一次的 EncodingAESKey 的解密。回包时,用哪个 Key 解密成功,则用此 Key 加密对应的回包。