이 프레임 워크를 사용하기 전에 WeChat 공개 계정의 개발 문서를 이해하는 것이 좋습니다. 그러나 공개 계정의 문서를 이해하지 않고이 프레임 워크를 사용하면 간단한 WeChat 공개 계정을 완성 할 수 있습니다.
현재 Spring Boot 1.4+ 및 Spring Boot 2.X와 호환됩니다. 모든 사람은 문제와 기부금을 언급하는 것을 환영하며 그룹에 가입하여 627254793에 대해 논의 할 수 있습니다. 모든 사람이 오픈 소스 프로젝트를 공유해야합니다. 감사합니다 ~
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>
새 구성 파일 애플리케이션을 만듭니다 .Properties 또는 기타 구성 파일 유형 Resource Directory에서 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 주소는 OAUTH2 인증을 위해 WX.CALLBACK-URL로 구성 할 수 있습니다. 위에서 생성 된 URL의 도메인 이름은 인증 콜백 페이지의 도메인 이름으로 구성되어야합니다.
테스트 공식 계정의 인터페이스 구성 정보에서 4 단계에서 생성 된 도메인 이름을 작성하십시오. 토큰은 구성 파일에서 토큰을 사용합니다. 저장 후 예상치 못한 일이 발생하지 않으면 성공적으로 확인해야합니다. 궁금한 점이 있으면 제 시간에 피드백을 제공하십시오.


