Перед использованием этой структуры рекомендуется иметь некоторое понимание документов разработки общественного аккаунта WeChat, но использование этой структуры без понимания документов публичного аккаунта также может заполнить простой публичный аккаунт WeChat.
В настоящее время совместим с Spring Boot 1.4+ и Spring Boot 2.x. Каждый может упомянуть проблемы и вклад, а также приглашать присоединиться к группе, чтобы обсудить 627254793. Каждый должен разделить проекты с открытым исходным кодом. Спасибо ~
WeChat Test Office Office Application Ссылка
<!-- 支持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>
Создайте новое приложение файла конфигурации. Прозрачные или другие типы файлов конфигурации, поддерживаемые Spring Boot в каталоге ресурсов, и добавьте конфигурацию:
Тестовый код:
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;
}
}
Поскольку общественные учетные записи WeChat должны настроить свой собственный интерфейс сервера, вы можете напрямую использовать локальное тестирование во время тестирования. Использование проникновения интрасети может позволить общедоступным платформам WeChat добраться до вашего собственного локального сервера.
Программное обеспечение может использовать NGROK или NATAPP. Пожалуйста, обратитесь к официальным документам обоих.
Адрес URL-адреса доменного имени, сгенерированный после запуска, может быть настроен в wx.callback-url для аутентификации OAuth2. Доменное имя в URL, сгенерированном выше, также должно быть настроено в доменном имени страницы обратного вызова авторизации.
Заполните имя домена, сгенерированное на шаге 4 в информации о конфигурации интерфейса в официальной учетной записи тестирования. Токен использует токен в файле конфигурации. После сохранения, если ничего неожиданного не происходит, это должно быть успешно проверено. Если у вас есть какие -либо вопросы, пожалуйста, предоставьте обратную связь вовремя.


