因为最近需要写一个微信的小东西去参加比赛,所以今天就开始正儿八经的写一下博文,号之前申请了,就不说申请号的一部分了。
之前使用的都是未加密的明文模式,由于比赛要求,必须使用加密模式,所以只好学学加密模式。
先是服务器配置,先将服务器如图配置
配置微信响应文件:
define("TOKEN", "hmcome"); //设置token
define("AppID", "wx4***********");//设置APPID
define("EncodingAESKey", "x2q***************************");//设置加密密钥
require_once(‘wxBizMsgCrypt.php‘);//引用消息加密解密包 注意:加密解密包里又引用了多个文件
当用户向公众账号发送消息时,微信公众账号将会在URL中带上signature、timestamp、nonce、encrypt_type、msg_signature等参数,如下所示
http://www.xxx.com/index.php?signature=35703636de2f9df2a77a662b68e521ce17c34db4×tamp=1414243737&nonce=1792106704&encrypt_type=aes&msg_signature=6147984331daf7a1a9eed6e0ec3ba69055256154 加密解密原理简单,就是在微信给你响应的时候是一串密文信息,当到了开发者这里就先解密,解密进行处理了过后再用密文的方式返回给用户。 检查签名的完整代码:
public function responseMsg()
{
$timestamp = $_GET[‘timestamp‘];
$nonce = $_GET["nonce"];
$msg_signature = $_GET[‘msg_signature‘];
$encrypt_type = (isset($_GET[‘encrypt_type‘]) && ($_GET[‘encrypt_type‘] == ‘aes‘)) ? "aes" : "raw";
//检查加密否
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
//如果是加密的文本,就将他先解密
if ($encrypt_type == ‘aes‘){
$pc = new WXBizMsgCrypt(TOKEN, EncodingAESKey, AppID);
$decryptMsg = ""; //解密后的明文
$errCode = $pc->DecryptMsg($msg_signature, $timestamp, $nonce, $postStr, $decryptMsg);
$postStr = $decryptMsg;
}
//解密结束
$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
//消息分离,判断是文本还是事件
switch ($RX_TYPE)
{
case "text":
$resultStr = $this->receiveText($postObj);
break;
case "event":
$resultStr = $this->receiveEvent($postObj);
break;
default:
$resultStr = "";
break;
}
//响应完了过后再把消息加密
if ($encrypt_type == ‘aes‘){
$encryptMsg = ‘‘; //加密后的明文
$errCode = $pc->encryptMsg($resultStr, $timestamp, $nonce, $encryptMsg);
$postStr = $encryptMsg;
}
//加密结束
echo $resultStr;
}else {
echo "";
exit;
}
}