Sebelum menggunakan kerangka kerja ini, disarankan untuk memiliki beberapa pemahaman tentang dokumen pengembangan akun publik WeChat, tetapi menggunakan kerangka kerja ini tanpa memahami dokumen akun publik juga dapat menyelesaikan akun publik WeChat sederhana.
Saat ini kompatibel dengan Spring Boot 1.4+ dan Spring Boot 2.x. Semua orang dipersilakan untuk menyebutkan masalah dan kontribusi, dan juga dipersilakan untuk bergabung dengan grup untuk membahas 627254793. Proyek open source perlu dibagikan oleh semua orang. Terima kasih ~
Tautan aplikasi akun resmi tes weChat
<!-- 支持1.4.0.RELEASE及以上,包括2.x -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<!-- fastbootWeixin的核心依赖 -->
<dependency>
<groupId>com.mxixm</groupId>
<artifactId>fastboot-weixin</artifactId>
<version>0.6.2</version>
</dependency>
<!-- SpringBoot的web项目,必须 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 暂时只能使用apache的http,后续可加入其它http支持 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
Buat Aplikasi File Konfigurasi Baru.Properti atau jenis file konfigurasi lainnya yang didukung oleh Spring Boot di direktori sumber daya, dan tambahkan konfigurasi:
Kode Uji:
package com.mxixm.fastboot.weixin;
import com.mxixm.fastboot.weixin.annotation.WxApplication;
import com.mxixm.fastboot.weixin.annotation.WxAsyncMessage;
import com.mxixm.fastboot.weixin.annotation.WxButton;
import com.mxixm.fastboot.weixin.module.web.WxRequest;
import com.mxixm.fastboot.weixin.module.event.WxEvent;
import com.mxixm.fastboot.weixin.module.message.WxMessage;
import com.mxixm.fastboot.weixin.module.message.WxMessageBody;
import com.mxixm.fastboot.weixin.module.user.WxUser;
import com.mxixm.fastboot.weixin.mvc.annotation.WxController;
import com.mxixm.fastboot.weixin.mvc.annotation.WxEventMapping;
import com.mxixm.fastboot.weixin.mvc.annotation.WxMessageMapping;
import org.springframework.boot.SpringApplication;
@WxApplication
@WxController
public class WxApp {
public static void main(String[] args) throws Exception {
SpringApplication.run(WxApp.class, args);
}
/**
* 定义微信菜单
*/
@WxButton(group = WxButton.Group.LEFT, main = true, name = "左")
public void left() {
}
/**
* 定义微信菜单
*/
@WxButton(group = WxButton.Group.RIGHT, main = true, name = "右")
public void right() {
}
/**
* 定义微信菜单,并接受事件
*/
@WxButton(type = WxButton.Type.CLICK,
group = WxButton.Group.LEFT,
order = WxButton.Order.FIRST,
name = "文本消息")
public String leftFirst(WxRequest wxRequest, WxUser wxUser) {
return "测试文本消息";
}
/**
* 定义微信菜单,并接受事件
*/
@WxButton(type = WxButton.Type.VIEW,
group = WxButton.Group.LEFT,
order = WxButton.Order.SECOND,
url = "http://baidu.com",
name = "点击链接")
@WxAsyncMessage
public WxMessage link() {
return WxMessage.newsBuilder().addItem("测试图文消息", "测试", "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white.png", "http://baidu.com").build();
}
/**
* 接受微信事件
* @param wxRequest
* @param wxUser
*/
@WxEventMapping(type = WxEvent.Type.UNSUBSCRIBE)
public void unsubscribe(WxRequest wxRequest, WxUser wxUser) {
System.out.println(wxUser.getNickName() + "退订了公众号");
}
/**
* 接受用户文本消息,异步返回文本消息
* @param content
* @return the result
*/
@WxMessageMapping(type = WxMessage.Type.TEXT)
@WxAsyncMessage
public String text(WxRequest wxRequest, String content) {
WxSession wxSession = wxRequest.getWxSession();
if (wxSession != null && wxSession.getAttribute("last") != null) {
return "上次收到消息内容为" + wxSession.getAttribute("last");
}
return "收到消息内容为" + content;
}
/**
* 接受用户文本消息,同步返回图文消息
* @param content
* @return the result
*/
@WxMessageMapping(type = WxMessage.Type.TEXT, wildcard = "1*")
public WxMessage message(WxSession wxSession, String content) {
wxSession.setAttribute("last", content);
return WxMessage.newsBuilder()
.addItem(WxMessageBody.News.Item.builder().title(content).description("随便一点")
.picUrl("http://k2.jsqq.net/uploads/allimg/1702/7_170225142233_1.png")
.url("http://baidu.com").build())
.addItem(WxMessageBody.News.Item.builder().title("第二条").description("随便二点")
.picUrl("http://k2.jsqq.net/uploads/allimg/1702/7_170225142233_1.png")
.url("http://baidu.com").build())
.build();
}
/**
* 接受用户文本消息,异步返回文本消息
* @param content
* @return the result
*/
@WxMessageMapping(type = WxMessage.Type.TEXT, wildcard = "2*")
@WxAsyncMessage
public String text2(WxRequestBody.Text text, String content) {
boolean match = text.getContent().equals(content);
return "收到消息内容为" + content + "!结果匹配!" + match;
}
}
Karena akun publik WeChat perlu mengonfigurasi antarmuka server mereka sendiri, Anda dapat secara langsung menggunakan pengujian lokal selama pengujian. Menggunakan penetrasi intranet dapat memungkinkan platform publik WeChat untuk mengakses server lokal Anda sendiri.
Perangkat lunak dapat menggunakan NGROK atau NATAPP. Silakan merujuk ke dokumen resmi keduanya.
Alamat URL Nama Domain yang dihasilkan setelah startup dapat dikonfigurasi di wx.callback-URL untuk otentikasi OAuth2. Nama domain dalam URL yang dihasilkan di atas juga harus dikonfigurasi dalam nama domain halaman panggilan balik otorisasi.
Isi nama domain yang dihasilkan pada langkah 4 dalam informasi konfigurasi antarmuka dari akun resmi uji. Token menggunakan token di file konfigurasi. Setelah menabung, jika tidak ada yang tidak terduga terjadi, itu harus diverifikasi dengan sukses. Jika Anda memiliki pertanyaan, berikan umpan balik tepat waktu.


