Bevor Sie diesen Rahmen verwenden, wird empfohlen, die Entwicklungsdokumente des WeChat Public Account zu verstehen. Wenn Sie diesen Rahmen jedoch verwenden, ohne die Dokumente des öffentlichen Kontos zu verstehen, kann dies auch ein einfaches öffentliches WeChat -Konto vervollständigen.
Derzeit kompatibel mit Spring Boot 1.4+ und Spring Boot 2.x. Jeder ist herzlich eingeladen, Ausgabe und Beitrag zu erwähnen und sich der Gruppe anzuschließen, um 627254793 zu besprechen. Open Source -Projekte müssen von allen geteilt werden. Danke ~
WeChat Test Official Account Application Link
<!-- 支持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>
Erstellen Sie eine neue Konfigurationsdateianwendung. Properties oder andere Konfigurations -Dateitypen, die vom Spring -Start im Ressourcenverzeichnis unterstützt werden, und die Konfiguration hinzufügen:
Testcode:
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;
}
}
Da WeChat Public Accounts ihre eigene Serverschnittstelle konfigurieren muss, können Sie während des Tests direkt lokale Tests verwenden. Durch die Verwendung von Intranet -Penetration können WeChat öffentliche Plattformen auf Ihren eigenen lokalen Server zugreifen.
Die Software kann NGROK oder NATAPP verwenden. Bitte beachten Sie die offiziellen Dokumente beider.
Die nach dem Start generierte URL-Adresse der Domänennamen kann in wx.callback-URL für die OAuth2-Authentifizierung konfiguriert werden. Der Domänenname in der oben generierten URL muss auch im Domänennamen der Callback -Seite der Autorisierung konfiguriert werden.
Geben Sie den in Schritt 4 generierten Domänennamen in den Interface -Konfigurationsinformationen des Test- offiziellen Konto ein. Das Token verwendet das Token in der Konfigurationsdatei. Nach dem Speichern sollte es erfolgreich überprüft werden, wenn nichts Unerwartetes passiert. Wenn Sie Fragen haben, geben Sie bitte rechtzeitig Feedback.


