实例:用C#.NET手把手教你做微信公众号开发(17)--公众号主动给粉丝发信息之模板消息

2023-05-16

前面讲了那么多,都是微信用户主动向公众号发送信息或某个操作触发公众号响应并给予用户回复。如果在微信用户没有主动发起互动的情况下,公众号应该如何向微信用户发送消息呢?

本篇给出一种解决方案:模板消息。先来看看官方文档:

模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。

关于使用规则,请注意:

  1. 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
  2. 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
  3. 在所选择行业的模板库中选用已有的模板进行调用;
  4. 每个账号可以同时使用25个模板。
  5. 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在 MP 登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号 MP 后台开发者中心页面中标明的数字为准。

关于接口文档,请注意:

  1. 模板消息调用时主要需要模板 ID 和模板中各参数的赋值内容;
  2. 模板中参数内容必须以".DATA"结尾,否则视为保留字;
  3. 模板保留符号""。

注意上面标红的字样,都是使用要点,首先公众号要认证才能启用模板消息功能,还有不能随意给微信用户发信息,特别是发营销类消息以及带敏感字眼的消息,否则首先是模板消息失效,严重的还会导致公众号被封号,使用前一定要详细了解规则。

现在来看看实现步骤。

一、公众号认证

登录微信公众号后台,按提示完成公众号认证,每年有300元服务费。

 

二、选择模板消息

认证后,到微信公众号内选择想用的模板消息类型,操作图如下:

 

 

 

 

 

三、编写常用模板消息类

准备以上内容,现在可以把常用的模板消息写到一个专用类里,我放在QinMing.WeixinTemplateMessage命名空间的SendTemplateMessage类中,保存为QinMingWeixinTemplateMessage.cs文件,放在App_Code目录中,源码如下(仅演示其中两个):

using System;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Text.RegularExpressions;
using LitJson;
using System.Net;
using System.IO;
using QinMing.WeixinContainer;
using QinMing.Config;

namespace QinMing.WeixinTemplateMessage
{
    public class SendTemplateMessage
    {

		/// <summary>
        /// 模板消息:派单成功提醒,用于对公众号管理员发送各类提醒信息
        /// </summary>
		public static void SendRemindMsg(string open_id, string msg_title, string redirect_url) 
		{  
			QinMingWeixinContainer gt=new QinMingWeixinContainer();
			string access_token = gt.GetAccessToken();
			string msgid = "";  

			string poster = "{\"touser\": \"" + open_id + "\",\"template_id\":\"Y3-mTYsfrPBA_SzTqQraaaaaaaKH_9eF_kMGE3o0\", "
				+ "\"url\":\"" + redirect_url + "\"," 
				+ "\"data\":{\"first\":{\"value\":\"" + msg_title + "\",\"color\":\"#ff0000\"},"
				+ "\"keyword1\":{\"value\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssms") + "\",\"color\":\"#ff0000\"},"
				+ "\"keyword2\":{\"value\":\"" + DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss") + "\",\"color\":\"#ff0000\"},"
				+ "\"remark\":{\"value\":\"点击这里查看详情。\",\"color\":\"#0000ff\"}"
				+ " } }";  
			string resultStr = GetPage("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token, poster);  

		}

		/// <summary>
        /// 模板消息:新会员或新合伙人注册成功提醒,用于对公众号管理员发送提醒信息
        /// </summary>
		public static void SendNewMemberMsg(string open_id, string mobile, string msg_title, string redirect_url) 
		{  
			QinMingWeixinContainer gt=new QinMingWeixinContainer();
			string access_token = gt.GetAccessToken();
			string msgid = "";  

			string poster = "{\"touser\": \"" + open_id + "\",\"template_id\":\"tQ_vHnFzPSl5TLbbbbbbbb8yroNhJw2713SMF0\", "
				+ "\"url\":\"" + redirect_url + "\"," 
				+ "\"data\":{\"first\":{\"value\":\"" + msg_title + "\",\"color\":\"#ff0000\"},"
				+ "\"keyword1\":{\"value\":\"" + open_id + "\",\"color\":\"#ff0000\"},"
				+ "\"keyword2\":{\"value\":\"" + mobile + "\",\"color\":\"#ff0000\"},"
				+ "\"keyword3\":{\"value\":\"" + DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss") + "\",\"color\":\"#ff0000\"},"
				+ "\"remark\":{\"value\":\"点击这里查看详情。\",\"color\":\"#0000ff\"}"
				+ " } }";  
			string resultStr = GetPage("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token, poster);  

		}
		
        public static string GetPage(string posturl, 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(posturl) 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;  
			}  
        }  


    }

}

