この記事では、WeChat パブリック アカウント開発におけるメッセージとイベントの処理方法について説明します。(1) メッセージ (イベント) の概要、(3) メッセージの解析、(4) メッセージへの受動的返信。 ; (5) ) 他のメッセージを送信します。
1 メッセージ (イベント) 概要
一般の WeChat ユーザーが公式アカウントにメッセージを送信するか、WeChat サーバーが公式アカウントにイベントをプッシュすると、WeChat サーバーはメッセージ (イベント) の XML データ パケットを開発者によって入力された公式アカウント サーバーの URL がメッセージに応答します。
1.1 メッセージ フロー プロセス
区別しやすくするために、WeChat サーバーから公式アカウント サーバーに送信されるメッセージをリクエスト メッセージと呼び、公式アカウント サーバーから WeChat サーバーに送信されるメッセージをプッシュ イベントと呼びます。特別なリクエストメッセージとして扱われます。
リクエストメッセージとレスポンスメッセージの流れを以下の図に示します。
1.2 リクエストメッセージ
リクエストメッセージには多くの種類があり、それぞれに対応するクラスを設けています。以下の図に示されています:
一部のリクエストメッセージには応答できますが、一部のリクエストメッセージには応答できません。詳細については、以下の表を参照してください:
メッセージタイプ |
イベント |
が受動的に応答できるかどうか |
備考 |
テキスト |
× |
√ |
|
写真 |
× |
√ |
|
音声 |
× | √ |
|
ビデオ | × |
不明 |
ビデオメッセージを受信できません、わかりません 受動的に返信することは可能ですか |
地理的位置 |
× |
√ |
|
リンク |
× |
√ |
|
購読 |
√ |
√ |
|
購読解除 |
√ |
|
|
メニューをクリックしてメッセージをプルします
√ |
√ | |
|
メニューをクリックするとジャンプしますリンク
√ |
× |
|
| メニューをクリックしてQRコードをスキャンし、返信を待ちます
√ | √ |
|
| メニューシステムをクリックして写真を送信してください
√ | 不明 | システム写真送信イベントを受信できません。WeChatサーバーが写真メッセージを送信します。返信できます |
| メニューをクリックして写真を撮るか、WeChatサーバーが写真メッセージをフォトアルバムに送信します
√ | × | 、返信できます |
| メニューをクリックしてWeChatに写真を送信します
√ | × | WeChatサーバーが写真メッセージを送信し、返信できます |
| メニューをクリックして選択します地理的位置
√ | × | WeChatサーバーが地理的位置メッセージを送信し、返信できます |
| グループメッセージの結果をプッシュ
√ | × |
|
| テンプレートメッセージの結果をプッシュ
√ | × |
|
|
1.3 応答メッセージ
応答メッセージのクラス階層は以下のとおりです:
2 メッセージの信頼性を検証します
公式アカウントサーバーがWeChatサーバーからリクエストを受信した後、最初に行うことはメッセージの信頼性を検証します。
Utility.CheckSignature メソッドは、メッセージの署名が正しいかどうかを確認するために使用されます。
例は次のとおりです:
/// <summary>
/// 验证消息的有效性
/// </summary>
/// <param name="context"></param>
/// <returns>如果消息有效,返回true;否则返回false。</returns>
private bool Validate(HttpContext context)
{
string username = RequestEx.TryGetQueryString("username"); //在接口配置的URL中加入了username参数,表示哪个微信公众号
AccountInfo account = AccountInfoCollection.GetAccountInfo(username);
if (account == null)
return false;
string token = account.Token;
string signature = RequestEx.TryGetQueryString("signature");
string timestamp = RequestEx.TryGetQueryString("timestamp");
string nonce = RequestEx.TryGetQueryString("nonce");
if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce))
return false;
return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce);
}
验证消息真实性
ログイン後にコピー
メッセージの信頼性を検証します
3 メッセージを解析します
メッセージの署名が検証に合格した場合、XML 形式のメッセージ テキストを解析してリクエスト メッセージ オブジェクトにする必要がありますこの作業を完了するには、RequestMessageHelper クラスが使用されます。
RequestMessageHelper helper = new RequestMessageHelper(context.Request);
if(helper.Message != null)
{
//消息解析成功,对它进行处理
}
ログイン後にコピー
メッセージが正常に解析された後、helper.Message はメッセージ基本クラスの RequestBaseMessage であり、MsgType 属性と Event 属性に基づいてメッセージ (イベント) の種類を判断し、それを に変換できます。適切なサブタイプ。例:
RequestBaseMessage bm=helper.Message;
switch(bm.MsgType)
{
case RequestMessageTypeEnum.text: //文本消息
HandleTextMessage((RequestTextMessage)bm);
break;
case RequestMessageTypeEnum.image: //图片消息
HandleImageMessage((RequestImageMessage)bm);
break;
//处理其他消息
case RequestMessageTypeEnum.event: //事件
RequestEventMessage ev=(RequestEventMessage)bm;
switch(ev.Event)
{
case RequestEventTypeEnum.subscribe: //订阅
HandleSubscribeMessage((RequestSubscribeMessage)ev);
break;
case RequestEventTypeEnum.unsubscribe: //取消订阅
HandleUnsubscribeMessage((RequestUnsubscribeMessage)ev);
break;
//处理其他事件
}
break;
default:
break;
}
ログイン後にコピー
メッセージの解析の詳細については、ソース コードを参照してください: http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/PublicAccount/RequestMessage/RequestMessageHelper .cs
4 メッセージへの受動的返信
WeChat サーバーからメッセージ (イベント) を受信した後、5 秒以内にメッセージに直接 (受動的に) 返信できます。最初に空の文字列に直接返信することもできます。その後、48 時間以内にカスタマー サービスのメッセージに返信してください。
まず ResponseXxxMessage を初期化し、次に ToXml メソッドを使用して応答メッセージの内容を取得します。
受動的な応答メッセージの例は次のとおりです:
/// <summary>
/// 处理微信的POST请求
/// </summary>
/// <param name="context"></param>
/// <returns>返回xml响应</returns>
private string HandlePost(HttpContext context)
{
RequestMessageHelper helper = new RequestMessageHelper(context.Request);
if (helper.Message != null)
{
ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message);
return responseMessage.ToXml(helper.EncryptType);
}
else
return string.Empty;
}
/// <summary>
/// 处理请求消息,返回响应消息
/// </summary>
/// <returns>返回响应消息</returns>
private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage)
{
ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName,
DateTime.Now, string.Format("自动回复,请求内容如下:\r\n{0}", requestMessage));
return response;
}
ログイン後にコピー
5 他のメッセージを送信します
受動的な応答メッセージに加えて、カスタマー サービス メッセージ、グループ メッセージを送信したり、テンプレート メッセージを送信したりすることもできます。後で説明します。記事内で 1 つずつ来てください。
以上が.net WeChat パブリック アカウント開発のニュースとイベントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。