PHP實現(xiàn)微信公眾號驗證Token的示例代碼
- 難度水平:初中級
- 適用人群:對微信公眾號開發(fā)有認知跟實踐的童鞋
- 閱讀時間:8分鐘
緣起
很久之前做過一次公眾號的開發(fā),當時就遇到了一個驗證的小坑,但是由于時間緊任務急處理完了也就沒在意,可誰知最近剛剛上馬一個新的公眾號項目又遇到了同樣的小坑,痛定思痛決定奮筆疾書留下痕跡,省的以后再次忘記了。😁
開始驗證
首先來一張勝過千言萬語的圖,說明我們要驗證的目標:

然后開始掃坑。先掃個盲,微信驗證的目的就是你來證明你的服務器地址的有效性,所以帶著這個目的我們來看看下面這些問題:
- URL地址怎么寫
- 純PHP的代碼怎么寫
- Laravel的代碼怎么寫
- 常見的坑是什么
URL地址怎么寫
這個地址可以是路由地址也可以是文件地址:
路由地址形式:
https://mydomain.com/wx,
https://mydomain.com/auth/wx,
https://mydomain.com/utility/wx
文件地址形式:
https://mydomain.com/mywechat...
https://mydomain.com/auth/myw...
https://mydomain.com/utility/...
敲黑板,劃重點:
無論哪種形式都可以,重點是可以直接通過GET或者POST訪問到
純PHP的代碼怎么寫
通常來說純代碼就是非框架的php代碼驗證方式,廢話少說,直接上酸菜:
/*這個是你自定義的令牌,圖片里面Token的位置*/
define("TOKEN", "這個是你自定義的令牌");
/*初始化當前的類*/
$wechatObj = new wechatCallbackapiTest();
/*開始驗證程序*/
$wechatObj->valid();
/**
* Class WXApiVerify
*/
class WXApiVerify
{
/**
* 檢測函數(shù)輸出
*/
public function valid()
{
$echoStr = $_GET['echostr'];
if($this->checkSignature()){
echo $echoStr; #坑點,看下面的常見坑介紹
exit; #一定要停止php運行,避免產(chǎn)生不必要的字串符
}
}
/**
* 前面檢測
* @return bool
*/
private function checkSignature()
{
#注意: 這里可以不用檢驗$_GET參數(shù)的有效性,因為微信一定會傳相關的參數(shù)給你的服務器的,你直接開啟驗證模式即可。
$signature = $_GET['signature'];
$timestamp = $_GET['imestamp'];
$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;
}
}
}
Laravel的代碼怎么寫
首先,強勢插個口播(在使用過TP5,CodeIgniter, CakePHP, Yii, Slim之后,我認為Laravel是目前來說最好的PHP框架,不接受其他任何意見。)
其次,驗證代碼上面是跟純PHP大同小異的,唯一的區(qū)別是在你處理POST請求的時候一定要讓Laravel不要檢測CSFR Token,否則會出現(xiàn)錯誤。
首先,設置路由:
Route::any('wx', [
'uses' => 'WeChatApp@checkSignature'
]);
#坑點,看下面的常見坑介紹
其次,取消Laravel的CSFR檢查:
#去到你的Middlewarel里面找到VerifyCsrfToken.php然后插入下面代碼:
protected $except = [
'wx', #注意這個是你在第一步設置的路由路徑,不接受單獨的文件路徑,太Low逼了
];
最后,上酸菜:
#在你對應的Controller里面加入以下函數(shù)
public function checkSignature( Request $request ) {
$input = $request->all();
# 一定要抓取4個參數(shù)
$echoStr = $input[ "echostr" ];
$signature = $input[ "signature" ];
$timestamp = $input[ "timestamp" ];
$nonce = $input[ "nonce" ];
# 微信官方驗證方式
$token = env( 'TOKEN' ); #或者用config()函數(shù)
$tmpArr = [ $token, $timestamp, $nonce ];
sort( $tmpArr, SORT_STRING );
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
# 打印返回結果
if( $tmpStr == $signature ){
return response($echoStr);
} else{
return response();
}
}
常見的坑是什么
文檔坑。有些人看過官方文檔之后直接就上代碼了,缺忽略了里面的一個參數(shù)echostr 隨機字符串 而這個恰恰是驗證服務器的關鍵點,你要打印這個返回給微信才能通過驗證。但是官方文檔說的不夠重點。
Laravel路由坑。一定要設置請求為any這樣包括(GET跟POST)
Laravel還有一個測試的坑,就是如果你的APP_DEBUG=false如果不是false的話可能會造成拋出多余的字串導致驗證失敗。
要學會使用微信官方測試工具 https://mp.weixin.qq.com/debug/ 選擇消息接口測試跟文本消息接口就行。其他的可以看圖說話

微信UI的坑。在你通過上面的測試后,并不真正代表你啟用了服務器。而是在你保存后要點擊啟用,然后看到紅色 停用 才真正的是真正的啟用了。
白名單坑。你一定要去到微信的安全中心設置你的服務器的白名單.否則之后的開發(fā)工作會有阻礙。
公眾號設置坑。你一定要去微信的公眾號設置里面加入你的:
- 業(yè)務域名
- JS接口安全域名
- 網(wǎng)頁授權域名
結語
微信開發(fā)有挑戰(zhàn),細心最關鍵。遇到問題不要慌,來看哥文章。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- thinkphp5框架API token身份驗證功能示例
- php版微信開發(fā)Token驗證失敗或請求URL超時問題的解決方法
- PHP token驗證生成原理實例分析
- php token使用與驗證示例【測試可用】
- PHP實現(xiàn)防止表單重復提交功能【基于token驗證】
- 詳解php curl帶有csrf-token驗證模擬提交方法
- Thinkphp5 微信公眾號token驗證不成功的原因及解決方法
- 關于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題
- 驗證token、回復圖文\文本、推送消息的實用微信類php代碼
- php中關于token驗證的相關問題詳解
相關文章
PHP設計模式(七)組合模式Composite實例詳解【結構型】
這篇文章主要介紹了PHP設計模式:組合模式Composite,結合實例形式詳細分析了PHP組合模式Composite基本概念、功能、原理、用法及操作注意事項,需要的朋友可以參考下2020-05-05
ThinkPHP5聯(lián)合(關聯(lián))查詢、多條件查詢與聚合查詢實例詳解
這篇文章主要介紹了ThinkPHP5聯(lián)合(關聯(lián))查詢、多條件查詢與聚合查詢,結合實例形式總結分析了thinkPHP5常用查詢操作技巧,需要的朋友可以參考下2017-11-11
thinkphp3查詢mssql數(shù)據(jù)庫亂碼解決方法分享
這篇文章主要介紹了thinkphp3查詢mssql數(shù)據(jù)庫亂碼解決方法,需要的朋友可以參考下2014-02-02
PHP內核學習教程之php opcode內核實現(xiàn)
opcode是計算機指令中的一部分,用于指定要執(zhí)行的操作, 指令的格式和規(guī)范由處理器的指令規(guī)范指定,通過本文給大家介紹PHP內核學習教程之php opcode內核實現(xiàn),感興趣的朋友一起學習吧2016-01-01
laravel5創(chuàng)建service provider和facade的方法詳解
這篇文章主要介紹了laravel5創(chuàng)建service provider和facade的方法,實例分析了laravel創(chuàng)建service、provider和facade類的具體步驟與實現(xiàn)技巧,需要的朋友可以參考下2016-07-07

