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;
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',
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);
$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.
Saya melihat dokumentasi pembangunan TP6, dan sudah pasti, ia mengatakan bahawa sesi tidak dimulakan secara lalai. Saya rasa nak menangis di sini.
dalam app/middleware.php. thinkmiddlewareSessionInit::class
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