一、取消关注事件
用户在取消关注公众号时,微信会把这个事件推送到开发者填写的URL,方便开发者做帐号的解绑等处理。
123456789
二、代码实现
本篇比较简单,所以直接上代码了。
在接收到微信服务器发来的事件之后,首先由指定的接口网页AccessWx.aspx对事件类型进行判别,然后交给指定的事件处理类处理和回应。在本系列文章第1篇介绍的AccessWx.aspx.cs中开始部分引入命名空间using QinMing.Weixin.EventHandlerUnSubscribe;
并完善下面处理unsubscribe这一段,增加本篇给出的关注事件处理环节。
else if(MsgType == "event")
{
string Event = xn.SelectSingleNode("//Event").InnerText;
if(Event == "subscribe")
{
//对用户关注公众号的事件处理,使用QinMing.Weixin.EventHandlerSubscribe命名空间下的SubscribeEventDeal类
SubscribeEventDeal ued = new SubscribeEventDeal();
Response.Write(ued.DealResult(weixinXML));
}
else if(Event == "unsubscribe")
{
//对用户取消关注公众号的事件处理,使用QinMing.Weixin.EventHandlerUnSubscribe命名空间下的UnSubscribeEventDeal类
UnSubscribeEventDeal ued = new UnSubscribeEventDeal();
Response.Write(ued.DealResult(weixinXML));
}
//其它处理
}
在命名空间QinMing.Weixin.EventHandlerUnSubscribe下新建一个类UnSubscribeEventDeal,用来处理微信服务器发来的取消关注事件消息。记得类源码文件要放在App_Code目录下!下面是关注事件消息处理源码:
QinMingWeixinEventHandlerUnSubscribe.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.Tools.DB;
using QinMing.Weixin.ReturnContent;
using QinMing.WeixinUserInfo;
using QinMing.WeixinPayPayment;
namespace QinMing.Weixin.EventHandlerUnSubscribe
{
//事件消息处理:取消关注公众号
public class UnSubscribeEventDeal :System.Web.UI.Page
{
public string DealResult(string weixinXML)
{
string content = DealSubscribe(weixinXML);
return content;
}
public string DealSubscribe(string weixinXML)
{
string content1="";
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;
DealLeave(FromUserName);
SaveEvent(FromUserName, ToUserName);
//给管理员发送粉丝取消关注通知
QinMing.WeixinTemplateMessage.SendTemplateMessage.SendRemindMsg("管理员openid", "粉丝取消关注提醒" + FromUserName, "http://www.yourweb.com/Weixin/DisplayUser.aspx?open_id=" + FromUserName);
return strresponse;
}
//记录粉丝取关公众号时的相关信息
public void DealLeave(string FromUserName)
{
string strConn = QinMingConfig.DatabaseConnStr;
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into weixin_leave_log (open_id,leave_time) values('" + FromUserName + "',getdate())";
cmd.ExecuteScalar();
cmd.CommandText = "update weixin_join_log set remove_flag=1 where remove_flag=0 and open_id='" + FromUserName + "'";
cmd.ExecuteScalar();
cmd.CommandText = "update weixin_user_info set remove_flag = '已取关' where open_id = '" + FromUserName + "'";
cmd.ExecuteScalar();
if (conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
//保存事件信息。
public void SaveEvent(string FromUserName, string ToUserName)
{
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) "
+ "values ('event','unsubscribe','" + FromUserName + "','" + ToUserName + "',getdate()) ";
//QinMingTools.WriteLog("sql语句:", cmd.CommandText);
cmd.ExecuteScalar();
if (conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
}
}



