このフレームワークを使用する前に、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>
新しい構成ファイルApplication.Propertiesまたはその他の構成ファイルタイプを作成します。リソースディレクトリの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で生成されたドメイン名を入力します。トークンは、構成ファイルでトークンを使用します。保存後、予期しないことが起こらない場合は、正常に検証する必要があります。ご質問がある場合は、時間内にフィードバックを提供してください。


上記の例が開始されたら、公式アカウントに注意してください。この時点で、公式アカウントのメニューには2つのメインメニューがあり、左と右に、左側にはテキストメッセージとクリックリンクの2つのサブメニューがあります。
テキストメッセージメニューをクリックすると、テキストメッセージが表示されます。テストテキストメッセージです。
[2番目のクリック]リンクをクリックすると、Baiduにジャンプして、テストグラフィックメッセージのタイトルが付いたグラフィックメッセージが表示されます。
テキストメッセージを公式アカウントに送信すると、メッセージコンテンツが1で開始されない場合、公式アカウントへの返信が表示されます。「メッセージコンテンツが受信されます」 +コンテンツが送信されます。
公式アカウントにテキストメッセージを送信します。メッセージコンテンツが1で始まると、グラフィックメッセージとテキストメッセージへの返信が表示されます。
ユーザーが公式アカウントに登録解除すると、ユーザーのニックネームがSystem.out +「公式アカウントに登録されていない」で印刷されます。
Annotation @WXApplicationは、アプリケーションをWECHATアプリケーションとして宣言し、SpringApplicationの使用を開始するために使用されます。既にスプリングブート環境がある場合は、@SpringApplicationクラスにAnnotation @EnableWXMVCを追加してください。効果は同じです。ソースコードを見ることができます。
Annotation @WXControllerは、クラスがWeChatコントローラーであることを宣言するために使用されます。この注釈が宣言された場合にのみ、WeChatサーバーの要求マップにバインドされます。そうしないと、クラスは無視されます。
annotation @wxbutton(group = wxbutton.group.left、main = true、name = "left")は、ボタンボックスを宣言するために使用されます。グループは、WeChatの3つの第1レベルのメニューに対応する左、中央、右側に3つのグループがあるグループを表します。メインはブール値です。これは、メニュー項目が最初のレベルのメニューであるかどうかを意味します。名前はメニュー名です。
annotation @wxbutton(type = wxbutton.type.click、group = wxbutton.group.left、order = wxbutton.order.first、name = "text message")は、左グループのサブメニューを宣言するために使用されます。順序は順序を表し、ここに最初のものがあります。
public string leftfirst(wxrequest wxrequest、wxuser wxuser){"return" test text message "; }ここには3つのポイントがあります。
@wxbutton(type = wxbutton.type.view、group = wxbutton.group.left、order = wxbutton.order.second、url = "http://baidu.com"、name = "クリック")この注釈は上と同じです。特定のコンテンツについては、列挙注釈または公式アカウント文書を参照できます。各メニュータイプには独自の制限があることに注意してください。ドキュメントを参照してください。条件が満たされていない場合、スタートアップが開始されると例外が発生します。
Annotation @WXasyncMessageは、メッセージが非同期に返信され、カスタマーサービスメッセージを参照していることを示しており、現時点では複数のカスタマーサービスのサポートは提供されていません。
wxmessage.news.builder()。 WXMessageクラスでは、異なる静的な内部クラスとそのビルダーがあります。ビルダーを通じて、さまざまな種類のWeChatメッセージを簡単に構築できます。受動的な返信メッセージとカスタマーサービスメッセージを参照してください。
annotation @wxeventMapping(type = wxevent.type.unsubscribe)unsubscribeイベントにバインドします。ユーザーが解除すると、この注釈の下のロジックが入力されます。注意すべきもう1つの点は、WXEventMappingのすべての返信コンテンツが非同期にユーザーに送信されることです。
annotation @wxmessagemapping(type = wxmessage.type.text)とは、ユーザーから送信されたテキストメッセージを次のメソッドロジックにバインドすることを意味します。 }。コンテンツは、ユーザーが送信したテキストコンテンツに自動的に割り当てられます。
annotation @wxmessagemapping(type = wxmessage.tepe.text、wildcard = "1*")は上記と同じです。違いは、ワイルドカードワイルドカードのキャラクターです。このワイルドカードキャラクターは、ワイルドカードコンテンツをサポートしています。ワイルドカードロジックをオーバーライドすると、以下の実行ロジックが入力されます。
Spring Bootと完全に統合されています。 Springbootプロジェクトがなく、このフレームワークを使用してパブリックアカウントを構築する場合は、@wxApplicationを使用してスタートアップクラスをマークすることができます。この注釈はパラメーターをサポートしています:menuautocreate、デフォルトは真です。これは、WeChatメニューが自動的に作成されていることを意味し、メニューを自動的に作成する動作をオフにするためにfalseに設定できます。既にSpring Boot Projectを持っていて、このフレームワークを紹介したい場合は、構成クラスでAnnotation @EnableWXMVCをマークするだけで、パラメーターは上記と同じです。
サポートされているマッピングには3つのタイプがあります。
注:あなたがバインドするクラスは@wxcontrollerとして宣言する必要があります
次の種類のパラメーターがサポートされています。
パラメーターバインディングは現在、これらのタイプをサポートしています。サポートする必要があるより良いソリューションがある場合は、意見や提案を直接提案することもできます。また、タイムリーに対処します。
返品値は次のタイプをサポートします。
上記の非同期メッセージは、以下で説明するwxmessageTemplateを使用して送信されます。
このフレームワークは、メッセージを送信するWXMessageTemplateを提供し、同時にテンプレートでのWXMessageProcessorサポートを提供します。これはメッセージを送信する前にメッセージを処理することです。
たとえば、メッセージを同期して返す場合、メッセージが送信されたときにTousnameフィールドであるFromUsernameフィールドを記述する必要があります。フレームワークユーザーにこのフィールドを処理できるようにする必要はありません。このフィールドは、WXCommonMessageProcessorプロセッサで処理されます。興味がある場合は、ソースコードを参照できます。
また、次の変換をサポートします。メディアタイプのメッセージの場合、MediaUrlまたはMediapathを使用してマテリアルパスを書き込むことができ、メッセージコンバーターはWXMediamanagerを介して素材を自動的に管理して必要な材料IDを取得できます。 (WXMediamanagerについて以下に書いてください)
注:テキストメッセージを処理する場合は、WXMessageで対応するメッセージコンテンツのビルダーを使用して生成することをお勧めします。
このフレームワークは、材料を管理するためのWXMediamanagerを提供し、埋め込まれたデータベースを使用して、材料とローカルファイルの間の対応を保存します。現在、この機能のこの部分を完了していますが、大きな問題があると常に感じています。誰かが私がそれを見るのを手伝ってくれて、私にいくつかの提案をすることを願っています。
上記のメッセージ送信のメディアは、実際にはマテリアルマネージャーを通じて実装されています。
0.2.0.alphaバージョンは、インターフェイスwxmediastoreを使用してメディアストレージを管理するためにストレージを最適化し、開発者はこのインターフェイスを自分で実装し、スプリングのBeanとして登録してデフォルトのmapdbwxmediastoreを置き換えることができます。各インターフェイスの特定の使用については、mapdbwxmediastoreを参照してください。 MAPDBを置き換えるために、メモリベースの実装もここに提供することができます。
このフレームワークは、トークンを保存するWXTOKENSTOREインターフェイスを提供し、MemoryWxtokenStoreのデフォルトのメモリベースの実装を提供します。配布する必要がある場合は、このインターフェイスを自分で実装し、実装クラスをBeanとしてSpringに挿入できます。
WXAPIINVOKESPIインターフェイスとWXINVOKERPROXYFACTORY FACTORYクラスを使用して、WECHATインターフェイスコールプロキシを自動的に生成します。メソッドと注釈を宣言するだけです。デフォルトでは、HTTPComponentコールインターフェイスが使用されます。興味のある友達はソースコードを確認できます。私はそれをうまく書いていないので、あなたがより良い提案があるならば、それらを自由に提案してください。
同時に、返品値の予備分析が実行されます。インターフェイスの返されたコンテンツのエラーコードが0ではない場合、例外としてスローされます。例外システムは、wxexceptionとそのサブクラスです。
PS:この方法を使用して、独自のプロキシ通話インターフェイスを自由に生成することもできます。将来ドキュメントを追加するので、当面は怠zyです。 。 。
スイッチをオンとオフにし、@WXButtonアノテーションを介してメニュー構造を生成し、インターフェイスを自動的に呼び出して、メニューが変更されるかどうかを判断し、メニューを自動的に生成して更新できます。
便利で高速なWeChatが送信したトークン検証に正しく応答できます。
このフレームワークを使用して、SpringMVC独自のネイティブマッピングに影響はありません。また、一意のマッピング関係(認証リクエストを除く)を占めることもありません。このフレームワークの場合、Root Directoryリクエストを含むSpringMVCネイティブ機能を使用でき、WeChatサーバーだけでは占有されません。
WECHAT APIコールアドレスとして個別のアドレスを使用する場合は、WX.PATHをパス情報として構成してください。
wx.callback-domainを設定して、wx.callback-domainを構成して、wechat oauth2認証インターセプトを提供し、oauth2承認コールバックページドメイン名を入力し、wx.intector.includepatternsとwx.mvc.interceptor.excludepatternsを構成して、断言のターゲットアドレスを構成します。 WXOAuth2Callbackインターフェイスの実装クラスをBeanとして提供できます。このBeanは、WXOAuth2インターセプターで自動的に注入され、後に(WXOAuth2Contextが渡された後にwxoauth2contextが渡されます)。この方法でコンテキストwxwebuserを取得し、wxwebuserをwxusermanagerを介してwxwebuserに変換できます。詳細な関係情報については、次を参照してください。WechatWebAuthorization。
バージョン0.3.6以降、WX.Callback-Domainの代替プロパティwx.Callback-urlが提供されます。これは、コールバックドメイン名とプロトコルタイプを含むコールバックのURLを設定するために使用されます。 WX.Callback-Domainよりも多くのプロトコルタイプがあります。この構成を使用して、Callback-Domain構成を置き換えてください。
追加関数1:wxbuttonのタイプを表示します。これは、URLが認定コールバックドメイン名の下のアドレスに属するかどうかを自動的に決定し、必要に応じてOAuth2を含むURLとして自動的に処理します。デフォルトのインターセプターを使用して、メニューURLでクリックユーザー情報を取得する機能を実現できます。同時に、wx.callback-url関数と組み合わせて、ドメイン名を運ぶことなくメニュー内の相対パスの構成をサポートします。
追加関数2:メッセージ内のURLがOAuth Redirectを追加する必要があるかどうかを自動的に判断します。WXredirectutilsを参照してください。
コードでは、wxjsticketmanagerを使用してwxjsticketを取得できます
@Autowired
WxJsTicketManager wxJsTicketManager;
詳細な使用方法を参照してください
wx.encrypt = true、wx.encodingaeskey = aeskey公式アカウントのバックグラウンドに設定します。つまり、メッセージの暗号化と復号化モードを有効にします
メッセージの暗号化と復号化をオンにすると、JCE Unlimited Permissionsをオンにする必要があることに注意してください。
JDK7ダウンロードアドレス:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-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がインストールされている場合は、2つのJARファイルを%JRE_HOME% lib securityディレクトリに配置して、元のファイルを上書きします。 JDKがインストールされている場合は、2つのJARファイルを%JDK_HOME% JRE lib securityディレクトリに配置して、元のファイルを上書きする必要があります。
後でサポートを追加し、アノテーションを使用して@rabbitlistenerに似たメッセージカスタマーサービスを定義できます
少し面倒な、ユーザー分類
ユーザーグループなどの適切な実装はありますか?まだ需要はありません
支払いなど
初期バージョン
メッセージパラメーターバインディングを最適化し、指定されたメッセージ本文バインディングを追加し、wxRequestbodyを参照してください
Maven Central Repositoryをアップロードし、Javadocと一連の正規化を生成します
Apache Copyright、すべてのDeLombokに参加してください
著作権に最後に参加したとき、すべてのファイルのヘッダーコメントを誤って削除しました。私は今それらのいくつかを埋めました。結局のところ、WeChatカードクーポン機能を追加してリリースバージョンをリリースします