После того, как приведенный выше пример запускается, обратите внимание на свою официальную учетную запись. В настоящее время в меню официальной учетной записи должно быть два основных меню: слева и справа, и есть два подменю слева: текстовое сообщение и нажмите на ссылку.
Когда вы нажимаете на меню текстовых сообщений, вы получите текстовое сообщение: тестовое текстовое сообщение.
Когда вы нажмете ссылку на второй щелчок, вы перейдете на Baidu и получите графическое сообщение с заголовком тестового графического сообщения.
При отправке текстового сообщения в официальную учетную запись, если содержимое сообщения не начинается с 1, вы получите ответ на официальную учетную запись: «Содержимое сообщения получено» + отправленный контент.
Отправьте текстовое сообщение в официальную учетную запись. Когда содержимое сообщения начнется с 1, вы получите ответ на графическое и текстовое сообщение.
Когда пользователь отписывает подписку на официальную учетную запись, прозвище пользователя будет напечатано в System.out + «Отписано в официальную учетную запись».
Аннотация @wxapplication используется для объявления приложения как приложение WeChat и начать использовать SpringApplication. Если у вас уже есть среда Springboot, добавьте аннотацию @enablewxmvc в свой класс @springapplication, эффект такой же. Вы можете увидеть исходный код.
Аннотация @wxcontroller используется для объявления, что класс является контроллером WeChat. Только когда эта аннотация будет объявлена, будет ли она связана с картой запроса сервера WeChat, в противном случае класс будет игнорироваться.
Аннотация @wxbutton (group = wxbutton.group.left, main = true, name = "left") используется для объявления коробки кнопок. Группа представляет группу с тремя группами слева, в центре и справа, соответствующих трем меню первого уровня WeChat. Main-это логическое значение, что означает, является ли пункт меню меню первого уровня. Имя - имя меню.
Аннотация @wxbutton (type = wxbutton.type.click, group = wxbutton.group.left, order = wxbutton.order.first, name = "Текстовое сообщение") используется для объявления подменю левой группировки. Порядок представляет собой заказ, вот первый.
public String LeatsFirst (WxRequest WxRequest, WXUSER WXUSER) {return «Тестное текстовое сообщение»; } Здесь три балла:
@Wxbutton (type = wxbutton.type.view, group = wxbutton.group.left, order = wxbutton.order.second, url = "http://baidu.com", name = "Нажмите на ссылку"). Это аннотация такая же, как и выше, и тип становится просмотром. Для конкретного контента вы можете ссылаться на аннотацию перечисления или официальный документ учетной записи. Обратите внимание, что каждый тип меню имеет свои ограничения. Пожалуйста, обратитесь к документации. Если условия не будут выполнены, исключение произойдет при запуске запуска.
Аннотация @wxasyncmessage указывает, что сообщение отвечает асинхронно, обратитесь к сообщению службы поддержки клиентов, и в настоящее время не предоставляется поддержка для нескольких клиентов.
Wxmessage.news.builder (). В классе Wxmessage существуют разные статические внутренние классы и их строители. Через строителя различные типы сообщений WeChat могут быть легко построены. Пожалуйста, обратитесь к пассивным ответным сообщениям и сообщениям службы поддержки клиентов.
Аннотация @wxeventmapping (type = wxevent.type.unsubscribe) связывает событие отказа от подписки. Когда пользователь отписывается, логика ниже этой аннотации будет введена. Другой момент, который следует отметить, состоит в том, что все ответные содержимое wxeventmapping будут отправлены пользователю асинхронно.
Аннотация @wxmessagemapping (type = wxmessage.type.text) означает привязку текстового сообщения, отправленного пользователем, к следующей логике метода, открытый строковый текст (String Content) {return »Полученное сообщение« + Content; }. Контент будет автоматически назначен текстовому контенту, отправленному пользователем.
Аннотация @wxmessagemapping (type = wxmessage.type.text, wildcard = "1*") такой же, как и выше. Разница - это персонаж подстановочного знака. Этот подстановочный персонаж поддерживает содержание подстановочных знаков. Переопределение логики подстановочного знака войдет в логику выполнения ниже.
Идеально интегрирован с весенним ботином. Если у вас нет проекта Springboot и вы хотите использовать эту структуру для создания публичной учетной записи, вы можете напрямую использовать @WxApplication для обозначения класса запуска. Эта аннотация поддерживает параметр: menuautocreate, по умолчанию верно. Это означает, что меню WeChat создается автоматически, и его можно настроить на False, чтобы отключить поведение автоматического создания меню. Если у вас уже есть проект Spring Boot и вы хотите представить эту структуру, просто отметьте аннотацию @enablewxmvc на любом классе конфигурации, а параметры совпадают с тем, что выше.
Поддерживается три типа отображений:
Примечание: класс, который вы привязываете, должен быть объявлен как @wxcontroller
Поддерживаются следующие типы параметров:
Привязка параметров в настоящее время поддерживает эти типы. Если есть лучшее решение, которое необходимо поддерживать, вы также можете напрямую выдвигать мнения и предложения, и я буду своевременно разобраться с ними.
Возвратное значение поддерживает следующие типы:
Приведенные выше асинхронные сообщения отправляются с использованием wxmessageTemplate, что объясняется ниже.
Эта структура предоставляет wxmessageTemplate отправку сообщений и в то же время обеспечивает поддержку wxmessageprocessor в шаблоне, которая предназначена для обработки сообщений перед их отправкой.
Например, при синхронном возвращении сообщений вам нужно написать поле Fromusername, которое является полем Tousername при отправке сообщения. Нет необходимости позволять пользователям Framework обрабатывать это поле. Это поле обрабатывается в процессоре wxcommonmessageprocessor. Если вы заинтересованы, вы можете обратиться к исходному коду.
Он также поддерживает следующее преобразование: для сообщений типа носителя вы можете напрямую использовать MediaUrl или MediaPath для написания пути материала, а конвертер сообщений автоматически управляет материалом через WXMediaManager для получения необходимого идентификатора материала. (Напишите ниже о Wxmediamanager)
ПРИМЕЧАНИЕ. При обработке текстовых сообщений рекомендуется использовать строитель соответствующего содержимого сообщения в wxmessage для их создания!
Эта структура предоставляет WXMediaManager управление материалами, а также использует встроенную базу данных для сохранения соответствия между материалами и локальными файлами. Хотя в настоящее время я завершил эту часть функции, я всегда чувствую, что есть большая проблема. Я надеюсь, что кто -то может помочь мне увидеть это и дать мне несколько предложений.
Средства массовой информации в приведенном выше сообщении отправляются фактически реализуются через диспетчер материалов.
Версия 0.2.0. Alpha оптимизирует хранилище, используя интерфейс Wxmediastore для управления хранилищем СМИ, разработчики могут самостоятельно реализовать этот интерфейс и зарегистрироваться в качестве боба Spring, чтобы заменить Mapdbwxmediastore по умолчанию. Для конкретного использования каждого интерфейса, пожалуйста, обратитесь к Mapdbwxmediastore. Реализация на основе памяти также может быть предоставлена здесь для замены MAPDB.
Эта структура предоставляет интерфейс wxtokenstore для хранения токенов и обеспечивает реализацию MemoryWxtokenStore на основе памяти по умолчанию. Если вам нужно распределить, вы можете реализовать этот интерфейс самостоятельно и внедрить класс реализации в Spring в качестве боба.
Используйте интерфейс wxapiinvokespi и класс WxinvokerProxyFactory Factory, чтобы автоматически генерировать прокси интерфейс WeChat. Вам нужно только объявить методы и аннотации. По умолчанию используется интерфейс вызова HTTPComponent. Заинтересованные друзья могут проверить исходный код. Я не пишу это хорошо, поэтому, если у вас есть какие -либо лучшие предложения, пожалуйста, не стесняйтесь выдвигать их.
В то же время выполняется предварительный анализ возвращаемого значения. Если ошибка кода возвращаемого содержимого интерфейса не является 0, он будет брошен в качестве исключения. Система исключений - это wxexception и ее подклассы.
PS: Вы также можете использовать этот метод для создания собственного интерфейса прокси -вызова по желанию. Я добавлю документацию в будущем, поэтому я ленив на данный момент. Полем Полем
Вы можете включать и выключать переключатель, генерировать структуру меню через аннотацию @wxbutton и автоматически вызовать интерфейс, чтобы определить, изменяется ли меню, и автоматически генерировать и обновить меню.
Он может правильно ответить на проверку токена, отправленная WeChat, что удобно и быстро.
Использование этой структуры не окажет никакого влияния на собственное собственное картирование SpringMVC, а также не будет занимать какие -либо уникальные отношения картирования (кроме запроса на аутентификацию). В случае этой структуры вы можете использовать любые собственные функции SpringMVC, включая запросы Root Directory, и не будет занят только сервером WeChat.
Если вы хотите использовать отдельный адрес в качестве адреса вызова WeChat API, пожалуйста, настройте WX.Path в качестве информации о пути, которая должна соответствовать пути URL в информации о конфигурации интерфейса в управлении Backend Office Account Wechat.
Предоставьте перехват аутентификации weChat OAuth2, заполните имени доменного обратного обратного обращения OAUTH2, настраивая wx.callback-domain, настройка wx.mvc.interceptor.includepatterns и wx.mvc.interceptor.excludepatterns для настройки целевого адреса перехвата. Вы можете предоставить класс реализации интерфейса wxoAuth2callback в качестве боба, и этот боб будет автоматически вводим в wxoauth2interceptor и вызов после (WxoAuth2context после того, как WeChat веб -аутентификация проходит. Контекст) метод передает связанный контекст с методом фасоли. В этом методе вы можете получить контекст WxWebuser и преобразовать WXWEBUSER в WXUSER через WXUSERMAGER. Для получения подробной информации о взаимоотношениях, пожалуйста, см. В WeChat Web Authortization.
С момента версии 0.3.6 предоставляется альтернативное свойство wx.callback-url of wx.callback-domain, которое используется для установки URL-адреса обратного вызова, включая имя домена обратного вызова и тип протокола. Существует больше типов протоколов, чем wx.callback-domain, используйте эту конфигурацию, чтобы заменить конфигурацию домена обратного вызова.
Дополнительная функция 1: Посмотреть тип WXBUTTON, который автоматически определяет, принадлежит ли URL -адресу адреса под авторизованным именем домена обратного вызова и автоматически обрабатывает его как URL, содержащий OAuth2 по мере необходимости. Перехватчик по умолчанию можно использовать для реализации функции получения информации пользователя Click в URL -адресе меню. В то же время, в сочетании с функцией wx.callback-url, он поддерживает настройку относительных путей в меню без ношения доменного имени.
Дополнительная функция 2: автоматически определить, должен ли URL в сообщении добавить oauth redirect, пожалуйста, обратитесь к wxredirectutils.
В коде вы можете использовать wxjsticketmanager для получения wxjsticket
@Autowired
WxJsTicketManager wxJsTicketManager;
Обратитесь к методу подробного использования
Настройка wx.encrypt = true, wx.encodingaeskey = aeskey устанавливается в фоновом режиме официальной учетной записи, то есть включить шифрование сообщений и режим расшифровки
Обратите внимание, что при включении шифрования и дешифрования сообщений вам необходимо включить неограниченные разрешения JCE.
Jdk7 Адрес загрузки: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-7-vload-432124.html
Jdk8 Адрес загрузки: http://www.oracle.com/technetwork/java/javase/downloads/jce8-vload-2133166.html
После загрузки вы можете увидеть local_policy.jar, us_export_policy.jar и readme.txt. Если JRE установлен, поместите два файла JAR в каталог JRE_HOME % LIB Security, чтобы перезаписать исходный файл. Если JDK установлен, вы также должны поместить два файла JAR в %jdk_home % jre lib Deference Directory, чтобы перезаписать исходный файл.
Вы можете добавить поддержку позже и использовать аннотации для определения службы клиентов сообщений, аналогично @RabbitListener
Немного неприятная, пользовательская классификация
Есть ли хорошая реализация группировки пользователей или что -то в этом роде? Пока нет спроса
Такие как оплата и т. Д.
Начальная версия
Оптимизировать привязку параметров сообщения, добавить привязку указанной тела сообщения, см.
Загрузить центральный репозиторий Maven, генерировать Javadoc и ряд нормализаций
Присоединяйтесь к Apache Copyright, All Delombok
В последний раз, когда я присоединился к авторским правам, я случайно удалил комментарии за заголовок всех файлов. Теперь я заполнил некоторые из них. В конце концов, я добавлю функцию купона WeChat Card и выпущу версию релиза