上面代码中用到的QinMing.Config、QinMing.WeixinContainer命名空间及其类实现,在前面的第(1)、第(4)篇文章中已经给出。
模板消息具体使用举例:

//给管理员发送粉丝点击菜单通知
QinMing.WeixinTemplateMessage.SendTemplateMessage.SendRemindMsg("指定openid", "粉丝点击菜单信息提醒" + FromUserName, "http://www.yourweb.com/OneUser.aspx?open_id=" + FromUserName);  

因为用了静态类和静态方法,无需事先创建对象,每次直接使用即可。

四、使用演示

用起来是不是很方便?关键是免费的!!!记住一定要按官方规则来,不然模板消息功能很容易被封停。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实例:用C#.NET手把手教你做微信公众号开发(17)--公众号主动给粉丝发信息之模板消息 的相关文章

  • 元素选择器

    题意介绍 题意分析 模拟题 xff0c 每一行都处理成一个结构体 xff0c 包括级别 标签 id 级别为点数量的二分之一 xff0c 还要把元素名称全部变为小写 xff0c 处理查询时 xff0c 如果输入的一行只有一个单词 xff0c
  • cmd命令行无法使用conda

    在系统变量中增加如下图的anaconda安装夹下的3个路径 D Anaconda3 D Anaconda3 Library bin D Anaconda3 Scripts
  • linux 执行maven项目jar包,并指定日志路径

    一 启动脚本 span class token comment 获取当前脚本所处的目录 span sh dir 61 span class token punctuation span cd 96 dirname span class to
  • c数组与结构体

    数组 xff0c 存储同类型的复合类型 xff1b 结构体 xff0c 存储不同类型的复合类型 xff0c 用于自定义数据结构 计算机中 xff0c 针对存储大量数据的集合 xff0c 有着两种方式 xff0c 一种是以块式集中存储数据 x
  • kali-linux轻量级系统的使用心得

    kali linux轻量级系统即 Kali Linux Light 运行明显比kali完整版要流畅许多 xff0c 非常适合定制自己的渗透测试系统 xff0c 本人10G的虚拟机硬盘安装完各种工具还剩5G多 xff0c 完整版需要至少20G
  • 关于VMware虚拟机中调节图标字体大小

    1 问题详述 当虚拟机界面图标字符或过小时 xff0c 看得很废费劲 2 问题解决 在桌面上点击鼠标右键 xff0c 点击 Change Desktop Background xff0c 在Fonts一栏分别调节各部分字体大小即可 如下图所
  • 关于@RunWith(SpringRunner.class)中SpringRunner.class报红的问题

    原因分析 xff1a 依赖包没导入 解决方案 xff1a span class token tag span class token tag span class token punctuation lt span dependency s
  • 使用xrdp实现windows 远程桌面 ubuntu linux

    一般情况下我们用ssh客户端远程登陆Linux系统 xff0c 至于图形界面下的linux远程登陆工具 xff0c 我们一般都会想到vnc xff0c 但它的安全性不够 xff0c 在这里 xff0c 我将介绍XRDP的安装配置方法 我们可
  • centos信任自建CA证书

    我们经常会用配置网站可以用https访问 xff0c 但是购买证书不现实 xff0c 所以我们会选择自建CA证书 xff0c 但是自建的CA证书 xff0c 在linux中用curl访问时总会报错 xff0c 报错信息如下 xff1a cu
  • Hadoop--HDFS的API环境搭建、在IDEA里对HDFS简单操作

    在windows系统安装hadoop 首先下载hadoop xff1a hadoop 3 1 4 tar gz 解压到C Hadoop目录下 然后下载winutils xff1a https github com cdarlint winu
  • python初学入门——————输入输出语句

    文章目录 一 输出语句1 格式化输出2 f 格式化字符串3 转义字符3 结束符 二 输入语句 一 输出语句 打印语句所使用的函数为print span class token keyword print span span class to
  • 判断一个字符串是不是回文序列

    上两周学习栈和队列的时候老师布置了一个上机作业 xff0c 题目非常的简单 xff0c 用最基本的栈和队列都能做到 xff0c 今天分享给大家 xff0c 题目是这样的 判断一个字符串是不是回文序列 xff0c 例如 aba adda 都是
  • FFMPEG编译裁剪移植

    FFMPEG 编译裁剪移植 author xff1a lyn date xff1a 2022 09 26 version ffmpeg4 1 3 1 ffmpeg文件结构说明 2 ffmpeg交叉编译 3 ffmpeg移植问题 4 参考资料
  • FFMPEG mp4封装实现

    FFMPEG mp4录像 author xff1a lyn date xff1a 2022 09 28 version ffmpeg4 1 3 1 mp4数据结构 2 ffmpeg mp4封装实现 3 mp4函数调用关系 4 参考资料 1
  • IMX8MP录像功能测试

    IMX8MP录像功能测试 目录 1 开发环境搭建 2 编译hello world 3 录像功能测试 4 参考资料 1 开发环境搭建 1 1 开发工具链和源码 开发环境的搭建按照手册上的命令搭建即可 xff0c 可以更换其中的安装目录 xff
  • 将网页制作成chm文件

    将网页制作成chm文件 1 安装工具 工具自行安装 爬站利器 xff0c Teleport Ultra 生成chm文件的工具 xff0c WinChm chm文件读取工具 xff0c ExtraChm 2 导出 导出网站文件 xff0c 使
  • Alsa交叉编译

    alsa交叉编译 下载源码 需要编译两个库 首先编译lib库 configure span class token parameter variable host span span class token operator 61 span
  • 免费天气api适合商用吗_4个免费的天气提供商API开发天气应用

    免费天气api适合商用吗 提供天气信息的Android应用在Play商店中很常见 此外 xff0c Weather应用程序和小部件是下载次数最多的项目之一 当需要开发天气应用程序时 xff0c 有必要使用天气提供程序作为天气信息的来源 这些
  • alsa命令和配置

    alsa命令和配置 常用命令 span class token comment 调节音量 span span class token comment amixer h span Available options h help this s
  • alsa音频调试

    alsa音频调试 1 找不到配置项 在amixer controls指令找不到Master Playback Volume配置项 xff0c 查阅资料可知 softval类型有些需要配置一次才能出现 xff0c 执行指令 在etc asou

