亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

下面給大家介紹在TP中怎么引入ThinkWechat.php以及怎么打印日志到日志文件,希望對(duì)需要的朋友有所幫助!


基于Thinkphp6的微信公眾號(hào)交互式消息開(kāi)發(fā)

看完thinkPHP實(shí)戰(zhàn),我從github上下載了書(shū)中的代碼,準(zhǔn)備運(yùn)行一下微信公眾號(hào)開(kāi)發(fā)的程序。

可是,因?yàn)闀?shū)中使用的是ThinkPHP3.2.3,而最新版本已經(jīng)是6.0.X,反正我對(duì)ThinkPHP不熟悉,就下載了最新版來(lái)使用。我預(yù)料到因?yàn)榘姹静煌?,程序運(yùn)行會(huì)有問(wèn)題。我想的是,遇到一個(gè)解決一個(gè)吧。沒(méi)想到,我遇到了很多困難,兩天了才把程序跑起來(lái)。最后還更改了框架的一點(diǎn)點(diǎn)代碼。

閑話(huà)少說(shuō),我依次羅列下遇到的困難吧。

如何在TP中引入ThinkWechat.php

書(shū)中是把ThinkWechat.php放在/Application/Home/Library下的。但TP6已經(jīng)沒(méi)有Application,我就在/app下新建了library目錄,將文件放入其中。

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

use app\library\ThinkWechat;

在ThinkWechat.php文件中添加namespace

namespace app\library;

Class 'app\library\SimpleXMLElement' not found

一開(kāi)始,百度說(shuō)是要在環(huán)境上安裝php7-xml. 我的macmini需要用brew來(lái)安裝,很久沒(méi)用brew,brew update慢死了,按照百度的帖子,替換了阿里云的鏈接。

結(jié)果還是不行。弄brew弄了幾個(gè)小時(shí)。后來(lái)不知道怎么發(fā)現(xiàn),原來(lái)tp6里面用了namespace,所以在使用SimpleXMLElement的時(shí)候,要在文件開(kāi)頭寫(xiě)如下語(yǔ)句

use SimpleXMLElement;

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

因?yàn)槭呛臀⑿殴娞?hào)進(jìn)行交互,我不知道有什么辦法方便調(diào)試,試過(guò)了微信提供的接口調(diào)試工具,但是也僅僅能夠檢查參數(shù)設(shè)置是否正確。于是我用了最笨的打印日志的方法。

要打印日志需要在TP6中做以下設(shè)置:

在config/log.php 中

設(shè)置日志記錄級(jí)別

'level' => ['emergency'],

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

設(shè)置日志保存目錄
'path' => App()->getRuntimePath() .'/log',
然后在程序中用下面的語(yǔ)句實(shí)時(shí)寫(xiě)入日志文件
Log::write('index _get session id before set ID '. Session::getId(), 'notice');

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

這個(gè)問(wèn)題卡了我大半天??!

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

我一直以為是 

$node->appendChild($node->ownerDocument->createCDATASection($value));

這句代碼執(zhí)行有問(wèn)題。

因此還從《微信公眾平臺(tái)開(kāi)發(fā)》一書(shū)中找到通過(guò)設(shè)置xml模板中,用sprintf方法替換模板中的變量來(lái)生成response的xml。

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

后來(lái)我發(fā)現(xiàn),自己隨便寫(xiě)的程序,比如公眾號(hào)每次都回復(fù)用戶(hù)輸入的信息,像應(yīng)聲桶那樣,就沒(méi)有問(wèn)題,程序也不退出。我突然想著會(huì)不會(huì)是和session有關(guān)?因?yàn)樵创a中用到了session來(lái)實(shí)現(xiàn)用戶(hù)的注冊(cè)和登錄。

我看了下TP6的開(kāi)發(fā)文檔,果然,里面寫(xiě)到session默認(rèn)是沒(méi)初始化的。這里我有點(diǎn)欲哭無(wú)淚。

按照文檔說(shuō)明,我打開(kāi)了session:

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

2、并且把代碼中的session_start()去掉。因?yàn)門(mén)P6只支持通過(guò)Session類(lèi)方法和session助手函數(shù)來(lái)操作session. 不支持一切的session_xx 函數(shù)。

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

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

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

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

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

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

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());
}

原來(lái)sessionid必須為32位包含字母數(shù)字的字符串,如果不滿(mǎn)足要求(openid長(zhǎng)度為28位),就用當(dāng)前時(shí)間作為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ùn)行了程序,一切正常,感覺(jué)太美好了。

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

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

exit($xml->asXML());

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

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

因此我把exit語(yǔ)句改為 return $xml->asXML(); 這時(shí)session文件正常生成,公眾號(hào)回復(fù)的信息也正確了。


分享到:
標(biāo)簽:Thinkphp ThinkWechat.php 打印日志
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定