微信公衆平台目前有訂閱号、服務号、企業号三種類型。接入的方式分為明文、相容和密文三種。明文模式下,不使用消息體加解密功能,安全系數較低。相容模式下,明文、密文将共存,友善開發者調試和維護安全模式下,消息包為純密文,需要開發者加密和解密,安全系數高。推薦使用安全模式。微信背景對要發送的消息進行AES-CBC加密,具體使用的是SHA1算法。三種類型公衆号的接入原理都是一樣的。
注意事項:接入驗證TOKEN的過程中,微信背景會額外帶上3個參數:signature、timestamp(時間戳)、nonce(随機數)。signature是對timestamp、nonce和TOKEN進行SHA1加密運算後的字元串。我們自己的伺服器收到上面三個參數後,同樣适用SHA1運算得到自己的簽名signature,并将結果與微信背景提供的簽名signature進行比較,一緻那麼接入成功。不一緻可通過微信官方提供的接口調試工具進行調試。
下面是明文接入和密文接入的兩種PHP源代碼。僅供參考。
//接入公衆号驗證基類
class wechatlogin
{
public function valid()
{
echoStr= _GET[“echostr”];
//驗證簽名是否有效 , 用于判斷是否為接入驗證請求。
if($this->checkSignature())
{
echo $echoStr;
exit;
}
}
private function checkSignature()
{
if (!defined("TOKEN"))
{
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
//比較兩個簽名是否一緻
if( $tmpStr == $signature )
{
return true;
}else
{
return false;
}
}
};