Avant d'utiliser ce cadre, il est recommandé d'avoir une certaine compréhension des documents de développement du compte public WeChat, mais l'utilisation de ce cadre sans comprendre les documents du compte public peut également compléter un simple compte public WeChat.
Actuellement compatible avec Spring Boot 1.4+ et Spring Boot 2.x. Tout le monde est invité à mentionner le problème et la contribution, et il est également invité à rejoindre le groupe pour discuter du 627254793. Les projets open source doivent être partagés par tous. Merci ~
WECHAT Test de lien de demande de compte officiel
<!-- 支持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>
Créez un nouveau fichier de configuration Application.properties ou d'autres types de fichiers de configuration pris en charge par Spring Boot dans le répertoire des ressources et ajoutez la configuration:
Code de test:
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;
}
}
Étant donné que les comptes publics WeChat doivent configurer leur propre interface de serveur, vous pouvez utiliser directement des tests locaux lors des tests. L'utilisation de la pénétration d'intranet peut permettre aux plateformes publiques WeChat d'accéder à votre propre serveur local.
Le logiciel peut utiliser ngrok ou natapp. Veuillez vous référer aux documents officiels des deux.
L'adresse URL du nom de domaine généré après le démarrage peut être configurée dans wx.callback-url pour l'authentification OAuth2. Le nom de domaine de l'URL généré ci-dessus doit également être configuré dans le nom de domaine de la page de rappel d'autorisation.
Remplissez le nom de domaine généré à l'étape 4 dans les informations de configuration de l'interface du compte officiel de test. Le jeton utilise le jeton dans le fichier de configuration. Après économie, si rien de inattendu ne se produit, il doit être vérifié avec succès. Si vous avez des questions, veuillez fournir des commentaires à temps.


