thinkphp整合企業號的坑

ThinkPHP 使用微信企業號回調的坑

最近在作企業號回調的接口,以前作過幾個企業號的應用了,每次接入到Thinkphp都報各類各樣的錯誤,算哥倒黴,該踩的不應踩的坑全踩了。
此次掉坑裏差點就放棄了,開發過企業號的都知道,企業號回調會通過一個加密的算法,要求開發者對此進行解密才能開啓回調,就是個這個回調,微信的錯誤提示極其霸道,無論你什麼錯,就一句話「 echostr校驗失敗,請您檢查是否正確解密並輸出明文echostr」。最起碼應該告訴一下開發者,微信收到的返回長度是多少,也好與本身的輸出進行校驗,若是長度都不一致,就更不用說內容了。php

若是你跟我同樣用了tp框架,那你要留意了,本文以Thinkphp3.2.3 php版本5.3爲例算法

坑1

  • 下載官方的處理接口的範例,放在Thinkphp>Library>Wechat(自建)目錄下微信

  • 修改WXBizMsgCrypt.php爲WXBizMsgCrypt.class.php框架

  • 在WXBizMsgCrypt中聲明命名空間namespace Wechat;函數

  • 在你須要的控制器中引入類use Wechat WXBizMsgCrypt;測試

以後就是使用官方的sample copy進你的項目簡單修改下就算整合完成了,過程挺簡單的,可是!在PHP5.3以前構造函數的寫法和PHP5.3以後有變化,構造函數不能再以類名看成函數名來命名,必需要使用__construct聲明一個構造函數,也就是說用官方的例子來整合是確定會報錯的,固然前提是你用的也是PHP5.3以後的版本。加密

因此還須要url

  • 修改WXBizMsgCrypt文件中WXBizMsgCrypt函數名,改成__constructspa

  • 修改pkcs7Encoder文件中pkcs7Encoder函數名,改成__constructcode

大功告成,可能不適用於低版本的Thinkphp 或者php5.3如下,我沒作過其餘版本的測試

坑2

填寫企業號回調信息點擊保存不成功時,多點幾回真的有奇效!
這不是玩笑~~由於企業號發給開發者的隨機簽名裏面,頗有可能包含+號,當你get url的時候,php會自動把+號過濾爲空格,致使發來的簽名和實際地址簽名不一致,signature驗證就不會經過了,會報40001: 簽名驗證錯誤。
固然,你也能夠把空格再還原爲+號,這樣能確保與發送的簽名地址一致。(我以爲這是微信回調的一個小bug,簽名裏不該該帶有這樣特殊意義的符號)

坑3

所有都經過驗證了,也返回微信要的明文了,仍是不經過,what?打印到本地看看,也沒錯啊,百度我都搜遍了,什麼去掉文件BOM頭,改header頭,統統都試過了,我真的的的確確解密了,並且把解密的結果返回給了微信,仍是不行啊,WTF。。

真的返回了明文麼?你覺得打印到本地就是對的麼?錯了。有個東西叫緩衝區
緩衝區的東西是不會打印到本地的,微信在訪問你網址的時候,先get到的東西是緩衝區內容而不是你輸出的明文。因此,要先清除緩衝區,辦法是在echo前使用ob_clean(),估計其餘框架也同樣。

這三個算是比較大的坑吧,網上的資料也少得可憐,但願能幫到你們。

相關文章
相關標籤/搜索