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

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

微信UI的坑。在你通過(guò)上面的測(cè)試后,并不真正代表你啟用了服務(wù)器。而是在你保存后要點(diǎn)擊啟用,然后看到紅色 停用 才真正的是真正的啟用了。
白名單坑。你一定要去到微信的安全中心設(shè)置你的服務(wù)器的白名單.否則之后的開(kāi)發(fā)工作會(huì)有阻礙。
公眾號(hào)設(shè)置坑。你一定要去微信的公眾號(hào)設(shè)置里面加入你的:
- 業(yè)務(wù)域名
- JS接口安全域名
- 網(wǎng)頁(yè)授權(quán)域名
結(jié)語(yǔ)
微信開(kāi)發(fā)有挑戰(zhàn),細(xì)心最關(guān)鍵。遇到問(wèn)題不要慌,來(lái)看哥文章。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- thinkphp5框架API token身份驗(yàn)證功能示例
- php版微信開(kāi)發(fā)Token驗(yàn)證失敗或請(qǐng)求URL超時(shí)問(wèn)題的解決方法
- PHP token驗(yàn)證生成原理實(shí)例分析
- php token使用與驗(yàn)證示例【測(cè)試可用】
- PHP實(shí)現(xiàn)防止表單重復(fù)提交功能【基于token驗(yàn)證】
- 詳解php curl帶有csrf-token驗(yàn)證模擬提交方法
- Thinkphp5 微信公眾號(hào)token驗(yàn)證不成功的原因及解決方法
- 關(guān)于php微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的問(wèn)題
- 驗(yàn)證token、回復(fù)圖文\文本、推送消息的實(shí)用微信類php代碼
- php中關(guān)于token驗(yàn)證的相關(guān)問(wèn)題詳解
相關(guān)文章
Laravel創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)的例子
今天小編就為大家分享一篇Laravel創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
WordPress后臺(tái)中實(shí)現(xiàn)圖片上傳功能的實(shí)例講解
這篇文章主要介紹了WordPress后臺(tái)中實(shí)現(xiàn)圖片上傳功能的實(shí)例講解,包括多個(gè)圖片上傳表單功能的實(shí)現(xiàn),需要的朋友可以參考下2016-01-01
thinkphp5 + ajax 使用formdata提交數(shù)據(jù)(包括文件上傳) 后臺(tái)返回json完整實(shí)例
這篇文章主要介紹了thinkphp5 + ajax 使用formdata提交數(shù)據(jù)(包括文件上傳) 后臺(tái)返回json操作,結(jié)合實(shí)例形式分析了thinkphp5 + ajax 使用formdata提交數(shù)據(jù)、文件上傳與后臺(tái)返回json遇到的相關(guān)問(wèn)題即解決方法,需要的朋友可以參考下2020-03-03
yii2框架中使用下拉菜單的自動(dòng)搜索yii-widget-select2實(shí)例分析
這篇文章主要介紹了yii2框架中使用下拉菜單的自動(dòng)搜索yii-widget-select2的方法,介紹了yii-widget-select2的下載,安裝及具體使用技巧,需要的朋友可以參考下2016-01-01
對(duì)laravel的session獲取與存取方法詳解
今天小編就為大家分享一篇對(duì)laravel的session獲取與存取方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
Laravel關(guān)聯(lián)模型中過(guò)濾結(jié)果為空的結(jié)果集(has和with區(qū)別)
這篇文章主要介紹了Laravel關(guān)聯(lián)模型中過(guò)濾結(jié)果為空的結(jié)果集(has和with區(qū)別),需要的朋友可以參考下2018-10-10