위의 예제가 시작되면 공식 계정에주의를 기울이십시오. 현재 공식 계정의 메뉴에는 두 개의 주요 메뉴가 있어야합니다. 왼쪽과 오른쪽으로 왼쪽에는 두 개의 하위 메뉴가 있습니다 : 문자 메시지 및 링크를 클릭하십시오.
문자 메시지 메뉴를 클릭하면 문자 메시지가 표시됩니다. 테스트 문자 메시지.
두 번째 클릭 링크를 클릭하면 Baidu로 점프하여 테스트 그래픽 메시지 제목으로 그래픽 메시지를받습니다.
공식 계정으로 문자 메시지를 보내면 메시지 내용이 1로 시작되지 않으면 공식 계정에 대한 답장을 받게됩니다.
공식 계정에 문자 메시지를 보냅니다. 메시지 내용이 1으로 시작되면 그래픽 및 문자 메시지에 대한 답장을 받게됩니다.
사용자가 공식 계정을 구독하지 않으면 사용자의 닉네임이 System.out + "공식 계정으로 구독되지 않은"인쇄됩니다.
주석 @wxapplication은 응용 프로그램을 WeChat 응용 프로그램으로 선언하고 SpringApplication을 사용하는 데 사용됩니다. SpringBoot 환경이 이미있는 경우 @SpringApplication 클래스에 @enablewxmvc를 추가하십시오. 효과는 동일합니다. 소스 코드를 볼 수 있습니다.
주석 @WXController는 클래스가 WeChat 컨트롤러라고 선언하는 데 사용됩니다. 이 주석이 선언 될 때만 WeChat 서버의 요청 맵에 바인딩됩니다. 그렇지 않으면 클래스가 무시됩니다.
주석 @wxbutton (group = wxbutton.group.left, main = true, name = "left")은 버튼 상자를 선언하는 데 사용됩니다. 그룹은 왼쪽, 중앙 및 오른쪽에 3 개의 그룹이있는 그룹을 나타내며 WeChat의 3 개의 첫 번째 수준 메뉴에 해당합니다. 메인은 부울 값입니다. 이는 메뉴 항목이 첫 번째 레벨 메뉴인지를 의미합니다. 이름은 메뉴 이름입니다.
주석 @wxbutton (type = wxbutton.type.click, group = wxbutton.group.left, order = wxbutton.order.first, name = "텍스트 메시지")는 왼쪽 그룹의 하위 메뉴를 선언하는 데 사용됩니다. 순서는 순서를 나타내고 여기에 첫 번째 순서가 있습니다.
public string leftfirst (wxrequest wxrequest, wxuser wxuser) {return "test 텍스트 메시지"; } 여기에는 세 가지 요점이 있습니다.
@wxbutton (type = wxbutton.type.view, group = wxbutton.group.left, order = wxbutton.order.second, url = "http://baidu.com", "링크에서 클릭")이 주석은 위와 동일하며 유형이보기가됩니다. 특정 콘텐츠의 경우 열거 주석 또는 공식 계정 문서를 참조 할 수 있습니다. 각 메뉴 유형에는 자체 제한 사항이 있습니다. 문서를 참조하십시오. 조건이 충족되지 않으면 시작이 시작되면 예외가 발생합니다.
주석 @WXASYNCMESSAGE는 메시지가 비동기식으로 응답하고 고객 서비스 메시지를 참조하며 현재 여러 고객 서비스에 대한 지원이 제공되지 않음을 나타냅니다.
wxmessage.news.builder (). WXMessage 클래스에는 다른 정적 내부 클래스와 빌더가 있습니다. 빌더를 통해 다양한 유형의 wechat 메시지를 쉽게 구성 할 수 있습니다. 수동 회신 메시지 및 고객 서비스 메시지를 참조하십시오.
주석 @wxeventmapping (type = wxevent.type.unsubscribe)은 구독 취소 이벤트를 바인딩합니다. 사용자가 팔로우하지 않으면이 주석 아래의 논리가 입력됩니다. 주목할만한 또 다른 요점은 WxeventMapping의 모든 답장 내용이 사용자에게 비동기 적으로 전송된다는 것입니다.
주석 @WXMESSAGEMAPPING (type = wxmessage.type.text)는 사용자가 보낸 문자 메시지를 다음 메소드 로직, 공개 문자열 텍스트 (문자열 content)에 바인딩하는 것을 의미합니다. }. 콘텐츠는 사용자가 보낸 텍스트 내용에 자동으로 할당됩니다.
주석 @WXMESSAGEMAPPED (type = wxmessage.type.text, wildcard = "1*")는 위와 동일합니다. 차이점은 와일드 카드 와일드 카드 문자입니다. 이 와일드 카드 문자는 와일드 카드 함량을 지원합니다. 와일드 카드 로직을 무시하면 아래에 실행 로직이 입력됩니다.
Spring Boot와 완벽하게 통합되었습니다. SpringBoot 프로젝트가 없고이 프레임 워크를 사용하여 공개 계정을 구축하려면 @wxapplication을 직접 사용하여 시작 클래스를 표시 할 수 있습니다. 이 주석은 매개 변수를 지원합니다. MenuAutoCreate, 기본값은 true입니다. 이는 WeChat 메뉴가 자동으로 작성되었으며 자동으로 메뉴를 작성하는 동작을 끄기 위해 False로 설정할 수 있습니다. 이미 Spring Boot 프로젝트가 있고이 프레임 워크를 소개하려면 구성 클래스에 주석 @enablewxmvc를 표시하면 매개 변수가 위와 동일합니다.
지원되는 매핑에는 세 가지 유형이 있습니다.
참고 : 바인드 클래스는 @WXController로 선언해야합니다.
다음 유형의 매개 변수가 지원됩니다.
파라미터 바인딩은 현재 이러한 유형을 지원합니다. 더 나은 솔루션이 지원되어야하는 솔루션이 있으면 의견과 제안을 직접 제시 할 수 있으며 적시에이를 다룰 것입니다.
반환 값은 다음 유형을 지원합니다.
위의 비동기 메시지는 wxmessagetemplate를 사용하여 전송되며 아래에 설명되어 있습니다.
이 프레임 워크는 메시지를 보내기 위해 WXMESSAGETEMPLATE를 제공하며 동시에 템플릿에서 wxMessageProcessor 지원을 제공합니다. 이는 메시지를 보내기 전에 메시지를 처리하는 것입니다.
예를 들어, 메시지를 동기로 리턴 할 때는 메시지가 전송 될 때 tousername 필드 인 FromUserName 필드를 작성해야합니다. 프레임 워크 사용자 가이 필드를 처리하도록 할 필요가 없습니다. 이 필드는 WXCommonMessageProcessor 프로세서에서 처리됩니다. 관심이 있으시면 소스 코드를 참조 할 수 있습니다.
또한 다음 변환을 지원합니다. 미디어 유형 메시지의 경우 Mediaurl 또는 MediaPath를 직접 사용하여 자료 경로를 작성할 수 있으며 메시지 변환기는 WXMediaManager를 통해 자료를 자동으로 관리하여 필요한 자료 ID를 얻습니다. (wxmediamanager에 대해 아래에 쓰기)
참고 : 문자 메시지를 처리 할 때는 WXMessage에서 해당 메시지 내용의 빌더를 사용하여이를 생성하는 것이 좋습니다!
이 프레임 워크는 WXMediAManager에게 자료를 관리 할 수있는 것을 제공하고 내장 데이터베이스를 사용하여 자료와 로컬 파일 간의 서신을 저장합니다. 현재이 기능 의이 부분을 완료했지만 항상 큰 문제가 있다고 생각합니다. 누군가가 내가 그것을보고 나에게 제안을하도록 도울 수 있기를 바랍니다.
위의 메시지 전송의 미디어는 실제로 자료 관리자를 통해 구현됩니다.
0.2.0.alpha 버전은 인터페이스 WXMediastore를 사용하여 미디어 저장소를 관리하여 스토리지를 최적화하여 개발자는이 인터페이스를 직접 구현하고 기본 MAPDBWXMEDIASTORE를 교체하기 위해 Spring 's Bean으로 등록 할 수 있습니다. 각 인터페이스를 구체적으로 사용하려면 MAPDBWXMEDIASTORE를 참조하십시오. MAPDB를 대체하기 위해 메모리 기반 구현도 제공 할 수 있습니다.
이 프레임 워크는 wxtokenstore 인터페이스를 제공하여 토큰을 저장하고 MemoryWxtokenStore의 기본 메모리 기반 구현을 제공합니다. 배포 해야하는 경우이 인터페이스를 직접 구현하고 구현 클래스를 Spring으로 콩으로 주입 할 수 있습니다.
WXAPIINVOKESPI 인터페이스와 WXINVOKERPROXYFACTORY FACTORY 클래스를 사용하여 WECHAT 인터페이스 호출 프록시를 자동으로 생성하십시오. 방법과 주석만 선언하면됩니다. 기본적으로 HTTPComponent 통화 인터페이스가 사용됩니다. 관심있는 친구는 소스 코드를 확인할 수 있습니다. 글을 잘 쓰지 않으므로 더 나은 제안이 있으면 자유롭게 제시하십시오.
동시에, 반환 값에 대한 예비 분석이 수행된다. 인터페이스의 반환 된 내용의 오류 코드가 0이 아닌 경우 예외로 던져집니다. 예외 시스템은 WXException 및 하위 클래스입니다.
추신 :이 방법을 사용하여 자신의 프록시 호출 인터페이스를 마음대로 생성 할 수 있습니다. 앞으로 문서를 추가하겠습니다. 그래서 나는 당분간 게으르다. . .
스위치를 켜고 끄고 @wxbutton 주석을 통해 메뉴 구조를 생성 한 다음 인터페이스를 자동으로 호출하여 메뉴가 변경되는지 확인하고 자동으로 메뉴를 생성 및 업데이트 할 수 있습니다.
WeChat이 보낸 토큰 검증에 올바르게 응답 할 수 있으며 편리하고 빠릅니다.
이 프레임 워크를 사용하면 SpringMVC의 자체 기본 매핑에 영향을 미치지 않으며 고유 한 매핑 관계 (인증 요청 제외)를 차지하지 않습니다. 이 프레임 워크의 경우 루트 디렉토리 요청을 포함한 SpringMVC 기본 기능을 사용할 수 있으며 WeChat 서버만으로 점유하지 않습니다.
별도의 주소를 WeChat API 호출 주소로 사용하려면 WX.Path를 경로 정보로 구성하십시오.이 정보는 WeChat 공식 계정 백엔드 관리의 인터페이스 구성 정보의 URL 경로와 일치해야합니다.
WX.Callback-Domain을 구성하여 WX.MVC.INGERCEPTOR.INCLUDEPATTORNS 및 WX.MVC.INterceptor.excludePatterns를 구성하여 wx.mvc.interceptor.includepattor.excludepatterns를 구성하여 Wechat Oauth2 인증 절편을 제공하고 wx.mvc.interceptor.includepatterns를 구성합니다. Wxoauth2callback 인터페이스 구현 클래스를 Bean으로 제공 할 수 있으며,이 콩은 WXOAUTH2Interceptor에 자동으로 주입되며 (WXOAUTH2CONTEXT가 통과 한 후에 wxoauth2Context를 호출합니다. 이 방법에서 컨텍스트 WXWebUser를 얻고 WXWEBUSER를 WXUSERManager를 통해 WXUSER로 변환 할 수 있습니다. 자세한 관계 정보는 다음을 참조하십시오. WeChat 웹 권한.
버전 0.3.6이므로 대체 속성 WX.CALLBACK-ORL의 WX.CALLBACK-DOMAIN이 제공되며 콜백 도메인 이름 및 프로토콜 유형을 포함하여 콜백의 URL을 설정하는 데 사용됩니다. wx.callback-domain보다 더 많은 프로토콜 유형이 있습니다.이 구성을 사용하여 콜백 도메인 구성을 대체하십시오.
추가 기능 1 : 유형보기 WXBUTTON은 URL이 승인 된 콜백 도메인 이름의 주소에 속하는지 자동으로 결정하고 필요에 따라 OAUTH2를 포함하는 URL로 자동 처리합니다. 기본 인터셉터를 사용하여 메뉴 URL에서 클릭 사용자 정보를 얻는 기능을 실현할 수 있습니다. 동시에 WX.Callback-URL 기능과 결합하여 도메인 이름을 전달하지 않고 메뉴의 상대 경로 구성을 지원합니다.
추가 기능 2 : 메시지의 URL이 Oauth 리디렉션을 추가 해야하는지 자동으로 결정하십시오. Wxredirectutils를 참조하십시오.
코드에서 wxjsticketmanager를 사용하여 wxjsticket을 얻을 수 있습니다.
@Autowired
WxJsTicketManager wxJsTicketManager;
자세한 용도로 방법을 참조하십시오
wx.encrypt = true, wx.encodingaeskey = aeskey 공식 계정의 백그라운드에서 설정, 즉 메시지 암호화 및 암호 해독 모드를 구성하십시오.
메시지 암호화 및 암호 해독을 켜면 JCE 무제한 권한을 켜야합니다.
JDK7 다운로드 주소 : http://www.oracle.com/technetwork/java/javase/downloads/jce-7download-432124.html
JDK8 다운로드 주소 : http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
다운로드 후 Local_policy.jar, us_export_policy.jar 및 readme.txt를 볼 수 있습니다. JRE가 설치된 경우 두 개의 JAR 파일을 %jre_home % lib Security 디렉토리에 배치하여 원본 파일을 덮어 씁니다. JDK가 설치된 경우 두 개의 JAR 파일을 %jdk_home % jre lib 보안 디렉토리에 배치하여 원본 파일을 덮어 씁니다.
나중에 지원을 추가하고 주석을 사용하여 @RabbitListener와 유사한 메시지 고객 서비스를 정의 할 수 있습니다.
조금 귀찮은 사용자 분류
사용자 그룹화 등의 좋은 구현이 있습니까? 아직 요구가 없습니다
지불 등 등
초기 버전
메시지 매개 변수 바인딩 최적화, 지정된 메시지 바디 바인딩 추가, WxRequestBody 참조
Maven Central 저장소 업로드, Javadoc 생성 및 일련의 정규화
Apache Copyright, All Delombok에 가입하십시오
마지막으로 저작권에 가입했을 때 실수로 모든 파일의 헤더 댓글을 삭제했습니다. 나는 이제 그들 중 일부를 채웠다. 결국 WeChat 카드 쿠폰 기능을 추가하고 릴리스 버전을 해제하겠습니다.