Rumah  >  Artikel  >  rangka kerja php  >  Penjelasan terperinci tentang cara memperkenalkan ThinkWechat.php dalam TP dan mencetak log

Penjelasan terperinci tentang cara memperkenalkan ThinkWechat.php dalam TP dan mencetak log

藏色散人
藏色散人ke hadapan
2021-08-09 09:47:072134semak imbas

Lajur tutorial rangka kerja thinkphp akan memperkenalkan kepada anda cara memperkenalkan ThinkWechat.php dalam TP dan cara mencetak log untuk fail log kawan yang memerlukan!

Pembangunan mesej interaktif untuk akaun awam WeChat berdasarkan Thinkphp6

Selepas menonton latihan thinkPHP, saya memuat turun kod dalam buku daripada github dan bersedia untuk dijalankan ia Satu program yang dibangunkan untuk akaun awam WeChat.
Namun, kerana buku itu menggunakan ThinkPHP3.2.3, dan versi terkini sudah 6.0.X, saya tidak biasa dengan ThinkPHP, jadi saya memuat turun versi terkini untuk digunakan. Saya menjangkakan bahawa akan ada masalah menjalankan program kerana versi yang berbeza. Apa yang saya fikir ialah kita harus menyelesaikan setiap masalah satu persatu. Tanpa diduga, saya menghadapi banyak kesukaran dan saya mengambil masa dua hari untuk menjalankan program tersebut. Akhirnya, saya menukar sedikit kod dalam rangka kerja.

Tanpa berlengah lagi, izinkan saya senaraikan kesukaran yang saya hadapi mengikut urutan.

Cara memperkenalkan ThinkWechat.php dalam TP

Dalam buku, ThinkWechat.php diletakkan di bawah /Application/Home/Library. Tetapi TP6 tidak lagi mempunyai Aplikasi, jadi saya mencipta direktori perpustakaan baharu di bawah /app dan meletakkan fail di dalamnya.

Anda perlu memperkenalkan fail ini dalam Index.php

use applibraryThinkWechat;

Tambah ruang nama

namespace applibrary;

dalam fail ThinkWechat.php

Kelas 'applibrarySimpleXMLElement' tidak ditemui

Pada mulanya, Baidu berkata bahawa php7-xml harus dipasang pada persekitaran saya perlu dipasang dengan brew Saya sudah lama tidak menggunakan brew . Kemas kini Brew sangat perlahan Menurut catatan Baidu, pautan ke Alibaba Cloud telah diganti.
Hasilnya masih tidak berkesan. Saya membancuhnya selama beberapa jam. Saya tidak tahu bagaimana saya mengetahui kemudian bahawa ruang nama digunakan dalam tp6, jadi apabila menggunakan SimpleXMLElement, anda perlu menulis pernyataan berikut pada permulaan fail
use SimpleXMLElement;

Cara mencetak log ke fail log dalam TP6

Oleh kerana saya berinteraksi dengan akaun rasmi WeChat, saya tidak tahu bagaimana untuk memudahkan penyahpepijatan saya mencuba alat penyahpepijatan antara muka yang disediakan oleh WeChat, tetapi Saya hanya boleh menyemak sama ada tetapan parameter adalah betul. Jadi saya menggunakan kaedah paling bodoh untuk mencetak log.
Untuk mencetak log, anda perlu membuat tetapan berikut dalam TP6:

Dalam config/log.php

1 Tetapkan tahap pengelogan

'level'        => ['emergency'],

Saya nyahpepijat Hampir semua nilai peringkat telah ditulis di sini.

1. Tetapkan direktori menyimpan log

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

2 Kemudian gunakan pernyataan berikut untuk menulis fail log dalam masa nyata dalam program

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

<.>Ikuti ujian Selepas memasuki akaun rasmi, masukkan 999 untuk menerima balasan biasa. Masukkan 1 untuk keluar dari program

Masalah ini melekat pada saya hampir sepanjang hari! !

Pada mulanya, saya fikir ada yang tidak kena dengan respons yang dikembalikan kepada platform WeChat, kerana saya mencetak banyak log dalam ThinkWechat.php dan mendapati bahawa selagi saya memasukkan maklumat selain daripada 999, data2xml kaedah tidak dapat dilaksanakan sepenuhnya, log tidak boleh dicetak selepas


. $node = dom_import_simplexml($child);

Saya selalu fikir ada masalah dengan pelaksanaan

$node->appendChild($node->ownerDocument->createCDATASection($value)); kod ini.
Jadi saya juga mendapati daripada buku "WeChat Public Platform Development" bahawa xml respons dijana dengan menetapkan templat xml dan menggunakan kaedah sprintf untuk menggantikan pembolehubah dalam templat.

Hasilnya ialah saya dapat melihat dalam log bahawa respons xml berjaya dijana, tetapi memasukkan 1 masih tidak mendapat respons yang saya harapkan, sepatutnya tiada respons, dan ia dipaparkan "Akaun rasmi ini tidak dapat menyediakan perkhidmatan buat sementara waktu, sila cuba lagi nanti", dan program itu juga keluar serta-merta.

