Wechattty プロジェクトは、WeChat パブリック アカウント (サービス アカウントおよびサブスクリプション アカウントを含む) および WeChat エンタープライズ アカウント用の JAVA ベースの開発フレームワークであり、適切にカプセル化された API により、開発者はビジネス ロジックの開発に集中でき、開発効率が向上します。
ここでは依存関係を導入するために Maven が使用されています。
<dependency>
<groupId>space.chensheng.wechatty</groupId>
<artifactId>wechatty-mp</artifactId>
<version>2.0.0</version>
</dependency>
MpAppContext
、パブリック アカウント API の統合呼び出し入口であり、 WechatMpBootstrap
使用して初期化されます。
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
MpAppContext mpAppContext = bootstrap.build();
プロジェクトが Spring を使用して管理されている場合は、後の参照のためにMpAppContext
初期化するためにFactoryBean
実装できます。
@Component
public class MpAppContextFactoryBean implements FactoryBean<MpAppContext> {
@Override
public MpAppContext getObject() throws Exception {
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
return bootstrap.build();
}
@Override
public Class<?> getObjectType() {
return MpAppContext.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
設定方法は 2 つあり、1 つは配置文件
、もう 1 つはJAVA代码配置
です。 JAVA代码配置
の優先順位は配置文件
優先順位よりも高くなります。
新しい構成ファイル wechat-mp.properties を作成し、そのファイルをプロジェクトのクラスパスに配置します。たとえば、Maven プロジェクトでは、このファイルはsrc/main/resources
ディレクトリに配置できます。一般的な構成は次のとおりです。
token=thisIsToken
aesKey=thisIsAesKey
appId=thisIsYourAppId
appSecret=thisIsAppSecret
MpAppConetxt
が初期化されたら、構成のためにWechatMpBootstrap
のcustomizeWechatContext
メソッドを呼び出します。
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.customizeWechatContext(new MpWechatContextCustomizer() {
@Override
public void customize(MpWechatContext wechatContext) {
wechatContext.setToken("thisIsToken");
wechatContext.setAesKey("thisIsAeskey");
wechatContext.setAppId("thisIsAppId");
wechatContext.setAppSecret("thisIsAppSecret");
}
});
必須パラメータ | 説明する |
---|---|
トークン | 公式アカウントのトークンは、公式アカウントの背景で確認できます。 |
aesキー | 暗号化に使用されたキーは、公式アカウントのバックエンドで確認できます。 |
アプリID | 公式アカウントのappIdは、公式アカウントのバックグラウンドで確認できます。 |
アプリの秘密 | 公式アカウントのappSecretは、公式アカウントのバックグラウンドで確認できます。 |
オプションのパラメータ | 説明する |
---|---|
暗号化モードを有効にする | コールバック暗号化モードを有効にするかどうか。デフォルトは true。これがオンになっている場合は、JCE 無制限アクセス許可ポリシー ファイルをダウンロードして、jdk 内の関連ファイルをカバーする必要があります。詳細については、WeChat の一般的なエラーの例を参照してください。 |
autoUpdateAccessToken | access_token 関連のエラーが発生したときに、access_token を自動的に更新するかどうか。デフォルトは false です。後で詳しく説明します。 |
accessTokenStrategyClass | access_token アクセス戦略 (デフォルトは space.chensheng.wechatty.common.http.MemoryAccessTokenStrategy) は、access_token をメモリに保存します。アプリケーションは、データベースに保存するなど、独自のアクセス戦略を実装できます。これについては、後で説明します。詳細は後ほど。 |
ペイキー | WeChat 支払いキー |
payCertファイル | WeChat支払い証明書ファイルのパス |
支払い証明書パスワード | WeChat支払い証明書のパスワード |
支払いMchId | WeChat 決済の販売者 ID |
PayClientIp | 支払いのためにマシンの IP に電話します |
プーリングHttpProxyEnable | プロキシ サーバー経由で WeChat サーバーをリクエストするかどうか。デフォルトは false です。 |
プーリングHTTPプロキシホスト名 | プロキシ サーバーのホスト名 (www.chensheng.space など) |
プーリングHTTPプロキシポート | プロキシサーバーポート |
プーリングHttpProxyユーザー名 | プロキシサーバーのユーザー名 |
プーリングHTTPプロキシパスワード | プロキシサーバーのパスワード |
プーリングHttpMaxPerRoute | http 接続プール内のリンクあたりの同時接続の最大数。デフォルトは 50 です。 |
プーリングHttpMaxTotal | http 接続プール内の最大同時接続数、デフォルトは 200 |
プーリングHttpSocketTimeoutミリス | ソケットタイムアウトのミリ秒数、デフォルトは 10000 |
プーリングHttpConnectTimeoutミリス | WeChat サーバーへの接続タイムアウトのミリ秒数、デフォルトは 10000 |
プーリングHttpConnectionRequestTimeoutミリス | http 接続プールから接続タイムアウト ミリ秒を取得します (デフォルトは 10000) |
プーリングHttpTcpNoDelay | tpcNoDelay を有効にするかどうか、デフォルトは true |
mpAppContext.getAccessTokenFetcher().updateAccessToken()
定期的に (通常は 1.5 時間に 1 回) 実行します。これは、access_token の有効期限が 2 時間であるためです。accessTokenStrategyClass=your.package.name.YourAccessTokenStrategy
を追加します。以下は、accesss_token データベースにアクセスするための戦略です。 import space . chensheng . wechatty . common . http . AccessTokenStrategy ;
//因为这个策略类的实例化不是通过Spring来管理的,所以在这个类中不能使用Autowired来注入bean,
//要通过ApplicationContext#getBean方法来获取。
public class DatabaseAccessTokenStrategy implements AccessTokenStrategy {
//将access_token存到数据库中去
@ Override
public void doSave ( String accessToken ) {
TokenService tokenService = ApplicationContextUtil
. getApplicationContext (). getBean ( TokenService . class );
tokenService . doSave ( accessToken );
}
//从数据库中取出access_token
@ Override
public String doQuery () {
TokenService tokenService = ApplicationContextUtil
. getApplicationContext (). getBean ( TokenService . class );
return tokenService . doQuery ();
}
}
MpAppContext
が初期化されたら、メッセージを受信するためにWechatMpBootstrap
を通じてメッセージ リスナーを追加します (メッセージ リスナーは後で紹介します)。
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
bootstrap.addMsgListener(new SubscribeEventListener());
bootstrap.addMsgListener(new UnsubscribeEventListener());
WeChat 公式アカウントのバックグラウンドでコールバック URL を設定した場合、WeChat サーバーは検証のためにこの URL に GET リクエストを送信します。開発者はこのリクエストを Web アプリケーションで処理する必要があります。以下は SpringMVC の検証例です。
@RestController
@RequestMapping(value = "/wechat-mp")
public class CallbackController extends BaseController{
@Autowired
private MpAppContext mpAppContext;
//验证请求,并回复字符串
@RequestMapping(value = "/callback", method = RequestMethod.GET)
public String verify(String msg_signature, String timestamp, String nonce, String echostr) {
String reply = mpAppContext.getCallbackModeVerifier().verify(msg_signature, timestamp, nonce, echostr);
return reply;
}
}
コールバック リクエストを確認した後、コールバック モードが実際に有効になります。ユーザーが公式アカウントにメッセージを送信すると、WeChat サーバーはコールバック URL に POST リクエストを送信し、開発者はこのリクエストを Web アプリケーションで処理する必要があります。以下は SpringMVC の例です。 (およびコントローラーでコールバックを有効にする以前の検証例):
@RestController
@RequestMapping(value = "/wechat-mp")
public class CallbackController extends BaseController{
@Autowired
private MpAppContext mpAppContext;
//接收回调消息,并回复相应xml消息
@RequestMapping(value = "/callback", method = RequestMethod.POST)
public String verify(String msg_signature, String timestamp, String nonce) {
//postBody是请求体内容,String格式,开发者可以通过HttpServletRequest来解析
String replyXml = mpAppContext.getMpMessageDispatcher().dispatch(msg_signature(), timestamp, nonce, postBody);
return replyXml;
}
}
開発者は、 space.chensheng.wechatty.common.message.MessageListener
を継承することで、特定の種類のメッセージをリッスンできます。ユーザーが送信したテキスト メッセージを聞く例を次に示します。
public class TextMessageListener extends MessageListener<TextInboundMessage> {
@Override
protected ReplyMessage onMessage(TextInboundMessage message) {
String content = message.getContent();
//根据消息内容来回复用户
if ("1".equals(content)) {
TextReplyMessage replyMsg = new TextReplyMessage();
replyMsg.setContent("this is reply message content");
replyMsg.setFromUserName(message.getToUserName());
replyMsg.setToUserName(message.getFromUserName());
replyMsg.setCreateTime(System.currentTimeMillis());
return replyMsg;
}
//返回null表示不回复用户
return null;
}
}
情報 | 説明する |
---|---|
テキスト受信メッセージ | テキストメッセージ |
画像受信メッセージ | 絵メッセージ |
リンクインバウンドメッセージ | グラフィックメッセージへジャンプ |
位置受信メッセージ | 位置情報を共有する |
ショートビデオインバウンドメッセージ | 小さなビデオメッセージ |
ビデオインバウンドメッセージ | ビデオメッセージ |
音声インバウンドメッセージ | 音声メッセージ |
クリックイベントメッセージ | 通常メニューのメッセージをクリックします |
イベントメッセージの表示 | クリックするとリンクメニューメッセージにジャンプします |
場所イベントメッセージ | ロケーションイベントメッセージ |
購読イベントメッセージ | ユーザーは公開アカウントのニュースをフォローします |
購読解除イベントメッセージ | 公開アカウントのメッセージのフォローを忘れずに解除してください |
スキャンイベントメッセージ | ユーザーが QR コード メッセージをスキャンする |
MassSendJobFinishEventMessage | グループメッセージ送信完了報告 |
情報 | 説明する |
---|---|
テキスト返信メッセージ | テキスト返信 |
画像返信メッセージ | 画像返信 |
音楽返信メッセージ | 音楽の返信 |
ニュース返信メッセージ | グラフィック返信 |
ビデオ返信メッセージ | ビデオ返信 |
音声応答メッセージ | 音声応答 |
公式アカウントは、グループ メッセージやカスタマー サービス メッセージなどのメッセージをユーザーに積極的に送信できます。すべてのメッセージは、 space.chensheng.wechatty.mp.message.MpMessageSender
を使用して均一に送信されます。
TextMassMessage message = new TextMassMessage();
message.setIsToAll(true);
message.setContent("群发消息测试");
mpAppContext.getMpMessageSender().send(message, 3);
グループメッセージの種類 | 説明する |
---|---|
テキスト大量メッセージ | バルクテキスト |
画像大量メッセージ | 画像グループ送信 |
MPニュースマスメッセージ | WeChat内での写真やテキストのグループ送信 |
MpvideoMassMessage | ビデオグループ送信 |
ボイスマスメッセージ | 音声グループ送信 |
WxcardMassMessage | WeChatカードとクーポンの大量配布 |
TextCsMessage message = new TextCsMessage();
message.setToUser("thisIsUserOpenId");
message.setContent("客服消息测试 n 212");
mpAppContext.getMpMessageSender().send(message, 3);
カスタマーサービスのメッセージタイプ | 説明する |
---|---|
TextCsMessage | テキストカスタマーサービス |
画像Csメッセージ | 画像のカスタマーサービス |
MPニュースCsメッセージ | WeChat内でのグラフィックカスタマーサービス |
ニュースCsメッセージ | 外部グラフィックカスタマーサービス |
ビデオCSメッセージ | ビデオカスタマーサービス |
VoiceCsメッセージ | 音声カスタマーサービス |
WxcardCsメッセージ | WeChat カードおよびバウチャーのカスタマー サービス |
マテリアル管理には主に、マテリアルのアップロード、クエリ、変更、削除が含まれます。マテリアルの種類には、写真、ビデオ、音声、グラフィックが含まれます。
素材のアップロードは、対応する素材アップロードクラスを操作することで完了します。 画像をアップロードする例は次のとおりです。
File image = new File("/this/is/image/path.jpg");
ImagePermanentMedia material = new ImagePermanentMedia(mpAppContext, image);
UploadResponse resp = material.upload();
素材アップロードクラス | 説明する |
---|---|
画像永久メディア | 永久写真 |
親指永久メディア | 永久サムネイル |
ビデオ永久メディア | 永久ビデオ |
音声永久メディア | 永久音声 |
常設ニュース | 永続的な写真とテキスト |
常設ニュース画像 | 永久グラフィックスの写真 |
画像一時メディア | 一時的な画像 |
親指一時的なメディア | 一時的なサムネイル |
ビデオ一時メディア | 一時的なビデオ |
音声一時メディア | 一時的な音声 |
マテリアル クエリ操作は、ツール クラスspace.chensheng.wechatty.mp.material.MaterialQuery
およびspace.chensheng.wechatty.mp.material.MaterialFinder
を通じて完了します。
mpAppContext.getMaterialQuery().count()
mpAppContext.getMaterialQuery().listNews(int offset, int count)
mpAppContext.getMaterialQuery().listMedia(MediaType mediaType, int offset, int count)
mpAppContext.getMaterialFinder().findNews(String mediaId)
mpAppContext.getMaterialFinder().findPermanentVideo(String mediaId)
mpAppContext.getMaterialFinder().findTemporaryVideo(String mediaId)
mpAppContext.getMaterialFinder().downloadPermanentMedia(String mediaId, String saveDir, String fileName)
mpAppContext.getMaterialFinder().downloadTemporaryMedia(String mediaId, String saveDir, String fileName)
マテリアルの削除操作は、ツール クラスspace.chensheng.wechatty.mp.material.MaterialDeleter
を通じて完了します。
mpAppContext.getMaterialDeleter().delete(String mediaId)
パラメーターを使用した QR コードの生成は、ツール クラスspace.chensheng.wechatty.mp.account.QRCodeCreator
を通じて完了します。
mpAppContext.getQRCodeCreator().createTemporary(int expireSeconds, int sceneId)
mpAppContext.getQRCodeCreator().createPermanent(int sceneId)
mpAppContext.getQRCodeCreator().createPermanent(String sceneStr)
ユーザー情報のクエリは、 UserInfoQuery
を通じて実装されます。
mpAppConext.getUserInfoQuery().get(String openId)
mpAppContext.getUserInfoQuery().batchGet(List<String> openIds)
ユーザー認証はAuthHelper
を通じて実装されます。
mpAppContext.getAuthHelper().fetchAuthAccessToken(String code)
を通じてauth access token
を取得します。auth access token
の更新: mpAppContext.getAuthHelper().refreshAuthAccessToken(String refreshAccessToken)
auth access token
を通じてユーザー情報を取得します: mpAppContext.getAuthHelper().fetchAuthUserInfo(String authAccessToken, String openId)
以下はユーザー認証の疑似コードです。
public WxAuthLoginDto authAndLogin(String code) {
AuthAccessTokenResponse authResp = mpAppContext.getAuthHelper().fetchAuthAccessToken(code);
if (authResp == null || !authResp.isOk()) {
//授权失败,执行相应业务逻辑
return new WxAuthLoginDto("fail");
}
String openId = authResp.getOpenId();
AuthUserInfoResponse wxUserInfo = mpAppContext.getAuthHelper().fetchAuthUserInfo(authResp.getAccessToken(), authResp.getOpenId())
//根据微信用户信息在数据库里查找系统对应的用户,或新建一个用户
//进行登录相关业务逻辑处理
return new WxAuthLoginDto("success");
}
jsapi 認可はJsapiHelper
を通じて実装されます。
jsapi ticket
を取得します (スケジュールされたタスクを使用してチケットを定期的に取得し、データベースに保存できます): mpAppContext.getJsapiHelper().fetchTicket()
mpAppContext.getJsapiHelper().generateSignature(String jsapiTicket, String nonceStr, long timestamp, String url)
MpAppContext
初期化するときに、 WechatMpBootstrap
のenablePayCert()
メソッドを呼び出して WeChat 支払いを有効にし、関連パラメーターを構成します。 (特定のパラメータについては構成モジュールを参照してください)
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.enablePayCert();
mpAppContext.getPayHelper().sendRedPack(RedPackRequest request)
mpAppContext.getPayHelper().sendGroupRedPack(GroupRedPackRequest request)
mpAppContext.getPayHelper().transfers(TransfersRequest request)
mpAppContext.getPayHelper().unifiedOrder(UnifiedOrderRequest request)
mpAppContext.getPayHelper().parsePayNotify(String notifyContent)
mpAppContext.getPayHelper().validatePayNotify(PayNotifyResponse response)
mpAppContext.getPayHelper().orderQuery(OrderQueryRequest request)
mpAppContext.getPayHelper().closeOrder(CloseOrderRequest request)
mpAppContext.getPayHelper().shortUrl(String longUrl)
mpAppContext.getPayHelper().generateJsapiPayParams(String prepayId, PaySignType signType)
mpAppContext.getPayHelper().refund(RefundRequest request)
mpAppContext.getPayHelper().parseRefundNotify(String notifyContent)