消息加/解密
简介
- 开发者在接收和处理消息时,出于安全考虑,必须对消息收发的过程进行必要的加解密。该文档讲述如何使用示例代码接入加解密,参考本文档并使用示例代码
- postdata中的XML体,将使用在小鹅云控制台配置的消息校验Token和消息加密key来进行加密
- 小鹅平台会将消息加密成xml格式推送到客户的回调地址上,客户只需要下载sdk进行解密即可
加密
消息加密后格式
<xml>
<Encrypt><![CDATA[onpMeY0hanKaXz0sKu5994Fn5LA/ckapXA6z1i5SPyegjPlHlXz7iBILhlQje9f2Y0xfXL/0lZZe0sSXUW+1ik83jO0U1+nT66AqXSAMO77cHRMI5bBDilXXzYKVjw7DLxKnAnKkvNg5F1DofrZKEkMdN02dN14kLiV30WPM+meAJcx91QbEtUonI6ABqiNqOzwJegpOolG5Tup8iT4mFw==]]></Encrypt>
<MsgSignature><![CDATA[46a085b52d26f352f9c887b349d9d2c16cac3050]]></MsgSignature>
<TimeStamp>1409304348</TimeStamp>
<Nonce><![CDATA[1214730348]]></Nonce>
</xml>
参数说明
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
Encrypt | 是 | string | 加密字符串 |
MsgSignature | 是 | string | 消息体签名 |
TimeStamp | 是 | number | 时间戳 |
Nonce | 是 | number | 随机数nonce |
解密(php示例)
- 引入SDK
- 使用如下方式解密
$xml_tree = new DOMDocument();
$xml_tree->loadXML($encryptMsg);
//获取XML中的数据
$array_e = $xml_tree->getElementsByTagName('Encrypt');
$array_m = $xml_tree->getElementsByTagName('MsgSignature');
$array_t = $xml_tree->getElementsByTagName('TimeStamp');
$array_n = $xml_tree->getElementsByTagName('Nonce');
//加密字符串
$encrypt = trim($array_e->item(0)->nodeValue);
//消息体签名
$msg_sign = trim($array_m->item(0)->nodeValue);
//时间戳
$timeStamp = trim($array_t->item(0)->nodeValue);
//随机数
$nonce = trim($array_n->item(0)->nodeValue);
$format = "<xml><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$from_xml = sprintf($format, $encrypt);
$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
说明
- php获取POST体中的xml数据,可以使用
file_get_contents('php://input')
,其他语言请自行查阅 - 由于XML参数格式的问题,解析出来的参数两边会自动多出空格,因此解析出来的 encrypt、msg_sign、timeStamp 和 nonce 四个参数需要做一下去掉两边的空格字符处理,php使用trim()即可,其他语言请自行查阅
Encrypt标签解密数据格式
当推送类型为 订单(order), 优惠券(coupons), 账号合并(account_merge), 用户注册(user_register),信息采集(info_collect) ,权益变更(role_change )时, 推送消息的
<Encrypt></Encrypt>
标签解密后没有<doc></doc>
根节点。由于一些强类型语言在解析xml时若没有根节点会解析出错,所以除了上述类型没有根节点,其他类型推送时均有<doc></doc>
根节点。无
<doc></doc>
根节点数据
<type>order</type>
<action>create</action>
...
<app_id>app123456</app_id>
- 有
<doc></doc>
根节点数据
<doc>
<type>order_change</type>
<action>create</action>
...
<app_id>app123456</app_id>
</doc>
消息加解密SDK下载(包含PHP、Java、Python等)
XiaoeSDK 下载链接