Kemudian saya mendapati bahawa jika saya menulis program secara rawak, seperti akaun awam yang membalas maklumat yang dimasukkan oleh pengguna setiap kali, seperti baldi ya, tidak akan ada masalah dan program itu tidak akan keluar. Saya tiba-tiba terfikir sama ada ia mungkin berkaitan dengan sesi? Kerana sesi digunakan dalam kod sumber untuk merealisasikan pendaftaran pengguna dan log masuk.

Saya melihat dokumentasi pembangunan TP6, dan sudah pasti, ia mengatakan bahawa sesi tidak dimulakan secara lalai. Saya rasa nak menangis di sini.

Mengikut arahan dokumentasi, saya membuka sesi:

1. Alih keluar ulasan

dalam app/middleware.php. thinkmiddlewareSessionInit::class

2 Dan alih keluar session_start() dalam kod. Kerana TP6 hanya menyokong sesi pengendalian melalui kaedah kelas Sesi dan fungsi pembantu sesi Ia tidak menyokong semua fungsi session_xx.

Selepas Sesi dibuka, program tidak akan keluar lagi. Tetapi masalah baru berlaku Selepas memasukkan 999, masukkan 1. Akaun rasmi bertindak balas dengan betul. Sila masukkan nama pengguna, tetapi jawapan selepas memasukkan nama pengguna adalah sama dengan memasukkan 999. Apabila digesa, masukkan 1 untuk mendaftar dan masukkan 2 untuk log masuk. Yang betul ialah meminta nama pengguna.

Pada masa ini, saya mendapati berbilang fail sesi telah dijana dalam direktori masa jalan/sesi. Untuk pengguna yang sama, hanya ada satu fail sesi yang betul. Ia bersamaan dengan setiap kali pengguna berinteraksi dengan akaun rasmi, fail sesi baharu dijana, supaya maklumat yang dimasukkan sebelum ini oleh pengguna tidak boleh diperolehi.

Baidu kemudiannya mendapati bahawa sebab untuk ini ialah

sesi disimpan di bahagian pelayan, jadi untuk membezakan setiap sesi pengguna, anda perlu menggunakan kuki pelanggan tidak hantar kuki ke pelayan pembangun Oleh itu, sesi berasaskan kuki tidak boleh digunakan.
Tetapi selagi session_id unik ditetapkan untuk setiap pengguna, kesan yang sama boleh dicapai.
ID WeChat setiap orang adalah unik, jadi kami boleh menggunakan ID WeChat sebagai session_id pengguna, atau kami boleh menggunakannya selepas penyulitan md5.

Saya bercadang untuk menggunakan nilai FromUserName sebagai sessionid. Iaitu, setiap pengguna openid sendiri. Walau bagaimanapun, TP6 tidak menyokong kaedah session_id() untuk menetapkan sessionid. Saya kemudiannya membaca dokumentasi dan mendapati bahawa Session::setId boleh digunakan untuk menetapkan SessionID, tetapi saya tidak tahu mengapa sessionID yang berbeza masih dijana setiap kali.

Di Internet menyatakan bahawa anda boleh menggunakan openid, saya mendapati bahawa setiap kali URL yang dihantar oleh akaun awam WeChat ke pelayan datang dengan openid, saya mengkonfigurasi openid dalam session.php, dengan harapan TP6 akan. gunakan openid dalam permintaan setiap kali sebagai sessionid. Tetapi ia masih tidak berkesan.

session.php TP6 mempunyai konfigurasi berikut:

Pembolehubah penyerahan SESSION_ID untuk menyelesaikan rentas domain muat naik kilat
'var_session_id' => 'openid',

Menyemak setId bingkai bawah , Kod asal adalah seperti berikut

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

Ternyata sessionid mestilah rentetan alfanumerik 32-bit Jika ia tidak memenuhi keperluan (panjang terbuka ialah 28 bit), masa semasa ialah digunakan sebagai sessionid, jadi saya menukar setId kepada Seperti yang ditunjukkan di bawah, kemudian cetak sessionid dalam kaedah indeks dan mendapati bahawa ia adalah sama setiap kali.

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

Jalankan program dan semuanya berfungsi dengan baik.

Pada masa ini, saya fikir semua masalah yang saya hadapi sebelum ini sepatutnya tiada kaitan dengan respons xml. Jadi saya menggunakan ThinkWechat.php sebelumnya, tetapi mendapati bahawa fail sesi tidak dijana dalam direktori runtime/session.

Selepas menyemak, saya mendapati bahawa kaedah respons ThinkWechat.php asal akhirnya menjadi

exit($xml->asXML());

dan dokumen rasmi TP6 mempunyai peringatan berikut:

Ambil perhatian bahawa pengendalian menulis data ke Sesi akan disimpan secara setempat apabila permintaan tamat, jadi jangan gunakan operasi gangguan seperti keluar selepas menulis data Sesi, yang mungkin menyebabkan Sesi tidak ditulis secara normal.

Jadi saya menukar pernyataan keluar kepada return $xml->asXML(); Pada masa ini, fail sesi dijana seperti biasa, dan maklumat yang dibalas oleh akaun rasmi juga betul.

Kod PS telah dihoskan di github

https://github.com/sarawang9012/thinkwechat

Cadangan berkaitan: 10 tutorial video thinkphp terkini

Atas ialah kandungan terperinci Penjelasan terperinci tentang cara memperkenalkan ThinkWechat.php dalam TP dan mencetak log. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam