.Net6+Furion+Sqlsugar+SenparcSdk开发微信公众号系列之十:模板消息
一、说明
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
关于使用规则,请注意:
- 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
- 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
- 在所选择行业的模板库中选用已有的模板进行调用;
- 每个账号可以同时使用25个模板。
- 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在 MP 登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号 MP 后台开发者中心页面中标明的数字为准。
关于接口文档,请注意:
- 模板消息调用时主要需要模板 ID 和模板中各参数的赋值内容;
- 模板中参数内容必须以".DATA"结尾,否则视为保留字;
- 模板保留符号""。
二、设置所属行业
Services下新建模板消息所需要的类
IndustryInput.cs用来设置行业ID接收的实体
namespace WeiXinApi.Application.Services
{
public class IndustryInput
{
/// <summary>
/// 行业代码1
/// </summary>
public IndustryCode Id1 { get; set; }
/// <summary>
/// 行业代码2
/// </summary>
public IndustryCode Id2 { get; set; }
}
}
TemplateService用来写API
namespace WeiXinApi.Application.Services
{
public class TemplateService : BaseService
{
}
}
新建设置行业id的api接口
/// <summary>
/// 设置行业Id
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/template/setindustry")]
public async Task<dynamic> SetIndustry(IndustryInput input)
{
return await TemplateApi.SetIndustryAsync(AppId, input.Id1, input.Id2);
}
测试一下,请求成功
三、获取设置的行业信息
新增获取行业信息接口
/// <summary>
/// 获取行业信息
/// </summary>
/// <returns></returns>
[HttpGet("/template/industry")]
public async Task<dynamic> GetIndustry()
{
return await TemplateApi.GetIndustryAsync(AppId);
}
测试下,可以正常显示
四、获取模板列表
测试账号接口新增一个模板
模板内容
{{first.DATA}} 商品名称:{{keyword1.DATA}} 消费金额: {{keyword2.DATA}} 购买时间:{{keyword3.DATA}} {{remark.DATA}}
新建获取模板接口
/// <summary>
/// 获取模板列表
/// </summary>
/// <returns></returns>
[HttpGet("/template/list")]
public async Task<dynamic> GetTemplate()
{
return await TemplateApi.GetPrivateTemplateAsync(AppId);
}
测试下,可以正常显示
五、删除模板
新建接口
/// <summary>
/// 删除模板
/// </summary>
/// <param name="template_id"></param>
/// <returns></returns>
[HttpPost("/template/delete/{template_id}")]
public async Task<dynamic> Delete(string template_id)
{
return await TemplateApi.DelPrivateTemplateAsync(AppId, template_id);
}
测试下,请求没问题
后台也没了
六、发送模板消息
Dto文件夹下新建TemplateInput.cs
namespace WeiXinApi.Application.Services
{
public class TemplateInput
{
/// <summary>
/// 模板ID
/// </summary>
public string TemplateId { get; set; }
/// <summary>
/// 开发者微信号
/// </summary>
public string OpenId { get; set; }
/// <summary>
/// 跳转链接
/// </summary>
public string Url { get; set; }
/// <summary>
/// 小程序信息
/// </summary>
public TemplateModel_MiniProgram MiniProgram { get; set; }
/// <summary>
/// 模板数据
/// </summary>
public TemplateData Data { get; set; }
}
public class TemplateData
{
/// <summary>
/// 跳转链接
/// </summary>
public TemplateDataInfo first { get; set; }
/// <summary>
/// 跳转链接
/// </summary>
public TemplateDataInfo keyword1 { get; set; }
/// <summary>
/// 跳转链接
/// </summary>
public TemplateDataInfo keyword2 { get; set; }
/// <summary>
/// 跳转链接
/// </summary>
public TemplateDataInfo keyword3 { get; set; }
/// <summary>
/// 跳转链接
/// </summary>
public TemplateDataInfo remark { get; set; }
}
public class TemplateDataInfo
{
/// <summary>
/// 值
/// </summary>
public string value { get; set; }
/// <summary>
/// 颜色
/// </summary>
public string color { get; set; } = "#173177";
}
}
新建发送模板消息接口
/// <summary>
/// 发送模板消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/template/send")]
public async Task<dynamic> Send(TemplateInput input)
{
var result = await TemplateApi.SendTemplateMessageAsync(AppId, input.OpenId, input.TemplateId, input.Url, input.Data, input.MiniProgram);
return result;
}
测试下,请求成功
微信也收到了消息
七、事件推送
IMessageService_Events.cs定义接口
/// <summary>
/// 模板发送事件
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
Task OnEvent_TemplateSendJobFinishRequestAsync(RequestMessageEvent_TemplateSendJobFinish requestMessage);
MessageService_Events实现接口
public async Task OnEvent_TemplateSendJobFinishRequestAsync(RequestMessageEvent_TemplateSendJobFinish requestMessage)
{
Console.WriteLine("进入模板事件推送");
Console.WriteLine($"发送结果:{requestMessage.Status}");
}
CustomMessageHandler_Events.cs重写模板发送事件
/// <summary>
/// 模板发送事件
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
public override async Task<IResponseMessageBase> OnEvent_TemplateSendJobFinishRequestAsync(RequestMessageEvent_TemplateSendJobFinish requestMessage)
{
await _messageService.OnEvent_TemplateSendJobFinishRequestAsync(requestMessage);
return await base.OnEvent_TemplateSendJobFinishRequestAsync(requestMessage);
}
发布大服务器,测试结果,没问题
八、本章Gitee地址链接
https://gitee.com/huguodong520/weixinapi/tree/%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF/
本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/16334346.html,欢迎加入qq群927460240学习讨论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!