首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》22.5.1 消息加解密

关灯直达底部

开发者在代替授权公众号接收和处理消息时,出于安全考虑,必须对消息收发的过程进行加解密。

消息加解密的实现流程如下。

接口程序中需要配置以下参数。


define("AppID",             "wx2ae3853dda623211");define("AppSecret",         "df8a05425d4ba95405fb1b048704373e");define("Token",              "weixin");define("EncodingAESKey",   "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG");  

当用户向公众号发送消息时,微信开放平台应用将会在URL中带上appid、signature(签名)、timestamp(时间戳)、nonce(随机数)、openid、encrypt_type(加密类型)、msg_signature(消息签名)等参数,具体如下。


http:// open.fangbei.org/wxopen/msg.php?appid=/wx570bc396a51b8ff8&signature=e4195d494e304fbdc19fb4d58e18b967cb5b4b02&timestamp=1465799535&nonce=734775080&openid=ozy4qt1eDxSxzCr0aNT0mXCWfrDE&encrypt_type=aes&msg_signature=e5574ec67f7f429b8c7793ebc0b493fd977c682d  

同时向该接口推送如下XML消息,即一个已加密的消息。


<xml>    <ToUserName><![CDATA[gh_3c884a361561]]></ToUserName>    <Encrypt><![CDATA[yCaK/BzoYXNNB8IkHauQqH5ozAmUjm8SLfg29ZMmkavy92e4txPGl5NsKCfGlW    yMyWzYRRvlND3rDfXJXr0ddmJ34yolWHgFpLmKDpVlox+3atfzRwPPdqukSqA2XVtVwIKFiSKLdvaagj6    wMWXIsqyvmZXZWfEg9QwR1TSgLH46ZnQS1EyEd7qhYpCMGicYgjEeWw6KKQD9/604QlW3zh8oIKy51Oy9    MaGLiDrZrHC8C5x8iqFH48rhGMDk4f8uDMl3IdA/f+4vdERp0/fGWLSi8ZKWb9P5Z3E8OUBAiEcCQ2nmc    PRheJQBIZKH0g1YLNdpr0t08i2LvZniNfPJ/uS+IuPcMjP9RjEz9n4kAnFgiuyB6cocIZfYE8M6I/nrwv    VZepQP6vAZaaetrCZn+PdEAhHoWTl/KOHbJ7Vv+F8L2D1pbajgc3IWHBnyNF2dKtp/ctr9ZzQGtyszhAs    gTq9W1bbdySFM5ra5k3IUY13EFWX3hFYYubV9SiUhj7r9soVBFwUeMIqJYnWU63M+BYR33rFTBui1kwQS    x5LOHlYbWMY+6xjhKEqB5qcKmPhr9x7XHtXCJ4i4bqFPqjvnog==]]></Encrypt></xml>  

这时程序需要从URL中获得以下参数,以及接收微信传送的POST内容。


$signature  = $_GET['signature'];$timestamp  = $_GET['timestamp'];$nonce = $_GET['nonce'];$encrypt_type = $_GET['encrypt_type'];$msg_signature  = $_GET['msg_signature'];$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  

这些参数将用于加解密过程。

接口程序收到消息后,先进行解密,解密部分代码如下。


// 解密if ($encrypt_type == 'aes'){    $pc = new WXBizMsgCrypt(Token, EncodingAESKey, AppID);    $this->logger(" D /r/n".$postStr);    $decryptMsg = "";  // 解密后的明文    $errCode = $pc->DecryptMsg($msg_signature, $timestamp, $nonce, $postStr, $decryptMsg);    $postStr = $decryptMsg;}  

解密后的XML如下。


<xml>    <ToUserName><![CDATA[gh_3c884a361561]]></ToUserName>    <FromUserName><![CDATA[ozy4qt1eDxSxzCr0aNT0mXCWfrDE]]></FromUserName>    <CreateTime>1465799534</CreateTime>    <MsgType><![CDATA[text]]></MsgType>    <Content><![CDATA[QUERY_AUTH_CODE:[email protected]@@cdGgIgvWgYbXn3iqXM2NHkrMF09p    sBBScXQoEdLFSnGxmtZlmXknhcImp7jFFDKRx2RBTac2GbLycTnJ1Yo0qQ]]></Content>    <MsgId>6295561061426473714</MsgId></xml>  

对消息在自己原有的代码流程中处理,完成之后,一个要回复的文本消息如下。


<xml>    <ToUserName><![CDATA[ozy4qt1eDxSxzCr0aNT0mXCWfrDE]]></ToUserName>    <FromUserName><![CDATA[gh_3c884a361561]]></FromUserName>    <CreateTime>1465799535</CreateTime>    <MsgType><![CDATA[text]]></MsgType>    <Content><![CDATA]></Content></xml>  

对上述消息进行加密,返回给微信公众号,加密过程如下。


// 加密if ($encrypt_type == 'aes'){    $encryptMsg = ''; // 加密后的密文    $errCode = $pc->encryptMsg($result, $timeStamp, $nonce, $encryptMsg);    $result = $encryptMsg;    $this->logger(" E /r/n".$result);}  

加密后的内容如下。


<xml>    <Encrypt><![CDATA[h/umYlxmksaCoeNwPIlm65KbTucdBAUFxn10ke/kPmtngKzfQ5J04jgEdZekLeuyy    tVJLz1z9jsrPA41n8z7vg==]]></Encrypt>    <MsgSignature><![CDATA[e3f0922ff7649f338c49c595d5c39aaa08184bcd]]></MsgSignature>    <TimeStamp>1465799531</TimeStamp>    <Nonce><![CDATA[734775080]]></Nonce></xml>  

这样一个安全模式下的加解密消息就完成了。