【微信开发】定制消息推送
2017-07-29 17:37
260 查看
背景
因为要实现向用户推送一些消息,但是每个用户收到的消息按需求又是不同的这里,比如在考试前向学生推送考试信息,那么每个用户收到信息的时间是不同的,收到的内容是不同的
所以,消息需要定制发送
在微信提供的接口中,我们设想了几种方案来实现,最终选择了按照openid列表群发接口来实现
功能
根据不同用户在不同的时间向用户发送定制的消息代码
获取用户openidif (!IsPostBack && (Request.QueryString["echostr"]==null)) { string appid = "YOUR APPID"; string appsecret = "YOUR APPSECRET"; string code = null; //调用10次微信服务,查询用户openid-暂时不用 //for (int i = 0; i < 10; i++) //{ code = Request.QueryString["code"]; if (code == null) { Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http%3a%2f%2--你的域名--%2fET%2f&response_type=code&scope=snsapi_base&state=1#wechat_redirect"); } else { string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code"; string jsonReturn = ""; HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(url); httprequest.Method = "GET"; HttpWebResponse response = (HttpWebResponse)httprequest.GetResponse(); using (Stream steam = response.GetResponseStream()) { StreamReader reader = new StreamReader(steam, Encoding.GetEncoding("gb2312")); jsonReturn = reader.ReadToEnd(); steam.Close(); } JObject jo = JObject.Parse(jsonReturn); OPENID = jo["openid"].ToString(); } }
获取access_token
public static string getAccessToken() { string appid = System.Configuration.ConfigurationManager.AppSettings["appid"]; string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"]; string access_token = null; string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret; string jsonReturn = ""; HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(url); httprequest.Method = "GET"; HttpWebResponse response = (HttpWebResponse)httprequest.GetResponse(); using (Stream steam = response.GetResponseStream()) { StreamReader reader = new StreamReader(steam, Encoding.GetEncoding("gb2312")); jsonReturn = reader.ReadToEnd(); steam.Close(); } JObject jo = JObject.Parse(jsonReturn); access_token = jo["access_token"].ToString(); return access_token; }
用post方式推送
private static string Post(string url, byte[] bytesToPost) { if (String.IsNullOrEmpty(url)) return "url参数为空值"; if (bytesToPost == null) return "post数据为空值"; string ResponseString = ""; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); System.Net.ServicePointManager.DefaultConnectionLimit = 50; request.KeepAlive = false; request.Method = "POST"; request.ContentType = "text/xml";//提交xml request.ContentLength = bytesToPost.Length; Stream writer = request.GetRequestStream(); writer.Write(bytesToPost, 0, bytesToPost.Length); HttpWebResponse HttpWebRespon = (HttpWebResponse)request.GetResponse(); StreamReader myStreamReader = new StreamReader(HttpWebRespon.GetResponseStream(), Encoding.UTF8); ResponseString = myStreamReader.ReadToEnd(); myStreamReader.Close(); writer.Flush(); if (writer != null) { writer.Close(); } if (request != null) { request.Abort(); } return ResponseString; }
向openid发送定制消息
string access_token = getAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=" + access_token; string postText = "{\"touser\":[\"" + list[i].WeChatOpenId + "\",\"\"],\"msgtype\": \"text\",\"text\": { \"content\": \"【 考试提醒 】\\n\\n\\n" + list[i].StudentName + "同学,你好!\\n明天有考试,请做好准备\\n\\n考试科目:" + list[i].ExamName + "\\n考试日期:" + list[i].Date + "\\n考试时间:" + list[i].StartTime + " - " + list[i].EndTime + "\\n考试地点:" + list[i].ExamPlace + "-" + list[i].SeatNo + "号\\n\\n" + "请提前准备好文具和证件\\n详细情况可点击“查考场”进行查询\\n\\n" + "祝您考试顺利~~\\n\\n\\n" + "-------------------------------\\n" + "xx公司 · 技术支持\\n" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"}}"; //因为汉字编码问题,出现40008错误,可采用以下方式对文本编码 //string contentText = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes("今天用微信和女神表白,什么排比、比喻各种修辞,可谓字字经典,句句动情,引经据典,声情并茂。最后,在我强烈的感情攻势下,女神终于回了一句:你谁啊?")); Encoding encoding = Encoding.GetEncoding("utf-8"); byte[] bytesToPost = encoding.GetBytes(postText); string res = Post(url, bytesToPost); Console.WriteLine(res);
流程说明
1.首先需要获取用户openid,在用户访问页面的时候就可以获得,然后存到数据库中2.获取access_token,用post方式调用微信接口向用户发送消息
注意:
具体什么时间发送,发送什么什么内容,根据自己的业务逻辑来编写
这里的定时发送采用的是Quartz框架,并把推送程序做成了一个服务
小结
在实现消息推送的过程中,遇到很多问题比如:如何获取openid,获取access_token,在哪里获取,如何和微信接口交互,如何实现定时发送,程序应该是一个BS、CS、控制台、还是服务
在讨论和实践的过程中,每次叠加实现一个技术点,一步步实现了功能
相关文章推荐
- 夺命雷公狗---微信开发26----客服消息接口基础和推送视频
- baidu推送消息定制开发
- 微信开发 消息推送实现代码
- 夺命雷公狗---微信开发27----客服消息接口基础和推送图文消息
- Wechat_pusher - 基于 Golang 开发的微信消息定时推送框架
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
- Java微信二次开发之13-图文消息的推送接收
- 夺命雷公狗---微信开发23----客服消息接口基础和推送文本
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
- 微信开发——4、处理各种消息推送
- 关于微信接收事件以及推送消息相关的java开发
- 微信开发 消息推送实现代码
- 微信小程序开发:设置消息推送
- 夺命雷公狗---微信开发24----客服消息接口基础和推送图片
- 微信小程序服务端开发之消息推送
- 微信开发推送消息案例
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)