其他MVC微信公众号文章
代码
习惯,先贴代码,然后讲解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//获取关注用户信息 [HttpPost] public ActionResult Index() { using (var sta = Request.InputStream) { byte[] bys = new byte[sta.Length]; sta.Read(bys, 0, (int)sta.Length); string xml = Encoding.UTF8.GetString(bys); //拿到当前用户的openid XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string openid = doc.SelectSingleNode("/xml/FromUserName").InnerText; string sub = doc.SelectSingleNode("/xml/Event").InnerText; string eve = doc.SelectSingleNode("/xml/MsgType").InnerText; if (eve == "event" && sub == "subscribe") { //关注事件 string url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + Token.Create() + "&openid=" + openid; string json = HttpHelper.HttpGet(url, ""); JObject jsons = JObject.Parse(json); //存入数据库 Model1Container db = new Model1Container(); Users us = new Users(); us.nickname = jsons["nickname"].ToString(); us.headimgurl = jsons["headimgurl"].ToString(); us.city = jsons["city"].ToString(); us.sex = jsons["sex"].ToString(); us.openid = openid; db.Users.Add(us); db.SaveChanges(); //关注回复 string msg = System.IO.File.ReadAllText(Server.MapPath("/Common/guanzhu.txt")); msg = msg.Replace("@toUser", openid); msg = msg.Replace("@time", TimeHelper.GetTimeStamp(true)); return Content(msg); } else if (eve == "event" && sub == "unsubscribe") { //取消关注事件 Model1Container db = new Model1Container(); Users us = db.Users.FirstOrDefault(u => u.openid == openid); db.Entry(us).State = System.Data.EntityState.Deleted; db.SaveChanges(); } } return Content(""); } |
代码讲解
当有用户关注我们的公众号的时候,微信服务器会发一个xml数据过来给我们,xml内容如下所示
1 2 3 4 5 6 7 |
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> </xml> |

重要的有三个,FromUserName、MsgType、Event
FromUserName 得到的是用户的openid,我们可以通过openid查出关注者的所有信息,MsgType和Event是用来判断是否是订阅和取消订阅事件。
1 2 3 4 5 6 |
byte[] bys = new byte[sta.Length]; sta.Read(bys, 0, (int)sta.Length); string xml = Encoding.UTF8.GetString(bys); //拿到当前用户的openid XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); |
这一段代码是接收到微信服务器传过来的xml数据,然后存到xml doc里面供调用。
1 2 3 |
string openid = doc.SelectSingleNode("/xml/FromUserName").InnerText; string sub = doc.SelectSingleNode("/xml/Event").InnerText; string eve = doc.SelectSingleNode("/xml/MsgType").InnerText; |
这一段代码是从doc里面的节点里获取到openid、Event、MsgType的内容,用于后面的判断到底是不是订阅或者取消订阅事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
if (eve == "event" && sub == "subscribe") { //关注事件 string url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + Token.Create() + "&openid=" + openid; string json = HttpHelper.HttpGet(url, ""); JObject jsons = JObject.Parse(json); //存入数据库 Model1Container db = new Model1Container(); Users us = new Users(); us.nickname = jsons["nickname"].ToString(); us.headimgurl = jsons["headimgurl"].ToString(); us.city = jsons["city"].ToString(); us.sex = jsons["sex"].ToString(); us.openid = openid; db.Users.Add(us); db.SaveChanges(); //关注回复 string msg = System.IO.File.ReadAllText(Server.MapPath("/Common/guanzhu.txt")); msg = msg.Replace("@toUser", openid); msg = msg.Replace("@time", TimeHelper.GetTimeStamp(true)); return Content(msg); } |
如果是订阅事件的话,用openid获取到用户的信息,将你需要的信息插入到数据库(也可以是其他方式,反正你怎么用看你自己),插入完后开始订阅自动回复。
准备一个自动回复的xml文件,我这里已经准备好了。
1 2 3 4 5 6 7 |
<xml> <ToUserName><![CDATA[@toUser]]></ToUserName> <FromUserName><![CDATA[gh_f440b873b6a2]]></FromUserName> <CreateTime>@time</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[欢迎关注TC科技]]></Content> </xml> |
gh_f440b873b6a2是你的微信公众号的一个id一样的东西,在后台有,ToUserName这里用了变量,因为每个关注的人openid都不同。
1 2 3 4 5 |
//关注回复 string msg = System.IO.File.ReadAllText(Server.MapPath("/Common/guanzhu.txt")); msg = msg.Replace("@toUser", openid); msg = msg.Replace("@time", TimeHelper.GetTimeStamp(true)); return Content(msg); |
首先读取guanzhu.txt,然后将@toUser变量替换成关注的用户openid,时间取当前时间戳,然后直接返回给微信服务器即可。
至于我的取消关注事件,其实不需要写什么,但是因为我在关注的时候将用户的信息放在了数据库,所以当他取消关注的时候,我将他的数据库信息删除。
1 2 3 4 5 6 7 8 |
else if (eve == "event" && sub == "unsubscribe") { //取消关注事件 Model1Container db = new Model1Container(); Users us = db.Users.FirstOrDefault(u => u.openid == openid); db.Entry(us).State = System.Data.EntityState.Deleted; db.SaveChanges(); } |
评论