Nachdem das obige Beispiel gestartet wurde, achten Sie bitte auf Ihr offizielles Konto. Zu diesem Zeitpunkt sollte das Menü des offiziellen Kontos zwei Hauptmenüs haben: links und rechts, und es befindet sich links zwei Untermenü: SMS und klicken Sie auf Link.
Wenn Sie auf das Menü SMS -Meldung klicken, erhalten Sie eine Textnachricht: Testen Sie die Textnachricht.
Wenn Sie auf den zweiten Klick -Link klicken, werden Sie zu Baidu springen und eine grafische Nachricht mit dem Titel der Testgrafiknachricht erhalten.
Beim Senden einer Textnachricht an das offizielle Konto erhalten Sie, wenn der Nachrichteninhalt nicht mit 1 beginnt, eine Antwort auf das offizielle Konto: "Der Nachrichteninhalt wird empfangen" + Der gesendete Inhalt.
Senden Sie eine Textnachricht an das offizielle Konto. Wenn der Nachrichteninhalt mit 1 beginnt, erhalten Sie eine Antwort auf die Grafik und die Textnachricht.
Wenn sich ein Benutzer dem offiziellen Konto abmeldet, wird der Spitzname des Benutzers in System gedruckt.
Annotation @WXApplication wird verwendet, um die Anwendung als WeChat -Anwendung zu deklarieren und Springapplication zu verwenden. Wenn Sie bereits eine Springboot -Umgebung haben, fügen Sie bitte die Annotation @EnableWxMVC zu Ihrer @SpringApplication -Klasse hinzu, der Effekt ist der gleiche. Sie können den Quellcode sehen.
Die Annotation @WXController wird verwendet, um zu erklären, dass die Klasse ein WeChat -Controller ist. Nur wenn diese Annotation deklariert wird, wird sie an die Anforderungskarte des WeChat -Servers gebunden, andernfalls wird die Klasse ignoriert.
Annotation @WXButton (Gruppe = WXButton.group.Left, main = true, name = "links") wird verwendet, um ein Schaltflächenfeld zu deklarieren. Gruppe repräsentiert eine Gruppe mit drei Gruppen links, Mitte und rechts, die den drei WeChat-Menüs erster Ebene entsprechen. Main ist ein boolescher Wert, was bedeutet, ob es sich bei dem Menüelement um ein Menü der ersten Stufe handelt. Name ist der Menüname.
Annotation @WxButton (Typ = wxButton.type.click, Group = WXButton.group.left, Order = WXButton.order.First, name = "Textnachricht") wird verwendet, um den Untermenü der linken Gruppierung zu deklarieren. Die Reihenfolge repräsentiert die Reihenfolge, hier ist die erste.
public String linksFirst (wxRequest wxRequest, WXUSER WXUSER) {return "Test Textnachricht"; } Hier gibt es drei Punkte:
@Wxbutton (type = wxbutton.type.view, gruppe = wxbutton.group.left, order = wxButton.order.second, url = "http://baidu.com", name = "klicken auf den link") Diese Annotation ist die gleiche wie oben, und der Typ wird anzeigen. Für bestimmte Inhalte können Sie sich auf die Annotation der Aufzählung oder das offizielle Kontodokument beziehen. Beachten Sie, dass jeder Menüentyp seine eigenen Einschränkungen hat. Bitte beachten Sie die Dokumentation. Wenn die Bedingungen nicht erfüllt sind, tritt eine Ausnahme auf, wenn das Startup gestartet wird.
Die Annotation @WxAsyncMessage zeigt an, dass die Nachricht asynchron beantwortet wird, sich auf die Kundendienstnachricht beziehen und derzeit für mehrere Kundenservice kein Support bereitgestellt wird.
WxMessage.news.builder (). In der WXMessage -Klasse gibt es verschiedene statische interne Klassen und ihre Bauherren. Durch den Baumeister können verschiedene Arten von Wechat -Nachrichten leicht konstruiert werden. Bitte beachten Sie passive Antwortmeldungen und Kundendienstnachrichten.
Annotation @WxEventMapping (type = wxEvent.type.unsubscribe) bindet das Unsubscribe -Ereignis. Wenn ein Benutzer nicht folgt, wird die Logik unter dieser Annotation eingegeben. Ein weiterer Punkt ist, dass alle Antwortinhalte von WxEventMapping asynchron an den Benutzer gesendet werden.
Annotation @WxMessAgemapping (type = wxMessage.type.text) bedeutet, die vom Benutzer gesendete Textnachricht an die folgende Methodenlogik, öffentlicher String -Text (String -Inhalt) {return "Die empfangene Nachricht ist" + Inhalt; }. Der Inhalt wird automatisch dem vom Benutzer gesendeten Textinhalt zugeordnet.
Die Annotation @WxMessAgemapping (type = wxMessage.type.text, Wildcard = "1*") ist der gleiche wie oben. Der Unterschied ist der Wildcard -Wildcard -Charakter. Dieser Wildcard -Charakter unterstützt Wildcard -Inhalte. Überschreibung der Wildcard -Logik wird die folgende Ausführungslogik eingeben.
Perfekt mit Spring Boot integriert. Wenn Sie kein Springboot -Projekt haben und dieses Framework verwenden möchten, um ein öffentliches Konto zu erstellen, können Sie @WXApplication direkt verwenden, um die Startkurs zu markieren. Diese Annotation unterstützt den Parameter: MenüAutocreate, Standard ist wahr. Dies bedeutet, dass das WeChat -Menü automatisch erstellt wird und auf false eingestellt werden kann, um das Verhalten des automatischen Erstellens des Menüs auszuschalten. Wenn Sie bereits ein Spring -Boot -Projekt haben und dieses Framework einführen möchten, markieren Sie einfach die Annotation @EnableWxMVC in einer beliebigen Konfigurationsklasse, und die Parameter sind die gleichen wie oben.
Es werden drei Arten von Zuordnungen unterstützt:
Hinweis: Die Klasse, die Sie binden, muss als @WXController deklariert werden
Die folgenden Arten von Parametern werden unterstützt:
Die Parameterbindung unterstützt derzeit diese Typen. Wenn es eine bessere Lösung gibt, die unterstützt werden muss, können Sie auch direkt Meinungen und Vorschläge vorlegen, und ich werde sie rechtzeitig mit ihnen umgehen.
Der Rückgabewert unterstützt die folgenden Typen:
Die obigen asynchronen Nachrichten werden mit WXMessAgetemplate gesendet, die unten erläutert wird.
Dieses Framework bietet WXMessAgetemplate zum Senden von Nachrichten und gleichzeitig WXMessageProcessor -Unterstützung in der Vorlage, bei der Nachrichten vor dem Senden verarbeitet werden.
Wenn Sie beispielsweise Synchron zurückgeben, müssen Sie das Feld Fromuername schreiben, das das Feld Tousername ist, wenn die Nachricht gesendet wird. Es ist nicht erforderlich, dass die Framework -Benutzer dieses Feld verarbeiten. Dieses Feld wird im WXCommonMessageProcessor -Prozessor verarbeitet. Wenn Sie interessiert sind, können Sie sich auf den Quellcode beziehen.
Es unterstützt auch die folgende Konvertierung: Für Medienmeldungen können Sie MediaUrl oder MediaPath direkt verwenden, um den Materialpfad zu schreiben, und der Nachrichtenkonverter verwaltet das Material automatisch über WXMedianager, um die erforderliche materielle ID zu erhalten. (Schreiben Sie unten über WXMedianAlager)
Hinweis: Wenn Sie Textnachrichten verarbeiten, wird empfohlen, den Bauunternehmer des entsprechenden Nachrichteninhalts in WXMessage zu verwenden, um sie zu generieren!
Dieses Framework bietet WXMedianager zum Verwalten von Materialien und verwendet eine eingebettete Datenbank, um die Korrespondenz zwischen Materialien und lokalen Dateien zu speichern. Obwohl ich diesen Teil der Funktion derzeit abgeschlossen habe, habe ich immer das Gefühl, dass es ein großes Problem gibt. Ich hoffe, jemand kann mir helfen, es zu sehen und mir einige Vorschläge zu geben.
Die Medien in der obigen Nachricht senden werden tatsächlich über den Materialmanager implementiert.
Die Version von 0.2.0.Alpha optimiert den Speicher mithilfe der Schnittstelle WXMediastore, um den Medienspeicher zu verwalten. Entwickler können diese Schnittstelle selbst implementieren und sich als Spring -Bean registrieren, um den Standard -MAPDBWWXMediastore zu ersetzen. Für die spezifische Verwendung jeder Schnittstelle finden Sie unter MAPDBWXMediAsore. Eine Speicher-basierte Implementierung kann auch hier bereitgestellt werden, um MAPDB zu ersetzen.
Dieses Framework bietet die WXTOKESTORE-Schnittstelle zum Speichern von Token und eine Standard-Speicher-basierte Implementierung von MEMEPTOWXTOKESTORE. Wenn Sie verteilt werden müssen, können Sie diese Schnittstelle selbst implementieren und die Implementierungsklasse als Bohne in den Frühling einbringen.
Verwenden Sie die WXAPIInvokespi -Schnittstelle und die WXInvokerProxyFactory Factory -Klasse, um den WeChat -Schnittstellen -Call -Proxy automatisch zu generieren. Sie müssen nur Methoden und Anmerkungen deklarieren. Standardmäßig wird die HTTPComponent -Call -Schnittstelle verwendet. Interessierte Freunde können den Quellcode überprüfen. Ich schreibe es nicht gut. Wenn Sie also bessere Vorschläge haben, können Sie sie gerne vorlegen.
Gleichzeitig wird eine vorläufige Analyse des Rückgabewerts durchgeführt. Wenn der Fehlercode des zurückgegebenen Inhalts der Schnittstelle nicht 0 beträgt, wird er als Ausnahme geworfen. Das Ausnahmesystem ist WXException und seine Unterklassen.
PS: Sie können diese Methode auch verwenden, um nach Belieben Ihre eigene Proxy -Anrufschnittstelle zu generieren. Ich werde die Dokumentation in Zukunft hinzufügen, also bin ich vorerst faul. . .
Sie können den Switch ein- und ausschalten, die Menüstruktur über @WXButton Annotation erstellen und automatisch die Schnittstelle aufrufen, um festzustellen, ob sich das Menü ändert, und automatisch das Menü generieren und aktualisieren.
Es kann korrekt auf die von WeChat gesendete Token -Überprüfung reagieren, was bequem und schnell ist.
Die Verwendung dieses Frameworks hat keinen Einfluss auf die native Mapping von SpringMVC, und es wird auch keine eindeutige Zuordnungsbeziehung (außer der Authentifizierungsanforderung) einnimmt. Bei diesem Framework können Sie alle nativen SpringMVC -Funktionen, einschließlich Root -Verzeichnisanfragen, verwenden und werden nicht allein vom WeChat -Server besetzt.
Wenn Sie eine separate Adresse als WeChat -API -Anrufadress verwenden möchten, konfigurieren Sie WX.Path als Pfadinformationen, die mit dem URL -Pfad in den Interface -Konfigurationsinformationen im WeChat Official Account Backend Management übereinstimmen müssen.
Geben Sie den WeChat OAuth2-Authentifizierungsabschnitt an, füllen Sie den Domänennamen der OAUTH2 Autorisierungs-Rückrufseite ein, indem Sie wx.callback-domain konfigurieren, wx.mvc.interceptor.includepufpferns und wx.mvc.Interceptor.Excludepatterns, um die Ziel Adresse des Intercepting der Abschnitt zu konfigurieren. Sie können eine WXOAUTH2Callback -Schnittstellen -Implementierungsklasse als Bean angeben, und diese Bean wird automatisch in WXOAUTH2Interceptor injiziert und nach der Übergabe der WeChat -Webauthentifizierung (wxoAuth2Context). Sie können den Kontext WXWebuser in dieser Methode erhalten und den WXWebuser durch den WXUSERMANAGER in WXUSER konvertieren. Detaillierte Beziehungsinformationen finden Sie unter: WeChat Web Authorization.
Seit Version 0.3.6 wird die alternative Eigenschaft WX.Callback-URL von WX.Callback-Domain bereitgestellt, mit der die URL des Rückrufs einschließlich des Namens von Callback-Domain und Protokolltyp festgelegt wird. Es gibt mehr Protokolltypen als WX.Callback-Domain. Verwenden Sie diese Konfiguration, um die Callback-Domain-Konfiguration zu ersetzen.
Zusätzliche Funktion 1: Ansichtstyp WXButton, der automatisch feststellt, ob die URL unter dem autorisierten Callback -Domänennamen zur Adresse gehört, und sie automatisch als URL mit OAuth2 zu behandeln, die bei Bedarf enthalten sind. Der Standard -Interceptor kann verwendet werden, um die Funktion des Abrufens von Klickinformationen in der Menü -URL zu realisieren. Gleichzeitig unterstützt sie in Kombination mit der Funktion WX.Callback-URL die Konfiguration von relativen Pfaden im Menü, ohne einen Domänennamen zu tragen.
Zusätzliche Funktion 2: Bestimmen Sie automatisch, ob die URL in der Nachricht eine OAuth -Umleitung hinzufügen muss. Weitere Informationen finden Sie in WXRedirectils.
Im Code können Sie WXJSticketManager verwenden, um WXJSticket zu erhalten
@Autowired
WxJsTicketManager wxJsTicketManager;
Weitere Informationen finden Sie in der Methode zur detaillierten Verwendung
Konfigurieren Sie wx.encrypt = true, wx.encodingaeskey = Aeskey im Hintergrund des offiziellen Konto
Beachten Sie, dass Sie beim Einschalten der Nachrichtenverschlüsselung und der Entschlüsselung JCE Unlimited Berechtigungen einschalten müssen.
JDK7 Download-Adresse: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-Download-432124.html
JDK8 Download-Adresse: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
Nach dem Herunterladen sehen Sie local_policy.jar, us_export_policy.jar und readme.txt. Wenn JRE installiert ist, platzieren Sie die beiden JAR -Dateien in das %JRE_HOME % lib Security -Verzeichnis, um die Originaldatei zu überschreiben. Wenn JDK installiert ist, müssen Sie auch die beiden JAR -Dateien im %jdk_home % jre lib Security -Verzeichnis einsetzen, um die Originaldatei zu überschreiben.
Sie können später Unterstützung hinzufügen und Anmerkungen verwenden, um den Kundendienst von Nachrichten zu definieren, ähnlich wie @rabbitiereerer
Ein wenig problematische Benutzerklassifizierung
Gibt es eine gute Implementierung der Benutzergruppierung oder so? Noch keine Nachfrage
Wie Zahlung usw.
Anfangsversion
Optimieren Sie die Bindung der Nachrichtenparameter, fügen Sie die angegebene Meldungskörperbindung hinzu, siehe WXRequestBody
Laden Sie das Maven Central Repository hoch, generieren Sie Javadoc und eine Reihe von Normalisierungen
Treten Sie Apache Copyright, alle Delombok bei
Als ich das letzte Mal Copyright beigetreten habe, habe ich die Header -Kommentare aller Dateien versehentlich gelöscht. Ich habe jetzt einige von ihnen gefüllt. Schließlich füge ich die WeChat -Karten -Gutscheinfunktion hinzu und veröffentlichen die Release -Version