您的位置:首页 > 移动开发 > 微信开发

【微信开发】定制消息推送

2017-07-29 17:37 260 查看

背景

因为要实现向用户推送一些消息,但是每个用户收到的消息按需求又是不同的

这里,比如在考试前向学生推送考试信息,那么每个用户收到信息的时间是不同的,收到的内容是不同的

所以,消息需要定制发送

在微信提供的接口中,我们设想了几种方案来实现,最终选择了按照openid列表群发接口来实现

功能

根据不同用户在不同的时间向用户发送定制的消息

代码

获取用户openid

if (!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、控制台、还是服务

在讨论和实践的过程中,每次叠加实现一个技术点,一步步实现了功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: