
實現步驟:
第一步:填寫服務器配置
登錄微信公眾平台官網后,在公眾平台后台管理頁面 - 開發者中心頁,點擊“修改配置”按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信消息和事件的接口URL。Token可由開發者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作消息體加解密密鑰。
同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。模式的選擇與服務器配置在提交后都會立即生效,請開發者謹慎填寫及選擇。加解密方式的默認狀態為明文模式,選擇兼容模式和安全模式需要提前配置好相關加解密代碼,詳情請參考消息體簽名及加解密部分的文檔。
第二步:驗證服務器地址的有效性
開發者提交信息后,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。
加密/校驗流程如下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信。
利用修改配置中的提交驗證TOKEN是否驗證成功!(寫好代碼上傳的到服務器,直接提交配置就行,配置的路徑要保證和URL
一致)
//判斷是介入還是用戶 只有第一次介入的時候才會返回echostr
public function index(){
//這個echostr呢 只有說驗證的時候才會echo 如果是驗證過之后這個echostr是不存在的字段了
$echoStr = $_GET["echostr"];
if ($this->checkSignature()) {
echo $echoStr;
//如果你不知道是否驗證成功 你可以先echo echostr 然后再寫一個東西
exit;
}
}
//驗證微信開發者模式接入是否成功
private function checkSignature(){
//signature 是微信傳過來的 類似於簽名的東西
$signature = $_GET["signature"];
//微信發過來的東西
$timestamp = $_GET["timestamp"];
//微信傳過來的值 什么用我不知道...
$nonce = $_GET["nonce"];
//定義你在微信公眾號開發者模式里面定義的token
$token = "kudiansbao12";
//三個變量 按照字典排序 形成一個數組
$tmpArr = array(
$token,
$timestamp,
$nonce
);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
//哈希加密 在laravel里面是Hash::
$tmpStr = sha1($tmpStr);
//按照微信的套路 給你一個signature沒用是不可能的 這里就用得上了
if ($tmpStr == $signature) {
return true; //一定要返回 不要echo 負責微信拿不到返回值導致不通過
} else {
return false;
}
}// checkSignature end
