一、申请模板消息权限
模板消息的申请需账号已经开通微信支付权限。
在微信公众平台的后台,依次进入“功能->添加功能插件->模板消息”,即可申请模板消息。
选择2个行业
选择模板
TemplateNews 类代码
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WeiXinPublic.utils;
namespace WeiXinPublic.dialog_service
{
/// <summary>
/// 模板消息
/// </summary>
public class TemplateNews
{
/// <summary>
/// 发送模板消息
/// </summary>
/// <param name="appid"></param>
/// <param name="secret"></param>
/// <param name="postStr"></param>
/// <returns></returns>
private static string send_news(string appid, string secret, string postStr)
{
//1.获取access_token
Hashtable ht_access_token = BasisSupport.GetAccessToken(appid, secret);
string access_token = ht_access_token["access_token"].ToString();
//post数据到接口
string url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
return Sender.Post(url, postStr);
//返回值{"errcode":0,"errmsg":"ok","msgid":427603660}
}
/// <summary>
/// 发送模板消息
/// </summary>
/// <param name="appid"></param>
/// <param name="secret"></param>
/// <param name="postStr"></param>
/// <returns></returns>
public static string SendNews(string appid, string secret, string postStr)
{
return send_news(appid, secret, postStr);
}
}
}
BasisSupport 类代码
using Codeplex.Data;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WeiXinPublic.utils;
namespace WeiXinPublic.dialog_service
{
/// <summary>
/// 基础支持
/// 1.获取access_token(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN)
/// 2.获取微信服务器IP地址(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140187&token=&lang=zh_CN)
/// </summary>
public class BasisSupport
{
#region 获取access_token
/// <summary>
/// 获取access_token json字符串 调用微信接口
/// </summary>
/// <returns></returns>
/// <param name="appid"></param>
/// <param name="secret"></param>
/// <returns></returns>
private static string get_accesstoken(string appid, string secret)
{
string res = string.Empty;
object obj = CacheHelper.GetCache("access_token");
if (obj != null)
{
res = obj.ToString();
}
else
{
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
//通过接口去取
res = Sender.Get(url);
CacheHelper.AddCache("access_token", res, DateTime.Now.AddMinutes(120)); //ccess_token的有效期目前为2个小时
}
return res;
}
/// <summary>
/// 获取access_token
/// </summary>
/// <param name="appid"></param>
/// <param name="secret"></param>
/// <returns></returns>
public static Hashtable GetAccessToken(string appid, string secret)
{
string res = get_accesstoken(appid, secret);
var json = DynamicJson.Parse(res);
var access_token = json.access_token;
var expires_in = json.expires_in;
//万能字典
Hashtable ht = new Hashtable();
ht.Add("access_token", access_token);
ht.Add("expires_in", expires_in);
return ht;
}
#endregion
#region 获取微信服务器IP地址
/// <summary>
/// 获取微信服务器IP地址
/// </summary>
/// <returns></returns>
private static string get_ip_list(string accesstoken)
{
string url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=" + accesstoken;
return Sender.Get(url);
}
/// <summary>
/// 获取微信服务器IP地址
/// </summary>
/// <param name="accesstoken"></param>
/// <returns></returns>
public static string[] GetIpList(string accesstoken)
{
string res = get_ip_list(accesstoken);
var json = DynamicJson.Parse(res);
var ip_list = json.ip_list;
string[] array = ip_list;
return array;
}
#endregion
}
}
Sender 类代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace WeiXinPublic.utils
{
public class Sender
{
/// <summary>
/// Get方式 访问微信接口
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string Get(string url)
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
using (StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
/// <summary>
/// Post方式 访问微信接口
/// </summary>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <returns></returns>
public static string Post(string url, string postData)
{
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(postData);
// 准备请求...
try
{
// 设置参数
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
//发送请求并获取相应回应数据
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
string err = string.Empty;
return content;
}
catch (Exception ex)
{
string err = ex.Message;
return string.Empty;
}
}
}
}
程序调用 代码
using Gzh.MvcWeb.Utility.Filter;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WeiXinPublic.dialog_service;
namespace Gzh.MvcWeb.Controllers
{
public class TestController : Controller
{
public ActionResult Index()
{
string postStr = CreateTemplateNews("您收到了一条新的核实指令", DateTime.Now.ToString(), "居住登记", "待核实", "请在24小时核实并反馈", "o3rzYjnz7_WTogm-tnwJCwF2SvW8", "5EHjYKcHRnVsPUEw4t1tP4h5UofL9vFbzbOIffY6SQg", "http://jnga.sunmen.cn/Operator/UnCheckList/96");
string str = TemplateNews.SendNews("wxb71307a08c833e74", "32c445427d5cd950445211d9c39fdd81", postStr);
return View();
}
/// <summary>
/// 创建模板消息post数据
/// </summary>
/// <param name="firstText"></param>
/// <param name="keyword1Text"></param>
/// <param name="keyword2Text"></param>
/// <param name="keyword3Text"></param>
/// <param name="remarkText"></param>
/// <param name="openid">接受者openid</param>
/// <param name="tempId">模板id</param>
/// <param name="jumpUrl">跳转地址</param>
/// <returns></returns>
private static string CreateTemplateNews(string firstText, string keyword1Text, string keyword2Text, string keyword3Text, string remarkText, string openid, string tempId, string jumpUrl)
{
var firstObj = new { value = firstText };
var keyword1Obj = new { value = keyword1Text };
var keyword2Obj = new { value = keyword2Text };
var keyword3Obj = new { value = keyword3Text };
var remarkObj = new { value = remarkText };
var data = new { first = firstObj, keyword1 = keyword1Obj, keyword2 = keyword2Obj, keyword3 = keyword3Obj, remark = remarkObj };
var obj = new { touser = openid, template_id = tempId, url = jumpUrl, data = data };
string postStr = JsonConvert.SerializeObject(obj);
return postStr;
}
}
}