随机推荐

  • 字符串文本匹配神器———Java正则表达式

    什么是正则表达式 xff1f 正则表达式是一种特殊的字符串模式 xff0c 用于匹配一组字符串 xff0c 就好比用模具做产品 xff0c 而正则就是这个模具 xff0c 定义一种规则去匹配符合规则的字符 为什么要学正则表达式 对于正则表达
  • Android打印调用堆栈(dump backtrace)的方法

    1 为什么要打印函数调用堆栈 xff1f 打印调用堆栈可以直接把问题发生时的函数调用关系打出来 xff0c 非常有利于理解函数调用关系 比如函数A可能被B C D调用 xff0c 如果只看代码 xff0c B C D谁调用A都有可能 xff
  • Ubuntu Linux通过apt库安装WireShark

    华灯璀璨1 秒前 回复 根据文章Ubuntu安装wireshark 小菜鸟要高飞的博客 CSDN博客写成了脚本 脚本如下 xff1a bin bash 编译环境配置 sudo apt get install bison flex libpc
  • (C++)1002 A+B for Polynomials

    笔记 xff1a 1 两个不为0的数相加可能为0 2 浮点数的比较方法 3 输出的时候格式怎么办 本题空格放在哪有门道 4 不需要三个数组 xff0c 一个就可以了 xff0c 第二个 数组 输入的时候直接加在第一个上面 include l
  • 如何轻松把mysql数据表对齐?!正解在这儿

    初学数据库 xff0c 很多小白就会发现自己的数据表总是对不齐 xff1a 怎么对齐 xff1f 只需要输入时 xff1a charset gbk xff1b 就ok了 简单易操作 xff0c 别问我怎么知道的 xff0c 百度是个好东西
  • websocket+定时任务实现实时推送

    websocket 43 定时任务实现实时推送 TaskScheduler定时任务实现websocket 43 定时任务实时推送 有时候业务要求websocket连接后 xff0c 服务端实时每隔一段时间就将数据推送给客户端进行响应 xff
  • Linux系统下运行bash脚本提示/usr/bin/env: ‘bash\r’: No such file or directory

    1 问题现象 在Linux系统中使用 searchsploit 启动 xff0c 运行失败 xff0c 并报错提示如下所示 xff1a 2 错误原因 xff1a 主要是应用bash后面多了 r 字符的原因 xff0c 在Linux终端下 x
  • 面试:每发送一个http请求就要建立一个tcp连接吗(非持久连接/持久连接)

    非持久连接 xff1a HTTP 1 0 中 的首部字段Connection 默认值为 close xff0c 即每次请求都会重新建立和断开 TCP 连接 持久连接 xff1a HTTP 1 1 中 的首部字段Connection 默认值为
  • 实例:用C#.NET手把手教你做微信公众号开发(16)--事件消息处理之点击菜单2

    微信用户点击菜单时 xff0c 会通过微信服务器转发两种事件给你的服务器 xff0c 一种是拉取消息时的事件推送 xff1b 另一种是跳转链接时的事件推送 上篇讲了第一种 xff0c 本篇先讲第二种 一 消息格式 推送XML数据包示例 xf
  • 合理清除AlibabaProtect进程

    1 在 任务管理器 的 进程选项中 xff0c 找到AlibabaProtect进程 xff0c 单击后 xff0c 右键选择 打开文件所在位置 xff0c 找到该进程对应文件所在位置 xff0c 并将其上级目录做成 桌面快捷方式 xff0
  • Sublime Text 4安装使用(完整教程)

    Sublime Text 4安装使用 安装使用语言汉化 OK啦 xff0c 觉得有用的点个赞吧 xff01 xff01 xff01 写这篇博客的意义希望能够将我走过的路 踩过的坑记录下来 在后来在遇到的时候能够更好的翻阅 未经允许 xff0
  • Xlaunch启动后无法显示图形界面,提示connection refused

    解决方案 xff1a 重启远程端
  • 【PR】零基础快速入门教程

    PR 零基础快速入门教程 PR xff08 Premiere xff09 能做什么 xff1f PR欢迎界面及新建项目工作区及窗口说明导入文件建立序列视频剪辑添加字幕导出视频 使用软件 xff1a Premiere2020 新年卷起来 xf
  • 【PR】源窗口

    PR 源窗口 源窗口粗剪源窗口按钮功能标记按钮出入点相关插入与覆盖插入覆盖 导出帧 使用软件 xff1a Premiere2020 源窗口粗剪 我们手上可能有一些很长的视频 xff0c 但是我就想要其中的几段 xff0c 这个时候粗剪就很方
  • 【PR】时间轴窗口

    PR 时间轴窗口 时间轴窗口工具按钮 视频轨道切换轨道输出切换同步锁定目标切换轨道锁定轨道对插入和覆盖进行源修补 工具按钮 音频轨道静音轨道独奏轨道画外音录制 时间轴窗口基础操作添加轨道查看完成视频和音频缩放轨道删除轨道 添加关键帧 使用软
  • 【PR】来,一起做一个简单的剪辑视频吧

    PR 来 xff0c 一起做一个简单的剪辑视频吧 前言新建项目导入素材创建序列裁剪视频视频导入序列 图片背景音频处理多视频素材处理添加字幕导出上传学了上面能做到什么程度 xff1f 可以看一下我用上面的方法做出成品 新手教程哈 xff0c
  • 【PR】视频剪裁

    PR 视频剪裁 把素材文件导入PR问题1 xff1a 删除多余部分 xff08 主要是录制范围 xff09 导出视频 xff08 问题1解决方案看我 xff09 问题2 导出的视频还有黑边导出视频 xff08 问题2解决方案看我 xff09
  • 【PR】图片处理

    PR 图片处理 导入图片将图片文件拖拽进时间轴点击图片选择效果 xff08 时间轴上的那个条 xff09 改变图片位置修改图片大小图片不透明度旋转与锚点 xff08 视频层 xff09 图层 PR不光能导入视频 xff0c 还可以导入图片
  • 【PR】音频处理及过度效果

    PR 音频处理及过度效果 导入音频插入时间轴中的A轨道 xff08 声音轨道 xff09 音频处理调整音量 音频剪贴音频过度效果淡入 xff0c 淡出 xff0c 过度淡入淡出过度 工具按钮 音频轨道 xff08 不充内容 xff0c 可以
  • 实例:用C#.NET手把手教你做微信公众号开发(17)--公众号主动给粉丝发信息之模板消息

    前面讲了那么多 xff0c 都是微信用户主动向公众号发送信息或某个操作触发公众号响应并给予用户回复 如果在微信用户没有主动发起互动的情况下 xff0c 公众号应该如何向微信用户发送消息呢 xff1f 本篇给出一种解决方案 xff1a 模板消