Setelah contoh di atas dimulai, harap perhatikan akun resmi Anda. Pada saat ini, menu akun resmi harus memiliki dua menu utama: kiri dan kanan, dan ada dua submenu di sebelah kiri: pesan teks dan klik tautan.
Saat Anda mengklik menu pesan teks, Anda akan menerima pesan teks, yaitu: Uji pesan teks.
Saat Anda mengklik tautan klik kedua, Anda akan melompat ke Baidu dan menerima pesan grafis dengan judul pesan grafis uji.
Saat mengirim pesan teks ke akun resmi, jika konten pesan tidak dimulai dengan 1, Anda akan menerima balasan ke akun resmi: "Konten pesan diterima" + konten yang dikirim.
Kirim pesan teks ke akun resmi. Ketika konten pesan dimulai dengan 1, Anda akan menerima balasan ke pesan grafik dan teks.
Ketika pengguna tidak berlangganan ke akun resmi, nama panggilan pengguna akan dicetak di System.out + "Terjanggungan ke akun resmi"
Annotation @wxapplication digunakan untuk mendeklarasikan aplikasi sebagai aplikasi WeChat dan mulai menggunakan springApplication. Jika Anda sudah memiliki lingkungan Springboot, silakan tambahkan anotasi @EnableWxMVC ke kelas @springapplication Anda, efeknya sama. Anda dapat melihat kode sumbernya.
Anotasi @WXController digunakan untuk menyatakan bahwa kelas adalah pengontrol WeChat. Hanya ketika anotasi ini dinyatakan akan terikat pada peta permintaan server WeChat, jika tidak, kelas akan diabaikan.
Annotation @wxbutton (grup = wxbutton.group.left, main = true, name = "left") digunakan untuk mendeklarasikan kotak tombol. Grup mewakili sebuah kelompok, dengan tiga kelompok di kiri, tengah dan kanan, sesuai dengan tiga menu tingkat pertama WeChat. Utama adalah nilai boolean, yang berarti apakah item menu adalah menu tingkat pertama. Nama adalah nama menu.
Annotation @wxbutton (type = wxbutton.type.click, grup = wxbutton.group.left, order = wxbutton.order.first, name = "pesan teks") digunakan untuk mendeklarasikan submenu dari pengelompokan kiri. Urutan mewakili pesanan, di sini adalah yang pertama.
string publik LeftFirst (WXRequest WXRequest, WXUSER WXUSER) {return "Test Text Message"; } Ada tiga poin di sini:
@Wxbutton (type = wxbutton.type.view, grup = wxbutton.group.left, order = wxbutton.order.second, url = "http://baidu.com", name = "Klik pada tautan") Anotasi ini sama seperti di atas, dan jenisnya menjadi tampilan. Untuk konten tertentu, Anda dapat merujuk pada anotasi enumerasi atau dokumen akun resmi. Perhatikan bahwa setiap jenis menu memiliki batasannya sendiri. Silakan merujuk ke dokumentasi. Jika kondisinya tidak terpenuhi, pengecualian akan terjadi ketika startup dimulai.
Anotasi @wxasyncmessage menunjukkan bahwa pesan tersebut dibalas secara tidak sinkron, lihat pesan layanan pelanggan, dan tidak ada dukungan yang disediakan untuk beberapa layanan pelanggan saat ini.
Wxmessage.news.builder (). Di kelas WXMessage, ada berbagai kelas internal statis dan pembangun mereka. Melalui pembangun, berbagai jenis pesan WeChat dapat dengan mudah dibangun. Silakan merujuk ke pesan balasan pasif dan pesan layanan pelanggan.
Annotation @WXEventMapping (type = wxevent.type.unsubscribe) mengikat acara berhenti berlangganan. Ketika pengguna berhenti mengikuti, logika di bawah anotasi ini akan dimasukkan. Poin lain yang perlu dicatat adalah bahwa semua konten balasan dari WXEventMapping akan dikirim ke pengguna secara tidak sinkron.
Annotation @wxmessageMapping (type = wxmessage.type.text) berarti mengikat pesan teks yang dikirim oleh pengguna ke logika metode berikut, teks string publik (konten string) {return "Pesan yang diterima adalah" + konten; }. Konten akan secara otomatis ditetapkan ke konten teks yang dikirim oleh pengguna.
Annotation @WxMessageMapping (type = wxmessage.type.text, wildcard = "1*") sama seperti di atas. Perbedaannya adalah karakter wildcard wildcard. Karakter wildcard ini mendukung konten wildcard. Mengesampingkan logika wildcard akan memasukkan logika eksekusi di bawah ini.
Terintegrasi sempurna dengan boot musim semi. Jika Anda tidak memiliki proyek Springboot dan ingin menggunakan kerangka kerja ini untuk membangun akun publik, Anda dapat secara langsung menggunakan @WXApplication untuk menandai kelas startup. Anotasi ini mendukung parameter: menuAutocreate, default benar. Ini berarti bahwa menu WeChat dibuat secara otomatis, dan dapat diatur ke false untuk mematikan perilaku membuat menu secara otomatis. Jika Anda sudah memiliki proyek Spring Boot dan ingin memperkenalkan kerangka kerja ini, cukup tandai anotasi @EnableWXMVC pada kelas konfigurasi apa pun, dan parameternya sama seperti di atas.
Ada tiga jenis pemetaan yang didukung:
CATATAN: Kelas yang Anda ikat harus dinyatakan sebagai @WXController
Jenis parameter berikut didukung:
Parameter Binding saat ini mendukung tipe ini. Jika ada solusi yang lebih baik yang perlu didukung, Anda juga dapat secara langsung mengajukan pendapat dan saran, dan saya akan menghadapinya secara tepat waktu.
Nilai pengembalian mendukung jenis berikut:
Pesan asinkron di atas dikirim menggunakan WXMessageTemplate, yang dijelaskan di bawah ini.
Kerangka kerja ini menyediakan WXMessageTemplate untuk mengirim pesan, dan pada saat yang sama menyediakan dukungan WXMessageProcessor di Template, yaitu memproses pesan sebelum mengirimnya.
Misalnya, ketika mengembalikan pesan secara serempak, Anda perlu menulis bidang dari nama -nama, yang merupakan bidang nama Tousernam ketika pesan dikirim. Tidak perlu membiarkan kerangka kerja pengguna memproses bidang ini. Bidang ini diproses dalam prosesor WXCommonMessageProcessor. Jika Anda tertarik, Anda dapat merujuk ke kode sumber.
Ini juga mendukung konversi berikut: untuk pesan tipe media, Anda dapat langsung menggunakan mediaurl atau mediapath untuk menulis jalur material, dan konverter pesan secara otomatis mengelola materi melalui wxmediamanager untuk mendapatkan ID materi yang diperlukan. (Tulis di bawah tentang WXMediamanager)
Catatan: Saat memproses pesan teks, disarankan untuk menggunakan pembangun konten pesan yang sesuai di WXMessage untuk menghasilkannya!
Kerangka kerja ini menyediakan WXMediamanager untuk mengelola materi, dan juga menggunakan database tertanam untuk menyimpan korespondensi antara bahan dan file lokal. Meskipun saya telah menyelesaikan bagian fungsi ini saat ini, saya selalu merasa ada masalah besar. Saya berharap seseorang dapat membantu saya melihatnya dan memberi saya beberapa saran.
Media dalam pengiriman pesan di atas sebenarnya diimplementasikan melalui manajer materi.
Versi 0.2.0.Alpha mengoptimalkan penyimpanan, menggunakan antarmuka WXMediastore untuk mengelola penyimpanan media, pengembang dapat mengimplementasikan antarmuka ini sendiri dan mendaftar sebagai kacang Spring untuk menggantikan MAPDBWXMediastore default. Untuk penggunaan khusus setiap antarmuka, silakan merujuk ke MAPDBWXMediastore. Implementasi berbasis memori juga dapat disediakan di sini untuk menggantikan MAPDB.
Kerangka kerja ini menyediakan antarmuka WXTOKenStore untuk menyimpan token dan menyediakan implementasi memori berbasis memori dari memorywxtokenstore. Jika Anda perlu didistribusikan, Anda dapat mengimplementasikan antarmuka ini sendiri dan menyuntikkan kelas implementasi ke dalam musim semi sebagai kacang.
Gunakan antarmuka WXapiInvokespi dan kelas pabrik WXInvokerProxyFactory untuk secara otomatis menghasilkan proxy panggilan antarmuka WeChat. Anda hanya perlu menyatakan metode dan anotasi. Secara default, antarmuka panggilan httpComponent digunakan. Teman yang tertarik dapat memeriksa kode sumbernya. Saya tidak menulisnya dengan baik, jadi jika Anda memiliki saran yang lebih baik, jangan ragu untuk mengedepaninya.
Pada saat yang sama, analisis awal dari nilai pengembalian dilakukan. Jika kode kesalahan dari konten yang dikembalikan dari antarmuka tidak 0, itu akan dilemparkan sebagai pengecualian. Sistem pengecualian adalah WXException dan subkelasnya.
PS: Anda juga dapat menggunakan metode ini untuk menghasilkan antarmuka panggilan proxy Anda sendiri sesuka hati. Saya akan menambahkan dokumentasi di masa depan, jadi saya malas untuk saat ini. . .
Anda dapat menghidupkan dan mematikan sakelar, menghasilkan struktur menu melalui anotasi @wxbutton, dan secara otomatis memanggil antarmuka untuk menentukan apakah menu berubah, dan secara otomatis menghasilkan dan memperbarui menu.
Ini dapat menanggapi dengan benar verifikasi token yang dikirim oleh WeChat, yang nyaman dan cepat.
Menggunakan kerangka kerja ini tidak akan berdampak pada pemetaan asli SpringMVC sendiri, juga tidak akan menempati hubungan pemetaan yang unik (kecuali permintaan otentikasi). Dalam hal kerangka kerja ini, Anda dapat menggunakan fungsi asli SpringMVC, termasuk permintaan direktori root, dan tidak akan ditempati oleh server WeChat saja.
Jika Anda ingin menggunakan alamat terpisah sebagai alamat panggilan API WeChat, harap konfigurasikan WX.Path sebagai informasi jalur, yang perlu konsisten dengan jalur URL di Informasi Konfigurasi Antarmuka di WeChat Official Account Backend Management.
Berikan intersep otentikasi WeChat OAuth2, isi nama domain callback otorisasi OAuth2 dengan mengonfigurasi wx.callback-domain, konfigurasikan wx.mvc.interceptor.includepatterns dan wx.mvc.interceptor.excludepatterns untuk mengonfigurasi alamat target intersep. Anda dapat menyediakan kelas implementasi antarmuka WXOAuth2Callback sebagai kacang, dan kacang ini akan secara otomatis disuntikkan di WXOAuth2Interceptor, dan Call After (WXOAuth2Context setelah otentikasi Web WeChat dilewati. Konteks) Metode meneruskan konteks terkait dengan metode bean. Anda dapat memperoleh konteks WXWebUser dalam metode ini dan mengubah WXWebUser menjadi WXUSER melalui WXUSUSERMANGER. Untuk informasi hubungan yang terperinci, silakan merujuk ke: Otorisasi Web WeChat.
Sejak versi 0.3.6, properti alternatif WX.Callback-URL dari WX.Callback-domain disediakan, yang digunakan untuk mengatur URL callback, termasuk nama domain callback dan jenis protokol. Ada lebih banyak jenis protokol daripada wx.callback-domain, silakan gunakan konfigurasi ini untuk mengganti konfigurasi callback-domain.
Fungsi Tambahan 1: Lihat Jenis WXBUTTON, yang secara otomatis menentukan apakah URL milik alamat di bawah nama domain callback resmi, dan secara otomatis menanganinya sebagai URL yang berisi OAuth2 sesuai kebutuhan. Interceptor default dapat digunakan untuk mewujudkan fungsi mendapatkan informasi pengguna klik pada URL menu. Pada saat yang sama, dikombinasikan dengan fungsi WX.Callback-URL, ini mendukung mengkonfigurasi jalur relatif di menu tanpa membawa nama domain.
Fungsi Tambahan 2: Secara otomatis menentukan apakah URL dalam pesan perlu menambahkan oAuth Redirect, silakan merujuk ke WXRedirectutils.
Dalam kode, Anda dapat menggunakan WXJSticketManager untuk mendapatkan WXJSticket
@Autowired
WxJsTicketManager wxJsTicketManager;
Lihat metode untuk penggunaan terperinci
Konfigurasi wx.encrypt = true, wx.encodingaeskey = AESKEY diatur di latar belakang akun resmi, yaitu, aktifkan mode enkripsi dan dekripsi pesan
Perhatikan bahwa ketika menyalakan enkripsi dan dekripsi pesan, Anda perlu mengaktifkan izin tak terbatas JCE.
JDK7 Alamat Unduh: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
Alamat unduhan JDK8: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
Setelah mengunduh, Anda dapat melihat local_policy.jar, US_Export_Policy.jar dan readme.txt. Jika JRE diinstal, tempatkan dua file JAR di direktori Security %JRE_HOME % LIB untuk menimpa file asli. Jika JDK diinstal, Anda juga harus menempatkan dua file JAR di direktori %JDK_HOME % JRE LIB Security untuk menimpa file asli.
Anda dapat menambahkan dukungan nanti dan menggunakan anotasi untuk mendefinisikan layanan pelanggan pesan, mirip dengan @rabbitlistener
Klasifikasi pengguna yang sedikit merepotkan
Apakah ada implementasi pengelompokan pengguna yang baik atau sesuatu? Belum ada permintaan
Seperti pembayaran, dll.
Versi awal
Optimalkan Pesan Parameter mengikat, tambahkan pengikatan bodi pesan yang ditentukan, lihat WXRequestBody
Unggah repositori pusat maven, hasilkan javadoc, dan serangkaian normalisasi
Bergabunglah dengan Apache Hak Cipta, semua Delombok
Terakhir kali saya bergabung dengan hak cipta, saya secara tidak sengaja menghapus komentar header dari semua file. Saya sekarang telah mengisi beberapa dari mereka. Lagipula, saya akan menambahkan fungsi kupon kartu weChat dan melepaskan versi rilis