WeChat ユーザーがメニューをクリックすると、WeChat サーバーを通じて 2 つのイベントがサーバーに転送されます。1 つはメッセージがプルされたときのイベント プッシュで、もう 1 つはリンクがジャンプされたときのイベント プッシュです。
1 つ目については前の記事で説明し、2 つ目についてはこの記事で説明します。
1. メッセージフォーマット
プッシュ XML データ パッケージの例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[VIEW]]></Event>
<EventKey><![CDATA[www.qq.com]]></EventKey>
</xml>
2. 動作デモ
3. コードの実装
WeChat サーバーから送信されたイベントを受信すると、指定されたインターフェイス Web ページ AccessWx.aspx はまずイベントの種類を判断し、それを指定されたイベント処理クラスに渡して処理と応答を行います。この記事シリーズの最初の部分で紹介した AccessWx.aspx.cs の冒頭で、QinMing.Weixin.EventHandlerMenuView を使用して名前空間を導入します。
また、ビューの処理の次のセクションを改善し、この記事で説明されているクリック メニュー ジャンプ URL イベント処理リンクを追加します。
else if(Event == "VIEW")
{
//对用户点击菜单触发的VIEW事件处理,使用QinMing.Weixin.EventHandlerMenuView命名空间下的MenuViewEventDeal类
MenuViewEventDeal med = new MenuViewEventDeal();
Response.Write(med.DealResult(weixinXML));
}
WeChat サーバーから送信されたメニュー クリック イベントを処理するために、名前空間 QinMing.Weixin.EventHandlerMenuView の下に新しいクラス MenuViewEventDeal を作成します。クラスのソース コード ファイルは App_Code ディレクトリに配置する必要があることに注意してください。以下は、クリック メニュー イベント処理のソース コードです。
QinMingWeixinEventHandlerMenuView.cs ファイルの内容は次のとおりです。
using System;
using System.Web;
using System.Xml;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using QinMing.Config;
using QinMing.Tools;
using QinMing.Weixin.ReturnContent;
namespace QinMing.Weixin.EventHandlerMenuView
{
//事件消息处理:点击菜单view
public class MenuViewEventDeal :System.Web.UI.Page
{
public string DealResult(string weixinXML)
{
string content = DealMenuView(weixinXML);
return content;
}
public string DealMenuView(string weixinXML)
{
string strresponse = "";
XmlDocument doc = new XmlDocument();
doc.LoadXml(weixinXML);
XmlNodeList list = doc.GetElementsByTagName("xml");
XmlNode xn = list[0];
string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText; //关注用户的加密后openid
string ToUserName = xn.SelectSingleNode("//ToUserName").InnerText; //公众微信号原始ID
string MsgType=xn.SelectSingleNode("//MsgType").InnerText;
string Event=xn.SelectSingleNode("//Event").InnerText;
string EventKey=xn.SelectSingleNode("//EventKey").InnerText;
//保存点击菜单view事件
SaveEvent(FromUserName, ToUserName, EventKey);
//给管理员发送粉丝点击菜单通知
QinMing.WeixinTemplateMessage.SendTemplateMessage.SendRemindMsg("管理员openid", "粉丝点击菜单信息提醒" + FromUserName, "http://www.yourweb.com/DisplayOneUser.aspx?open_id=" + FromUserName);
return strresponse;
}
//保存事件信息
public void SaveEvent(string FromUserName, string ToUserName,string EventKey)
{
SqlConnection conn = new SqlConnection(QinMingConfig.DatabaseConnStr);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into weixin_recv_event (msg_type,event_type,open_id,gh_id,recv_time,event_key) "
+ "values ('event','VIEW','" + FromUserName + "','" + ToUserName + "',getdate(),'" + EventKey + "') ";
//QinMingTools.WriteLog("sql语句:", cmd.CommandText);
cmd.ExecuteScalar();
if (conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
}
}