溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

thinkphp中怎么引入ThinkWechat.php并打印日志

發(fā)布時間:2021-08-09 11:30:25 來源:億速云 閱讀:117 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)thinkphp中怎么引入ThinkWechat.php并打印日志,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在Index.php中需要引入該文件

use app\library\ThinkWechat;

在ThinkWechat.php文件中添加namespace

namespace app\library;

Class 'app\library\SimpleXMLElement' not found

一開始,百度說是要在環(huán)境上安裝php7-xml. 我的macmini需要用brew來安裝,很久沒用brew,brew update慢死了,按照百度的帖子,替換了阿里云的鏈接。
結(jié)果還是不行。弄brew弄了幾個小時。后來不知道怎么發(fā)現(xiàn),原來tp6里面用了namespace,所以在使用SimpleXMLElement的時候,要在文件開頭寫如下語句
use SimpleXMLElement;

TP6怎么打印日志到日志文件

因為是和微信公眾號進行交互,我不知道有什么辦法方便調(diào)試,試過了微信提供的接口調(diào)試工具,但是也僅僅能夠檢查參數(shù)設(shè)置是否正確。于是我用了最笨的打印日志的方法。
要打印日志需要在TP6中做以下設(shè)置:

在config/log.php 中

undefined

'level'        => ['emergency'],

我調(diào)試時幾乎把所有的level值都寫到這里了。

undefined

'path'       => App()->getRuntimePath() .'/log',

undefined

Log::write('index _get session id before set ID '. Session::getId(), 'notice');

關(guān)注測試公眾號后,輸入999,可以收到正常回復(fù)。輸入1 程序則退出

這個問題卡了我大半天?。?/p>

一開始,我以為是返回給微信平臺的response 有問題,因為我在ThinkWechat.php中打印了很多日志,發(fā)現(xiàn)只要我輸入除999以外的信息,data2xml方法總是不能完全執(zhí)行,日志在
$node = dom_import_simplexml($child);之后就無法打印。

我一直以為是$node->appendChild($node->ownerDocument->createCDATASection($value));
這句代碼執(zhí)行有問題。
因此還從《微信公眾平臺開發(fā)》一書中找到通過設(shè)置xml模板中,用sprintf方法替換模板中的變量來生成response的xml。

這樣做的結(jié)果是,我能在日志中看到response xml 成功生成,但是輸入1仍然沒有得到我期望的回復(fù),應(yīng)該是沒有任何回復(fù),顯示“該公眾號暫時無法提供服務(wù),請稍后再試”,并且才程序也是立即退出了。

后來我發(fā)現(xiàn),自己隨便寫的程序,比如公眾號每次都回復(fù)用戶輸入的信息,像應(yīng)聲桶那樣,就沒有問題,程序也不退出。我突然想著會不會是和session有關(guān)?因為源代碼中用到了session來實現(xiàn)用戶的注冊和登錄。
我看了下TP6的開發(fā)文檔,果然,里面寫到session默認是沒初始化的。這里我有點欲哭無淚。

按照文檔說明,我打開了session:

1.在app/middleware.php 中去掉\think\middleware\SessionInit::class的注釋。

2.并且把代碼中的session_start()去掉。因為TP6只支持通過Session類方法和session助手函數(shù)來操作session. 不支持一切的session_xx 函數(shù)。

Session 打開之后,程序不再退出。但出現(xiàn)新的問題,輸入999后再輸入1,公眾號正確回復(fù)請輸入用戶名,但輸入用戶名后的回復(fù)卻和輸入999一樣。提示輸入1注冊,輸入2登錄。 而正確的應(yīng)該是提示輸入用戶名。

這時,我發(fā)現(xiàn)runtime/session目錄中生成了多個session文件。對于同一個用戶來說,應(yīng)該僅有一個session文件才是正確的。相當(dāng)于用戶每一次和公眾號交互,都有一個新的session文件產(chǎn)生,這樣沒法獲取用戶之前輸入的信息。

百度后發(fā)現(xiàn)這個原因是

session是存儲在服務(wù)器端的,那么區(qū)別每個用戶的session就需要使用客戶端的cookie,微信服務(wù)器是不發(fā)送cookie到開發(fā)者服務(wù)器,所以基于cookie的session無法使用。
但是只要為每個用戶設(shè)置一個唯一的session_id,也可以達到同樣的效果。
每個人微信號是唯一的,所以我們可以使用微信號作為用戶的session_id,也可以將其md5加密后使用。

我打算用FromUserName的值作為sessionid。也就是每一個用戶自己的openid。不過TP6 不支持session_id()方法來設(shè)置sessionid。我后來看文檔發(fā)現(xiàn)可以用Session::setId來設(shè)置SessionID,但是不知道為什么每次還是會生成不同的sessionID。

網(wǎng)上說可以就用openid,我發(fā)現(xiàn)每次微信公眾號向服務(wù)器發(fā)來的url確實都會附帶openid,我就在session.php配置了openid,希望TP6每次用請求中的openid作為sessionid。不過仍然沒有生效。

TP6的session.php有如下配置:

SESSION_ID的提交變量,解決flash上傳跨域
'var_session_id' => 'openid',

查看了下框架的setId,原始代碼如下

public function setId($id = null): void
    {
        $this->id = is_string($id) && strlen($id) === 32 && ctype_alnum($id) ? $id : md5(microtime
        (true).session_create_id());
    }

原來sessionid必須為32位包含字母數(shù)字的字符串,如果不滿足要求(openid長度為28位),就用當(dāng)前時間作為sessionid,所以我把setId改為下面的樣子,然后在index方法中打印sessionid,發(fā)現(xiàn)每次都是一樣的。

public function setId($id = null): void
    {
        $this->id = is_string($id) && strlen(md5($id)) === 32 && ctype_alnum(md5($id)) ? md5($id) : md5(microtime
        (true).session_create_id());
    }

運行了程序,一切正常,感覺太美好了。

這時,我想之前遇到的那么多問題,應(yīng)該和xml response沒有關(guān)系。于是我又用回以前的ThinkWechat.php,卻發(fā)現(xiàn)runtime/session目錄中沒有生成session文件。

檢查后才發(fā)現(xiàn),原始的ThinkWechat.php的response方法最后是

exit($xml->asXML());

而TP6官方文檔有以下提醒:

注意,Session寫入數(shù)據(jù)的操作會在請求結(jié)束的時候統(tǒng)一進行本地化存儲,所以不要在寫入Session數(shù)據(jù)之后使用exit等中斷操作,可能會導(dǎo)致Session沒有正常寫入。

上述就是小編為大家分享的thinkphp中怎么引入ThinkWechat.php并打印日志了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI