Antes de usar este marco, se recomienda tener una comprensión de los documentos de desarrollo de la cuenta pública de WeChat, pero usar este marco sin comprender los documentos de la cuenta pública también puede completar una cuenta pública simple de WeChat.
Actualmente compatible con Spring Boot 1.4+ y Spring Boot 2.x. Todos son bienvenidos para mencionar el problema y la contribución, y también bienvenidos a unirse al grupo para discutir 627254793. Los proyectos de código abierto deben ser compartidos por todos. Gracias ~
Enlace de solicitud de cuenta oficial de WeChat Test Oficial
<!-- 支持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>
Cree una nueva aplicación de archivo de configuración.
Código de prueba:
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;
}
}
Debido a que las cuentas públicas de WeChat deben configurar su propia interfaz de servidor, puede usar directamente las pruebas locales durante las pruebas. El uso de la penetración de intranet puede permitir que las plataformas públicas de WeChat accedan a su propio servidor local.
El software puede usar ngrok o natapp. Consulte los documentos oficiales de ambos.
La dirección de URL del nombre de dominio generada después del inicio se puede configurar en wx.callback-url para la autenticación OAuth2. El nombre de dominio en la URL generada anteriormente también debe configurarse en el nombre de dominio de la página de devolución de llamada de autorización.
Complete el nombre de dominio generado en el paso 4 en la información de configuración de la interfaz de la cuenta oficial de prueba. El token usa el token en el archivo de configuración. Después de ahorrar, si no sucede nada inesperado, debe verificarse con éxito. Si tiene alguna pregunta, proporcione comentarios a tiempo.


Después de comenzar el ejemplo anterior, preste atención a su cuenta oficial. En este momento, el menú de la cuenta oficial debe tener dos menús principales: izquierda y derecha, y hay dos submenú a la izquierda: mensaje de texto y enlace de clic.
Cuando haga clic en el menú Mensaje de texto, recibirá un mensaje de texto, que es: Pruebe el mensaje de texto.
Cuando haga clic en el segundo enlace de clic, saltará a Baidu y recibirá un mensaje gráfico con el título del mensaje gráfico de prueba.
Al enviar un mensaje de texto a la cuenta oficial, si el contenido del mensaje no comienza con 1, recibirá una respuesta a la cuenta oficial: "El contenido del mensaje se recibe" + el contenido enviado.
Envíe un mensaje de texto a la cuenta oficial. Cuando el contenido del mensaje comience con 1, recibirá una respuesta al mensaje gráfico y de texto.
Cuando un usuario se da de baja a la cuenta oficial, el apodo del usuario se imprimirá en System.out + "no suscribido a la cuenta oficial"
Annotation @WxApplication se utiliza para declarar la aplicación como una aplicación WeChat y comenzar a usar SpringApplication. Si ya tiene un entorno SpringBoot, agregue la anotación @enablewxmvc a su clase @SpringApplication, el efecto es el mismo. Puede ver el código fuente.
La anotación @WXController se usa para declarar que la clase es un controlador WeChat. Solo cuando se declare esta anotación, estará vinculada al mapa de solicitud del servidor WeChat, de lo contrario, la clase será ignorada.
Anotación @wxButton (grupo = wxButton.group.left, main = true, name = "izquierda") se usa para declarar un cuadro de botón. El grupo representa un grupo, con tres grupos a la izquierda, centro y derecha, correspondiente a los tres menús de WeChat de primer nivel. Main es un valor booleano, lo que significa si el elemento del menú es un menú de primer nivel. El nombre es el nombre del menú.
Anotación @wxbutton (type = wxButton.type.click, grupo = wxButton.group.left, orden = wxButton.order.first, name = "Mensaje de texto") se utiliza para declarar el submenú de la agrupación de izquierda. El pedido representa el orden, aquí está el primero.
Public String LeftFirst (WxRequest WxRequest, WXUSER WXUSER) {return "Test Text Message"; } Hay tres puntos aquí:
@WxButton (type = wxButton.type.view, group = wxButton.Group.left, orden = wxButton.order.second, url = "http://baidu.com", name = "Haga clic en el enlace") Esta anotación es la misma que la anterior, y el tipo se convierte en vista. Para contenido específico, puede consultar la anotación de enumeración o el documento de cuenta oficial. Tenga en cuenta que cada tipo de menú tiene sus propias limitaciones. Consulte la documentación. Si no se cumplen las condiciones, se producirá una excepción cuando se inicie el inicio.
La anotación @wxasyncMessage indica que el mensaje se responde de manera asincrónica, consulte el mensaje de servicio al cliente y no se proporciona soporte para un servicio al cliente múltiple en este momento.
WxMessage.News.Builder (). En la clase WXMessage, hay diferentes clases internas estáticas y sus constructores. A través del constructor, se pueden construir fácilmente diferentes tipos de mensajes WeChat. Consulte los mensajes de respuesta pasivos y los mensajes de servicio al cliente.
Anotación @wxeventmapping (type = wxevent.type.unsubscribe) vincula el evento de cancelación de suscripción. Cuando un usuario deja de seguir, se ingresará la lógica debajo de esta anotación. Otro punto a tener en cuenta es que todos los contenidos de respuesta de wxeventmapping se enviarán al usuario de manera asincrónica.
Anotación @wxMessageMapping (type = wxMessage.type.text) significa vincular el mensaje de texto enviado por el usuario a la siguiente lógica del método, texto de cadena public (contenido de cadena) {return "El mensaje recibido es" + contenido; }. El contenido se asignará automáticamente al contenido de texto enviado por el usuario.
La anotación @WXMessageMapping (type = wxMessage.type.Text, Wildcard = "1*") es lo mismo que el anterior. La diferencia es el personaje comodín comodín. Este personaje comodín apoya el contenido de comodín. Anular la lógica comodín ingresará la lógica de ejecución a continuación.
Perfectamente integrado con el arranque de primavera. Si no tiene un proyecto SpringBoot y desea utilizar este marco para crear una cuenta pública, puede usar directamente @WXApplication para marcar la clase de inicio. Esta anotación admite el parámetro: MenuAutocreate, el valor predeterminado es verdadero. Significa que el menú WeChat se crea automáticamente, y se puede configurar en falso para desactivar el comportamiento de crear automáticamente el menú. Si ya tiene un proyecto de arranque de Spring y desea introducir este marco, simplemente marque la anotación @enableWxMVC en cualquier clase de configuración, y los parámetros son los mismos que anteriores.
Hay tres tipos de asignaciones compatibles:
Nota: La clase que BINK debe ser declarada como @WXController
Se admiten los siguientes tipos de parámetros:
La unión de parámetros actualmente admite estos tipos. Si hay una mejor solución que debe ser compatible, también puede presentar directamente opiniones y sugerencias, y los trataré de manera oportuna.
El valor de retorno admite los siguientes tipos:
Los mensajes asincrónicos anteriores se envían utilizando wxMessageTemplate, que se explica a continuación.
Este marco proporciona WXMessageTemplate para enviar mensajes, y al mismo tiempo proporciona el soporte de WXMessageProcessor en la plantilla, que es procesar mensajes antes de enviarlos.
Por ejemplo, al devolver los mensajes sincrónicamente, debe escribir el campo FromUsername, que es el campo Tousername cuando se envía el mensaje. No es necesario permitir que los usuarios del marco procesen este campo. Este campo se procesa en el procesador WXCommonMessageProcessor. Si está interesado, puede consultar el código fuente.
También es compatible con la siguiente conversión: para los mensajes de tipo medios, puede usar directamente MediaUrl o MediaPath para escribir la ruta del material, y el convertidor de mensajes administra automáticamente el material a través de WXMediaManager para obtener la ID de material necesaria. (Escriba a continuación sobre wxmediaManager)
Nota: Al procesar mensajes de texto, se recomienda utilizar el constructor del contenido del mensaje correspondiente en WXMessage para generarlos.
Este marco proporciona WXMediaManager para administrar materiales, y también utiliza una base de datos integrada para guardar la correspondencia entre materiales y archivos locales. Aunque he completado esta parte de la función en la actualidad, siempre siento que hay un gran problema. Espero que alguien pueda ayudarme a verlo y darme algunas sugerencias.
Los medios de comunicación en el envío de mensajes anteriores se implementan en realidad a través del administrador de materiales.
La versión 0.2.0.alpha optimiza el almacenamiento, utilizando la interfaz wxmediastore para administrar el almacenamiento de medios, los desarrolladores pueden implementar esta interfaz por sí mismos y registrarse como el frijol de Spring para reemplazar el MAPDBWXMediaStore predeterminado. Para el uso específico de cada interfaz, consulte MAPDBWXMediaStore. También se puede proporcionar una implementación basada en la memoria aquí para reemplazar MAPDB.
Este marco proporciona la interfaz WXTokenStore para almacenar tokens y proporciona una implementación predeterminada basada en la memoria de MemoryWxtokenStore. Si necesita ser distribuido, puede implementar esta interfaz usted mismo e inyectar la clase de implementación en Spring como un bean.
Use la interfaz WXAPIINVOKESPI y la clase WXInvokerProxyFactory Factory para generar automáticamente el proxy de llamadas de interfaz WeChat. Solo necesita declarar métodos y anotaciones. Por defecto, se utiliza la interfaz de llamada httpcomponent. Los amigos interesados pueden consultar el código fuente. No lo escribo bien, así que si tiene mejores sugerencias, no dude en presentarlas.
Al mismo tiempo, se realiza un análisis preliminar del valor de retorno. Si el código de error del contenido devuelto de la interfaz no es 0, se arrojará como una excepción. El sistema de excepción es WXException y sus subclases.
PD: También puede usar este método para generar su propia interfaz de llamadas proxy a voluntad. Agregaré la documentación en el futuro, así que soy vago por el momento. . .
Puede activar y apagar el conmutador, generar la estructura del menú a través de la anotación de @WxButton y llamar automáticamente la interfaz para determinar si el menú cambia y generar y actualizar automáticamente el menú.
Puede responder correctamente a la verificación del token enviado por WeChat, que es conveniente y rápido.
El uso de este marco no tendrá ningún impacto en el mapeo nativo de SpringMVC, ni ocupará ninguna relación de mapeo única (excepto la solicitud de autenticación). En el caso de este marco, puede usar cualquier función nativa de SpringMVC, incluidas las solicitudes de directorio raíz, y no estará ocupado solo por el servidor WeChat.
Si desea utilizar una dirección separada como la dirección de llamada de la API de WeChat, configure WX.Path como información de ruta, que debe ser consistente con la ruta de URL en la información de configuración de la interfaz en la administración de backend de cuentas oficiales de WeChat.
Proporcione la intersección de autenticación WeChat OAuth2, complete el nombre de dominio de la página de devolución de llamada de autorización OAUTH2 configurando wx.callback-dominio, configure wx.mvc.interceptor.includePatterns y wx.mvc.interceptor.ExcludePatterns para configurar la dirección objetivo de la intersección de intersección. Puede proporcionar una clase de implementación de la interfaz WXOAuth2Callback como un bean, y este bean se inyectará automáticamente en wxoauth2interceptor, y llame después (wxoauth2context después de que se pase la autenticación web de WeChat. El método del contexto) pasa el contexto relacionado al método del bean. Puede obtener el contexto wxwebuser en este método y convertir el wxwebuser en wxuser a través del wxusermanager. Para obtener información sobre la relación detallada, consulte: Autorización web de WeChat.
Desde la versión 0.3.6, se proporciona la propiedad alternativa WX.Callback-URL de WX.Callback-Domain, que se utiliza para establecer la URL de la devolución de llamada, incluido el nombre de dominio de devolución de llamada y el tipo de protocolo. Hay más tipos de protocolo que WX.Callback-Domain, utilice esta configuración para reemplazar la configuración del dominio de devolución de llamada.
Función adicional 1: Vista tipo WXButton, que determina automáticamente si la URL pertenece a la dirección bajo el nombre de dominio de devolución de llamada autorizado y la maneja automáticamente como una URL que contiene OAUTH2 según sea necesario. El interceptor predeterminado se puede utilizar para realizar la función de obtener información del usuario de clic en la URL del menú. Al mismo tiempo, combinado con la función wx.callback-url, admite la configuración de rutas relativas en el menú sin llevar un nombre de dominio.
Función adicional 2: Determine automáticamente si la URL en el mensaje debe agregar redirección OAuth, consulte WXREDIRECTUtils.
En el código, puede usar wxjsticketManager para obtener wxjsticket
@Autowired
WxJsTicketManager wxJsTicketManager;
Consulte el método para su uso detallado
Configurar wx.Encrypt = True, wx.encodingaeskey = aeskey set en el fondo de la cuenta oficial, es decir, habilitar el cifrado de mensajes y el modo de descifrado
Tenga en cuenta que al encender el cifrado y el descifrado de mensajes, debe activar los permisos ilimitados de JCE.
JDK7 Dirección de descarga: http://www.oracle.com/technetwork/java/javase/downloads/jce-7 download-432124.html
JDK8 Dirección de descarga: http://www.oracle.com/technetwork/java/javase/downloads/jce8 download-2133166.html
Después de descargar, puede ver local_policy.jar, us_export_policy.jar y readme.txt. Si se instala JRE, coloque los dos archivos JAR en el directorio %jre_home % lib de seguridad para sobrescribir el archivo original. Si se instala JDK, también debe colocar los dos archivos JAR en el directorio %jdk_home % jre lib de seguridad para sobrescribir el archivo original.
Puede agregar soporte más tarde y usar anotaciones para definir el servicio al cliente de mensajes, similar a @RabitListener
Un poco problemático, clasificación de usuario
¿Existe una buena implementación de la agrupación de usuarios o algo así? No hay demanda todavía
Como el pago, etc.
Versión inicial
Optimizar el enlace de parámetros del mensaje, agregar el enlace del cuerpo del mensaje especificado, consulte WXRequestBody
Cargue el repositorio central de Maven, genere javadoc y una serie de normalizaciones
Únete a Apache Copyright, todos Delombok
La última vez que me uní a Copyright, accidentalmente eliminé los comentarios del encabezado de todos los archivos. Ahora he llenado algunos de ellos. Después de todo, agregaré la función de cupón de tarjeta WeChat y lanzaré la versión de lanzamiento