关键字:微信公众平台 消息体签名 消息体加解密 EncodingAESKey 安全模式
一、消息体加解密
微信公众平台在配置服务器时,提供了3种加解密的模式供开发者选择,即明文模式、兼容模式、安全模式,选择兼容模式和安全模式前,需在开发者中心填写消息加解密密钥EncodingAESKey。
明文模式:维持现有模式,没有适配加解密新特性,消息体明文收发,默认设置为明文模式
兼容模式:公众平台发送消息内容将同时包括明文和密文,消息包长度增加到原来的3倍左右;公众号回复明文或密文均可,不影响现有消息收发;开发者可在此模式下进行调试
安全模式(推荐):公众平台发送消息体的内容只含有密文,公众账号回复的消息体也为密文,建议开发者在调试成功后使用此模式收发消息
什么是EncodingAESKey?
微信公众平台采用AES对称加密算法对推送给公众帐号的消息体对行加密,EncodingAESKey则是加密所用的秘钥。公众帐号用此秘钥对收到的密文消息体进行解密,回复消息体也用此秘钥加密。AES对称加密算法的原理可以参考 http://www.cnblogs.com/txw1958/p/aes.html
加解密的详细技术方案可以参考官方文档 http://mp.weixin.qq.com/wiki/index.php?title=%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88
二、开发实现及数据分析
1. 配置
假设本次的开发配置中URL为
http://www.fangbei.org/index.php
接口程序中需要配置以下三项参数
/*方倍工作室 http://www.cnblogs.com/txw1958/
CopyRight 2014 All Rights Reserved*/
define("TOKEN", "weixin");define("AppID", "wxbad0b45542aa0b5e");define("EncodingAESKey", "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG");require_once('wxBizMsgCrypt.php');
2. 加解密实现
当用户向公众账号发送消息时,微信公众账号将会在URL中带上signature、timestamp、nonce、encrypt_type、msg_signature等参数,如下所示
http://www.fangbei.org/index.php?signature=35703636de2f9df2a77a662b68e521ce17c34db4×tamp=1414243737&nonce=1792106704&encrypt_type=aes&msg_signature=6147984331daf7a1a9eed6e0ec3ba69055256154
同时向该接口推送如下XML消息 ,即一个已加密的消息
这时,程序需要从url中获得以下参数
$timestamp = $_GET['timestamp'];$nonce = $_GET["nonce"];$msg_signature = $_GET['msg_signature'];$encrypt_type = $_GET['encrypt_type'];
这些参数将用于加解密过程
收到消息后,先进行解密,解密部分代码如下
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];if ($encrypt_type ==