标签:
这次我们来一起研究一下“客服消息”,首先明确一下“客服消息”的概念。这不同于之前的“被动响应消息”,也就是说并不是之前“你一言我一语的即时响应”,可能在某种情况下你需要给不同的人主动发送消息,例如你的餐馆推出了新的川菜,那么你需要给喜欢川菜的人发送消息,而并不是等着被人发送“有什么新菜”后,然后反馈给客户,我推出了什么什么的。
说道这里可能有人会问,那不是群发吗?微信不是每天只能发一条吗?服务号每个月发一条吗?答案很明确微信说的是“客服消息”,也不是群发,它跟群发的区别就在于只要关注了我,那么我就可以群发给你消息,而为了不让用户感到讨厌,微信作了严格的群发条数限制。而“客服消息”则是只有关注你的人向你发送了消息,你才能主动推送。就像打电话只有人家问过你问题了,你才能回答,并且继续跟进回答。再举一个例子:你通过被人知道了我的手机号,存下来了,你突然给我打电话,我肯定是抵触的。但是如果我给你打过电话,你通过来电显示知道了我的号码,以后再给我打电话,说明我们是认识的,我最少不会抵触。这就使群发/被动响应/客服消息的本质区别。
就像我们可以通过收集电话号码,手机自己的客户信息一样,一旦他们的信息被我们收录。那么我们就可以突破群发条数的限制了,按照微信的限制群发一个月只能一条(服务号),但是“客服消息”则可以一天50000条,足够用了。
下面的问题就是如何手机客户的“手机号”了,微信里面有一个OPENID,这就使手机号了,这个是关注你的用户的唯一标识,这个标识是不会变的,但是同一个用户关注不同的微信号,那么他在不同微信号中的ID是不一样的。如何取得OPENID呢?
网上找了些资料,有的说的的确是错误的,有的还说要通过OAuth 2.0授权才可以,这个的确可以,但是太复杂了吧,通过我的测试得出了这样的结论“只要用户和你的公共微信好发生交互”就可以取得他的OPENID了。就如同打电话一样,只要用户给你打了电话,你一定知道他的电话了。在微信里是这样的:用户只要发信息给你,或者点了某个菜单,发过来的信息都会有一个“FromUserName”,这个就使OPENID了。我们可以建立一个数据库来收集这些宝贵的用户身份信息,也就是记录他的“电话号码”,有了电话号码,我们就可以以后经常与客户主动打电话了。我做这样的一个实验:
首先记录用户的OPENID在OnLoad函数第二行里面加上一个 WriteLog(wx.FromUserName);把它记录在一个文本文件中
- protected void Page_Load(object sender, EventArgs e)
- {
- wxmessage wx = GetWxMessage();
- WriteLog(wx.FromUserName);
- string res = "";
-
-
- if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe")
- {
- string content = "";
- if (!wx.EventKey.Contains("qrscene_"))
- {
- content = "/:rose欢迎北京永杰友信科技有限公司/:rose\n直接回复“你好”";
- res = sendTextMessage(wx, content);
- }
- else
- {
- content = "二维码参数:\n" + wx.EventKey.Replace("qrscene_", "");
- res = sendTextMessage(wx, content);
- }
- }
-
- else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.ToLower() == "scan")
- {
- string str = "二维码参数:\n" + wx.EventKey;
- res = sendTextMessage(wx, str);
- }
- else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK")
- {
- if(wx.EventKey=="HELLO")
- res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
- }
- else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "LOCATION")
- {
- res = sendTextMessage(wx, "您的位置是经度:" + wx.Latitude + ",维度是:" + wx.Longitude+",地理经度为:"+wx.Precision);
- }
- else
- {
- if (wx.MsgType == "text" && wx.Content == "你好")
- {
-
- res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
- }
- else if (wx.MsgType == "voice")
- {
- res = sendTextMessage(wx, wx.Recognition);
- }
- else if (wx.MsgType == "location")
- {
- res = sendTextMessage(wx, "您发送的位置是:" + wx.Label + ";纬度是:" + wx.Location_X + ";经度是:" + wx.Location_Y + ";缩放比例为:" + wx.Scale);
- }
- else
- {
- res = sendTextMessage(wx, "你好,未能识别消息!");
- }
- }
-
-
-
- Response.Write(res);
- }
- protected void Page_Load(object sender, EventArgs e)
- {
- wxmessage wx = GetWxMessage();
- WriteLog(wx.FromUserName);
- string res = "";
-
-
- if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe")
- {
- string content = "";
- if (!wx.EventKey.Contains("qrscene_"))
- {
- content = "/:rose欢迎北京永杰友信科技有限公司/:rose\n直接回复“你好”";
- res = sendTextMessage(wx, content);
- }
- else
- {
- content = "二维码参数:\n" + wx.EventKey.Replace("qrscene_", "");
- res = sendTextMessage(wx, content);
- }
- }
-
- else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.ToLower() == "scan")
- {
- string str = "二维码参数:\n" + wx.EventKey;
- res = sendTextMessage(wx, str);
- }
- else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK")
- {
- if(wx.EventKey=="HELLO")
- res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
- }
- else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "LOCATION")
- {
- res = sendTextMessage(wx, "您的位置是经度:" + wx.Latitude + ",维度是:" + wx.Longitude+",地理经度为:"+wx.Precision);
- }
- else
- {
- if (wx.MsgType == "text" && wx.Content == "你好")
- {
-
- res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
- }
- else if (wx.MsgType == "voice")
- {
- res = sendTextMessage(wx, wx.Recognition);
- }
- else if (wx.MsgType == "location")
- {
- res = sendTextMessage(wx, "您发送的位置是:" + wx.Label + ";纬度是:" + wx.Location_X + ";经度是:" + wx.Location_Y + ";缩放比例为:" + wx.Scale);
- }
- else
- {
- res = sendTextMessage(wx, "你好,未能识别消息!");
- }
- }
-
-
-
- Response.Write(res);
- }
WriteLog的方法是这样的:
-
-
- private void WriteLog(string strMemo)
- {
- string filename = Server.MapPath("/logs/log.txt");
- if (!Directory.Exists(Server.MapPath("//logs//")))
- Directory.CreateDirectory("//logs//");
- StreamWriter sr = null;
- try
- {
- if (!File.Exists(filename))
- {
- sr = File.CreateText(filename);
- }
- else
- {
- sr = File.AppendText(filename);
- }
- sr.WriteLine(strMemo);
- }
- catch
- {
-
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
- }
-
-
- private void WriteLog(string strMemo)
- {
- string filename = Server.MapPath("/logs/log.txt");
- if (!Directory.Exists(Server.MapPath("//logs//")))
- Directory.CreateDirectory("//logs//");
- StreamWriter sr = null;
- try
- {
- if (!File.Exists(filename))
- {
- sr = File.CreateText(filename);
- }
- else
- {
- sr = File.AppendText(filename);
- }
- sr.WriteLine(strMemo);
- }
- catch
- {
-
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
- }
这样当客户发送任何一种信息给微信公共号,我们的log.txt文件中就会记录这个OPENID,我先打开Log.txt这个文件看看OPENID号,我的事这样的“oV93gjl5slD3p29yS1dOijy-pqZ8”,有了这个OPENID很多事情就都好办了,以后我们还会介绍如何获取客户的信息。这里先说“客户消息”吧。
下面我们建立一个新的ASPX页面,在这个页面里面我就可以给这些用户发信息了。这个页面(SendMessage.aspx.cs)很简单就使两个文本框和一个按钮:
- string MyOpenID;
- string MyContent;
- protected void Page_Load(object sender, EventArgs e)
- {
- MyOpenID = "oV93gjl5slD3p29yS1dOijy-pqZ8";
- MyContent = "这是一个客服消息";
- UserName.Text = MyOpenID;
- Content.Text = MyContent;
- }
- protected void Button1_Click(object sender, EventArgs e)
- {
- string res = "";
- string Access_Token = IsExistAccess_Token();
-
- string posturl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + Access_Token;
- string postData = "{\"touser\":\"" + UserName.Text + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + Content.Text + "\"}}";
- res = GetPage(posturl, postData);
-
- Response.Write(res);
- }
- string MyOpenID;
- string MyContent;
- protected void Page_Load(object sender, EventArgs e)
- {
- MyOpenID = "oV93gjl5slD3p29yS1dOijy-pqZ8";
- MyContent = "这是一个客服消息";
- UserName.Text = MyOpenID;
- Content.Text = MyContent;
- }
- protected void Button1_Click(object sender, EventArgs e)
- {
- string res = "";
- string Access_Token = IsExistAccess_Token();
-
- string posturl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + Access_Token;
- string postData = "{\"touser\":\"" + UserName.Text + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + Content.Text + "\"}}";
- res = GetPage(posturl, postData);
-
- Response.Write(res);
- }
中间还用到了之前提到的3个函数:
这个页面就是这些了,打开这个页面然后发送消息试试?很不错吧,这样在配合上我们的数据库啦,什么循环了,就可以突破了微信群发的限制,做到定项的群发消息推送了!这里面能发很多种消息:文本,语音,视频,图文,图片等等。只是Json而已,聪明的你一定可以举一反三的。
微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
标签:
原文地址:http://www.cnblogs.com/Alex80/p/4236096.html