Après le début de l'exemple ci-dessus, veuillez faire attention à votre compte officiel. À l'heure actuelle, le menu du compte officiel doit avoir deux menus principaux: à gauche et à droite, et il y a deux sous-menu à gauche: SMS et cliquez le lien.
Lorsque vous cliquez sur le menu du message texte, vous recevrez un SMS, qui est: Testez le message texte.
Lorsque vous cliquez sur le deuxième clic, vous passez à Baidu et recevrez un message graphique avec le titre du message graphique de test.
Lors de l'envoi d'un SMS au compte officiel, si le contenu du message ne commence pas par 1, vous recevrez une réponse au compte officiel: "Le contenu du message est reçu" + le contenu envoyé.
Envoyez un SMS au compte officiel. Lorsque le contenu du message commence par 1, vous recevrez une réponse au graphique et au SMS.
Lorsqu'un utilisateur se désinscrive au compte officiel, le surnom de l'utilisateur sera imprimé dans System.out + "Unbrescrit au compte officiel"
Annotation @wxapplication est utilisée pour déclarer l'application en tant qu'application WeChat et commencer à utiliser SpringApplication. Si vous avez déjà un environnement Springboot, veuillez ajouter l'annotation @enablewxmvc à votre classe @springApplication, l'effet est le même. Vous pouvez voir le code source.
L'annotation @WXController est utilisée pour déclarer que la classe est un contrôleur WeChat. Ce n'est que lorsque cette annotation sera déclarée qu'elle sera liée à la carte de demande du serveur WeChat, sinon la classe sera ignorée.
Annotation @wxbutton (groupe = wxbutton.group.left, main = true, name = "Left") est utilisé pour déclarer une zone de bouton. Le groupe représente un groupe, avec trois groupes à gauche, au centre et à droite, correspondant aux trois menus de premier niveau de WeChat. Main est une valeur booléenne, ce qui signifie si l'élément de menu est un menu de premier niveau. Le nom est le nom du menu.
Annotation @wxbutton (type = wxbutton.type.click, groupe = wxbutton.group.left, ordre = wxbutton.order.First, name = "message texte") est utilisé pour déclarer le sous-menu du groupe de gauche. L'ordre représente l'ordre, voici le premier.
Public String LeftFirst (wxRequest wxRequest, wxUser wxuser) {return "Test Text Message"; } Il y a trois points ici:
@Wxbutton (type = wxbutton.type.view, groupe = wxbutton.group.left, ordre = wxbutton.order.second, url = "http://baidu.com", name = "cliquez sur le lien") Cette annotation est la même que ci-dessus, et le type devient vue. Pour un contenu spécifique, vous pouvez vous référer à l'annotation d'énumération ou au document de compte officiel. Notez que chaque type de menu a ses propres limitations. Veuillez vous référer à la documentation. Si les conditions ne sont pas remplies, une exception se produira au démarrage du démarrage.
L'annotation @wxasyncMessage indique que le message est répondu de manière asynchrone, se référer au message du service client et qu'aucune prise en charge n'est fournie pour le service client pour le moment.
WxMessage.news.builder (). Dans la classe WXMessage, il existe différentes classes internes statiques et leurs constructeurs. Grâce au constructeur, différents types de messages WeChat peuvent être facilement construits. Veuillez vous référer aux messages de réponse passifs et aux messages du service client.
Annotation @wxEventMapping (type = wxEvent.type.unsubscribe) lie l'événement de désinscription. Lorsqu'un utilisateur ne fait pas partie, la logique sous cette annotation sera entrée. Un autre point à noter est que toutes les réponses du contenu de WXEventMapping seront envoyées à l'utilisateur de manière asynchrone.
Annotation @wxmessageMapping (type = wxmesage.type.Text) signifie lier le message texte envoyé par l'utilisateur à la logique de méthode suivante, texte de chaîne publique (contenu de la chaîne) {return "Le message reçu est" + contenu; }. Le contenu sera automatiquement attribué au contenu texte envoyé par l'utilisateur.
L'annotation @wxMessageMapping (type = wxMessage.type.Text, Wildcard = "1 *") est la même que ci-dessus. La différence est le personnage générique du joker. Ce personnage générique soutient le contenu générique. Le remplacement de la logique du jognard entrera dans la logique d'exécution ci-dessous.
Parfaitement intégré à Spring Boot. Si vous n'avez pas de projet Springboot et que vous souhaitez utiliser ce framework pour créer un compte public, vous pouvez utiliser directement @wxapplication pour marquer la classe de démarrage. Cette annotation prend en charge le paramètre: MenuAutoCreate, la valeur par défaut est vraie. Cela signifie que le menu WeChat est automatiquement créé et peut être défini sur False pour désactiver le comportement de la création automatique du menu. Si vous avez déjà un projet Spring Boot et que vous souhaitez introduire ce framework, marquez simplement l'annotation @enablewxmvc sur n'importe quelle classe de configuration, et les paramètres sont les mêmes que ci-dessus.
Il existe trois types de mappages soutenus:
Remarque: la classe que vous liez doit être déclarée @wxController
Les types de paramètres suivants sont pris en charge:
La liaison des paramètres prend actuellement en charge ces types. S'il existe une meilleure solution qui doit être soutenue, vous pouvez également proposer directement des opinions et des suggestions, et je les traiterai en temps opportun.
La valeur de retour prend en charge les types suivants:
Les messages asynchrones ci-dessus sont envoyés à l'aide de WxMessageTemplate, qui est expliqué ci-dessous.
Ce framework fournit WxMessageTemplate pour envoyer des messages et fournit en même temps la prise en charge de WxMessageProcessor dans le modèle, qui consiste à traiter les messages avant de les envoyer.
Par exemple, lorsque vous renvoyez des messages de manière synchrone, vous devez écrire le champ FromUserName, qui est le champ Tousername lorsque le message est envoyé. Il n'est pas nécessaire de permettre aux utilisateurs du Framework de traiter ce champ. Ce champ est traité dans le processeur WXCommonMessageProcessor. Si vous êtes intéressé, vous pouvez vous référer au code source.
Il prend également en charge la conversion suivante: pour les messages de type multimédia, vous pouvez utiliser directement MediaUrl ou MediaPath pour écrire le chemin du matériel, et le convertisseur de messages gère automatiquement le matériel via WxmediaManager pour obtenir l'ID de matériel nécessaire. (Écrivez ci-dessous sur wxmediaManager)
Remarque: Lors du traitement des messages texte, il est recommandé d'utiliser le constructeur du contenu du message correspondant dans wxMessage pour les générer!
Ce cadre fournit WxmediaManager pour gérer les matériaux et utilise également la base de données embarquée pour enregistrer la correspondance entre les matériaux et les fichiers locaux. Bien que j'aie terminé cette partie de la fonction à l'heure actuelle, je pense toujours qu'il y a un gros problème. J'espère que quelqu'un pourra m'aider à le voir et à me donner quelques suggestions.
Les médias dans l'envoi du message ci-dessus sont réellement implémentés via le gestionnaire de matériel.
La version 0.2.0.alpha optimise le stockage, en utilisant l'interface wxmediAtore pour gérer le stockage des médias, les développeurs peuvent implémenter cette interface par eux-mêmes et s'inscrire en tant que bean de Spring pour remplacer le MAPDBWXMediAniastore par défaut. Pour une utilisation spécifique de chaque interface, veuillez vous référer à MapDBWXMediason. Une implémentation basée sur la mémoire peut également être fournie ici pour remplacer MAPDB.
Ce framework fournit l'interface wxtokenstore pour stocker les jetons et fournit une implémentation par défaut basée sur la mémoire de MemoryWxtokenStore. Si vous devez être distribué, vous pouvez implémenter cette interface par vous-même et injecter la classe d'implémentation dans le printemps en tant que bean.
Utilisez l'interface WXAPIINVOKESPI et la classe d'usine WxinvokerProxyfactory pour générer automatiquement le proxy d'appel d'interface WeChat. Vous n'avez qu'à déclarer des méthodes et des annotations. Par défaut, l'interface d'appel HTTPComponent est utilisée. Les amis intéressés peuvent vérifier le code source. Je ne l’écris pas bien, donc si vous avez de meilleures suggestions, n'hésitez pas à les mettre en avant.
Dans le même temps, une analyse préliminaire de la valeur de retour est effectuée. Si le code d'erreur du contenu renvoyé de l'interface n'est pas 0, il sera jeté comme exception. Le système d'exception est WXException et ses sous-classes.
PS: Vous pouvez également utiliser cette méthode pour générer votre propre interface d'appel proxy à volonté. J'ajouterai la documentation à l'avenir, donc je suis paresseux pour le moment. . .
Vous pouvez activer et désactiver le commutateur, générer la structure du menu via l'annotation @wxbutton et appeler automatiquement l'interface pour déterminer si le menu change, et générer et mettre à jour automatiquement le menu.
Il peut répondre correctement à la vérification des jetons envoyés par WeChat, ce qui est pratique et rapide.
L'utilisation de ce cadre n'aura aucun impact sur la cartographie native de SpringMVC, ni occuper la relation de mappage unique (à l'exception de la demande d'authentification). Dans le cas de ce cadre, vous pouvez utiliser toutes les fonctions natives de SpringMVC, y compris les demandes de répertoire racine, et ne sera pas occupée par le serveur WeChat seul.
Si vous souhaitez utiliser une adresse distincte comme l'adresse d'appel de l'API WeChat, veuillez configurer WX.PATH comme information de chemin, qui doit être conforme au chemin d'accès à l'URL dans les informations de configuration de l'interface dans la gestion officielle du compte officiel de WeChat.
Fournissez l'interception d'authentification WECHAT OAUTH2, remplissez le nom de domaine de la page de rappel d'autorisation OAuth2 en configurant wx.callback-domain, configure wx.mvc.interceptor.includePatterns et wx.mvc.interceptor.excludepatterns pour configurer l'adresse cible de l'interception. Vous pouvez fournir une classe d'implémentation d'interface WXOAuth2Callback en tant que bean, et ce bean sera automatiquement injecté dans WXOAuth2Interceptor, et appelez après (WxoAuth2Context après que l'authentification Web de WeChat soit transmise. La méthode de contexte) transmet le contexte connexe à la méthode du bean. Vous pouvez obtenir le contexte wxwebuser dans cette méthode et convertir le wxwebuser en wxuser via le wxuserManager. Pour des informations détaillées sur les relations, veuillez vous référer à: Autorisation Web WeChat.
Depuis la version 0.3.6, la propriété alternative WX.Callback-URL de WX.Callback-Domain est fournie, qui est utilisée pour définir l'URL du rappel, y compris le nom de domaine de rappel et le type de protocole. Il existe plus de types de protocole que WX.Callback-Domain, veuillez utiliser cette configuration pour remplacer la configuration du domaine de rappel.
Fonction supplémentaire 1: Afficher le type WXBUTTON, qui détermine automatiquement si l'URL appartient à l'adresse sous le nom de domaine de rappel autorisé, et le gère automatiquement en tant qu'URL contenant OAuth2 si nécessaire. L'intercepteur par défaut peut être utilisé pour réaliser la fonction d'obtenir des informations sur l'utilisateur de clic sur l'URL du menu. Dans le même temps, combiné avec la fonction wx.callback-url, il prend en charge la configuration des chemins relatifs dans le menu sans porter de nom de domaine.
Fonction supplémentaire 2: Déterminez automatiquement si l'URL dans le message doit ajouter une redirection OAuth, veuillez vous référer aux wxredirectUtils.
Dans le code, vous pouvez utiliser wxjsticketManager pour obtenir wxjsticket
@Autowired
WxJsTicketManager wxJsTicketManager;
Reportez-vous à la méthode d'utilisation détaillée
Configurer wx.encrypt = true, wx.encodingaeskey = aeskey set en arrière-plan du compte officiel, c'est-à-dire le chiffrement des messages et le mode de décryptage
Notez que lorsque vous allumez le cryptage et le décryptage des messages, vous devez activer les autorisations JCE Unlimited.
JDK7 Adresse de téléchargement: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8 Adresse de téléchargement: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
Après le téléchargement, vous pouvez voir local_policy.jar, us_export_policy.jar et readme.txt. Si JRE est installé, placez les deux fichiers JAR dans le répertoire% jre_home% lib Security pour écraser le fichier d'origine. Si JDK est installé, vous devez également placer les deux fichiers JAR dans le répertoire% jdk_home% jre lib security pour écraser le fichier d'origine.
Vous pouvez ajouter une prise en charge plus tard et utiliser des annotations pour définir le service client du message, similaire à @rabbitListener
Un peu gênant, classification des utilisateurs
Y a-t-il une bonne implémentation du regroupement d'utilisateurs ou quelque chose? Aucune demande encore
Comme le paiement, etc.
Version initiale
Optimiser la liaison des paramètres du message, ajouter la liaison du corps du message spécifié, reportez-vous à wxRequestbody
Télécharger le référentiel central Maven, générer du javadoc et une série de normalisations
Rejoignez Apache Copyright, tous Delombok
La dernière fois que j'ai rejoint le droit d'auteur, j'ai accidentellement supprimé les commentaires d'en-tête de tous les fichiers. J'en ai maintenant rempli certains. Après tout, j'ajouterai la fonction de coupon de carte WeChat et publierai la version de version