# 概述

第三方平台开发者在代替授权小程序接收和处理消息时,出于安全考虑,必须对消息内容进行必须的加解密。

本文讲述如何使用示例代码接入加解密,参考本文并使用示例代码,加解密的接入将非常简单。若想进一步的了解细节,请查看 《小程序第三方平台的加密解密技术方案》

首先请注意,开发者在接收消息和事件时,都需要进行消息加解密(某些事件可能需要回复,回复时也需要先进行加密)。但是,通过 API 主动调用接口(包括调用客服消息接口发消息)时,不需要进行加密。

第三方平台可能会接收到两种类型的消息:

  1. 用户发送给小程序的消息(由第三方平台代收)。此时,消息 XML 体中,ToUserName(即接收者)为小程序原始 ID。
  2. QQ服务器发送给第三方平台自身的通知或事件推送(如取消授权通知,component_verify_ticket 推送等)。此时,消息 XML 体中没有 ToUserName 字段,而是 AppId 字段,即第三方平台的 AppId。这种系统事件推送通知,服务开发者收到后也需进行解密,接收到后只需直接返回字符串 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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>

1
2
3
4
5
6
7
8
9
10
11

2. 注意事项

1.EncodingAESKey 长度固定为 43 个字符,从 a-z,A-Z,0-9 共 62 个字符中选取。

2.出于安全考虑,开放平台网站提供了修改 EncodingAESKey 的功能(在 EncodingAESKey 可能泄漏时进行修改),所以建议公众账号保存当前的和上一次的 EncodingAESKey,若当前 EncodingAESKey 解密失败,则尝试用上一次的 EncodingAESKey 的解密。回包时,用哪个 Key 解密成功,则用此 Key 加密对应的回包。