最近做一个项目用到微信模板消息推送功能
1、在公众号管理页面中,左侧菜单栏》功能》添加功能插件,找到模板消息然后开通该功能,在模板消息界面的模板库中找到你要用到的模板添加到我的模板里面
2、发送模板消息
/// <summary>
/// 向用户发送公众号模板消息
/// </summary>
/// <param name="open_id">用户openID</param>
/// <param name="car_no">车牌号</param>
/// <param name="name">司机姓名</param>
/// <param name="address">发生区域</param>
/// <param name="date">违章日期</param>
/// <param name="content">违章内容</param>
/// <param name="remark">备注</param>
/// <returns></returns>
private String SendMessage(string open_id,string car_no,string name,string address,string date,string content,string remark)
{
string strReturn = string.Empty;
try
{
string token = GetAccess_Token();
string url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;
string temp = "{\"touser\": \"" + open_id + "\"," +
"\"template_id\": \"E46pmW-z-Sb5fTAW4PZwu_52ycaApg7j863WMu9zNgM\", " +
"\"url\":\"https://www.sxnhkj.top/wz.aspx\","+
"\"topcolor\": \"#FF0000\", " +
"\"data\": " +
"{\"first\": {\"value\": \"你好,你有一条新的厂区违章记录!\"}," +
"\"keyword1\": { \"value\": \"" + car_no + "\"}," +
"\"keyword2\": { \"value\": \"" + name + "\"}," +
"\"keyword3\": { \"value\": \"" + address + "\"}," +
"\"keyword4\": { \"value\": \"" + date + "\"}," +
"\"keyword5\": { \"value\": \"" + content + "\"}," +
"\"remark\": {\"value\": \"" + remark + "\" }}}";
GetResponseData(temp, @url);
strReturn = "推送成功";
}
catch (Exception ex)
{
strReturn = ex.Message;
}
return strReturn;
}
/// <summary>
/// 返回JSon数据
/// </summary>
/// <param name="JSONData">要处理的JSON数据</param>
/// <param name="Url">要提交的URL</param>
/// <returns>返回的JSON处理字符串</returns>
public string GetResponseData(string JSONData, string Url)
{
byte[] bytes = Encoding.UTF8.GetBytes(JSONData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentLength = bytes.Length;
request.ContentType = "json";
Stream reqstream = request.GetRequestStream();
reqstream.Write(bytes, 0, bytes.Length);
//声明一个HttpWebRequest请求
request.Timeout = 90000;
//设置连接超时时间
request.Headers.Set("Pragma", "no-cache");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream streamReceive = response.GetResponseStream();
Encoding encoding = Encoding.UTF8;
StreamReader streamReader = new StreamReader(streamReceive, encoding);
string strResult = streamReader.ReadToEnd();
streamReceive.Dispose();
streamReader.Dispose();
return strResult;
}
/// <summary>
/// 获取Accesstoken
/// </summary>
/// <returns></returns>
private string GetAccess_Token()
{
string access_token = "";
string sql = "select access_token,expires_in,add_date from tab_access_token where token_type=0 order by add_date desc";
DataSet ds = DBHelper.Query(sql);
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count>0)
{
access_token = ds.Tables[0].Rows[0]["access_token"].ToString();//获取access_token
string expires_in = ds.Tables[0].Rows[0]["expires_in"].ToString();
string get_date = ds.Tables[0].Rows[0]["add_date"].ToString();
if (access_token != "" && expires_in != "" && get_date != "")
{
//判断是否过期
TimeSpan ts = DateTime.Now.Subtract(Convert.ToDateTime(get_date));
if ((ts.TotalSeconds - int.Parse(expires_in)) > 0)
{
//过期重新获取
access_token = GetAccessToken();
}
}
else
{
access_token = GetAccessToken();
}
}
else
{
access_token = GetAccessToken();
}
return access_token;
}
/// <summary>
/// 由于本地客户端的外网IP地址不固定,IP白名单无法添加,所以只能作为测试临时使用,
/// 正式上线后要部署到服务器定时刷新获取,服务器IP地址是固定不变
/// </summary>
/// <returns></returns>
private string GetAccessToken()
{
string AppID = "wx6fea65cd988a5d82";
string AppSecret = "fcf840ab5ad915fa762fe4ce3432b241";
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppID, AppSecret);
System.Net.WebRequest wrq = System.Net.WebRequest.Create(url);
wrq.Method = "GET";
System.Net.WebResponse wrp = wrq.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(wrp.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8"));
string strResult = sr.ReadToEnd();
//string strResult = "{\"access_token\":\"7_ORi8K6fA2wALPGycy_kEDcdV69SqZyjPfaBZRfU_ATPRXSvcan9K7cE7Ozv7BXsYg51rL0xYjsmQJvtiKEK0olkQFvcq6Qml7_kIfTiWbFHhk8TJsJKQLm4abLfY6PgXTRwwHYDYCM3fX0QBMQOhAAAQUS\",\"expires_in\":7200}";
string access_tokens = strResult.Split(',')[0].Split(':')[1];
access_tokens = access_tokens.Substring(1, access_tokens.Length - 2);
string expires_in = strResult.Split(',')[1].Split(':')[1];
expires_in = expires_in.Substring(0, expires_in.Length - 1);
更新access_token到数据库
try
{
string sql_img = "insert into tab_access_token(access_token,access_token_ref,token_type,expires_in,add_date) values('" + access_tokens + "','',0," + expires_in + ",'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')";
DBHelper.ExecuteSql(sql_img);
}
catch { }
return access_tokens;
}
注意:1、openID和access_token一定要配对,我就是应为做的小程序和公众号两个弄混淆了,openID保存的是小程序的,access_token是用公众号的APPID获取的,即使两者相关联,但获取到的还是不一样,害我研究了好半天才弄明白。2、在本地测试的时候一定要注意IP白名单,由于本地外网IP不固定,经常就应为没有加入IP白名单而导致获取access_token失败。3、access_token有次数限制,一定要保存起来定时获取