.NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)

640?wx_fmt=gif

基于上一篇文件“.NET Core 小程序开发零基础系列(1)——开发者启用并校验牵手成功”的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题,后面我也会通过实战性文章慢慢的表现出来 ,让大家更容易吃得透一些。在这里特别感谢盛派Senparc作者的支持,也感谢各社区大佬的支持,同时也要感谢我的6位小伙伴大力支持,我们将有问必答,资源共享。

为什么说盛派Senparc开源框架开发贼快呢,因为他们经过多年的打磨,反反复复的修改升级,基本上所有公众号的功能都支持,但发现还是有很多的同学不明白原理与底层框架的设计,在这里我们将通过真实的实战项目来一点点吃掉。

废话不多说了,开始我们的实战第二篇,玩得好 模板消息可突破限制哦,袖子撸起来,干 ^_^

1

了解一下模板消息

基于微信的通知渠道,我们为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验。

模板推送位置:服务通知

模板下发条件:用户本人在微信体系内与页面有交互行为后触发,详见 下发条件说明 

模板跳转能力:点击查看详情仅能跳转下发模板的该帐号的各个页面

640?wx_fmt=png

效果如图:

640?wx_fmt=png

更多的规则请查看官方文档

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html

附加经验说明:

如果你公司有运营人员,一定会非常的喜欢服务通知,它能很快的引流到服务号,小程序中来,激活当前的用户。借助微信的服务通知,必能触达到关注过,授权过服务号,小程序的人,是不是很棒。

场景:比如说用户使用某个小程序发布了一个百人报名活动。如果能实现有一个人报名,就向活动发起者发送一条报名通知,那就大大提高了工具的使用效率,不用发起人每次都打开小程序去看有多少人参与了报名。显然,当前的消息发送机制无法满足这个需求。

模板有很多种咯,每个行业的模板也不一样,比如我们电商系统需要的模板“订单支付成功通知”、“订单支付失败通知”、“预约成功通知”、“订单发货通知”、“用户认证通知”等等模板。

2

创建你想要的模板/设置模板

登录小程序后台,点击左侧“模板消息”,如图:

640?wx_fmt=png

默认“我的模板库”是没有模板的,需要进入到“模板库”中进行创建, 模板库中的模板非常多,建议搜索你想要的模板,如图:

640?wx_fmt=png

选择对应的模板,点击选用,如图:

640?wx_fmt=png

注意:这里添加的“关键词”顺序要严格按照我们后台列出来的顺序去选择排列,否则会出现数据错乱的问题。

以上基本是了解模板,配置模板,下面我们真正来发送模板啦!

3

收集formId(突破模板消息的推送限制?)

这里为什么要收集formId呢,因为小程序发送模板必须要对应人的formId来发送,不然你是发送不成功的。

formId收集方法,我们直接讲复杂的收集,突破模板消息的推送限制。

流程

结合小程序前端界面实现批量收集formId==》上报后台==》存储formId==》发送模板,最终做到7日内推送模板消息、触及用户激活用户。

实现步骤

1、小程序构建formId 池,每次将用户提交的表单都搜集起来存入formId池,当用户操作前端某个位置或者离开挂起小程序时,发送formIds到后端存储起来。

2、将小程序用户有可能点击的区域覆盖一层不可见的button,并将整个页面用于传输formId的button包裹在一form标签内,一旦用户有点击按钮的操作,就将获取到的formId存入formId 池。

上小程序部分代码

1、先定义一个formId数组

640?wx_fmt=png

2、小程序页面定义事件

640?wx_fmt=png

3、提交事件

640?wx_fmt=png

4、提交到后台,批量收集formId

640?wx_fmt=png

以上基本是收集formId的流程,有不懂原理与实现步骤的可以联系我。

4

发送模板消息(服务通知)

还是上一篇那个项目,如图:

640?wx_fmt=png

引用盛派Senparc组件:

Senparc.Weixin.MP.MVC

Senparc.Weixin.WxOpen

批量发送模板主要代码:

HashEntry[] hashes = redisManager2.HashValueAll(videoKey);	
if (hashes.Length > 0)	
{	Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播间{videoKey},准备推送人数{hashes.Length},videoKey={videoKey},videoKeywords={videoKeywords}");	foreach (var item in hashes)	{	//{"WorkQueueNo":"wxccf5524125d67d16","TemplateID":"KgI11LMjGCUmvrfOPG5xHdfW2j70tJKNurfrtAFn9sk","Keywords":"2019-08-25 21:54:00|安|fffd|快来我的直播间,约起!","Url":"pages/live/liveRoom/liveRoom?id=1164536425702625280","ToOpenID":"o5D-a5QpNoC_0QYF5C-zFbmkgr4Q","ToMemberID":1053}	WorkQueueParam valueItem =  DMS.Common.Extensions.SerializerExtensions.DeserializeObject<WorkQueueParam>(item.Value);	if (valueItem != null)	{	//查找小程序的fromid	string key =  $"{valueItem.ToMemberID}_{valueItem.WorkQueueNo}";	string fromid = redisManager3.ListLeftPop<string>(key);	if (!string.IsNullOrEmpty(fromid))	{	string[] keywords = videoKeywords.Split("|");	var data = new	{	keyword1 = new TemplateDataItem(keywords[0]),	keyword2 = new TemplateDataItem(keywords[1]),	keyword3 = keywords.Length > 2 ? new  TemplateDataItem(keywords[2]) : null,	keyword4 = keywords.Length > 3 ? new  TemplateDataItem(keywords[3]) : null,	};	var tempResult =  Senparc.Weixin.WxOpen.AdvancedAPIs.Template.TemplateApi.SendTemplateMessage(valueItem.WorkQueueNo, valueItem.ToOpenID, valueItem.TemplateID, data, fromid,  videoUrl);	if (tempResult.errcode == ReturnCode.请求成功)	{	Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播间{videoKey},发送成功,{valueItem.ToMemberID}");	}	else	{	Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播间{videoKey},发送失败,{tempResult.errmsg}");	}	}	else	{	Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播间{videoKey},获取FromID为空,{valueItem.ToMemberID}");	}	}	else	{	Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播间{videoKey},模板内容序列哈异常");	}	}	
}	
else	
{	Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播间{videoKey},未找到直播间数据");	
}

这里的场景是这样的:比如一个主播她创建了一个房间,设定开播的时间为某一天,为了给自己引流,他在微信群分享了小程序,这时只要有人点击了小程序链接点击预约就会记录与主播的关联,等到主播开播时,会群发下面预约的用户。是不是有点像群发功能,哈哈,大家有空可能尝试一下。

注:这里利用了redis来存储fromid,你们也可以用其它的方式来存储,随便你来玩。

5

总结

人个觉得代码实现需求的过程并不复杂,主要是理解了原理与实现的过程后,就事半功倍。整个方案流程涉及到的关键词有表单、按钮、formId、模板消息、Redis等,主要需要前后端相关技术组合来实现整个方案。

相关推荐

推荐文章

  • .NET Core 小程序开发零基础系列(1)——开发者启用并牵手成功

  • .net core redis的全套操作

  • .NETCore 实现容器化Docker与私有镜像仓库管理

  • .netcore consul实现服务注册与发现(一)单机部署

  • .netcore consul实现服务注册与发现(二)集群完整版

640?wx_fmt=jpeg

dotNET名人堂,主要分享.NET core各种技术文章,以及架构设计,管理技巧等干货,希望在这里通过实战能让你全新认识.NET core相关技术,项目架构,大数据处理,高并发,高耦合相关问题欢迎留言与我探讨。

作者微信ID:tangguo_9669

640?wx_fmt=jpeg

640?wx_fmt=png

你点的每个赞,我都认真当成了喜欢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java工程师修炼之路

文章来自于微信公众号:Hollis,作者网站:https://www.hollischuang.com/ 转载过来方便查看 1 基础篇 01 面向对象 → 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 …

P4900 食堂(数学式子推导)

P4900 食堂 推导 ans∑i1n∑j1iij−∑i1n∑j1i⌊ij⌋前项为∑i1ni∑j1iinv(j),两次前缀和即可得到后项为∑i1n∑j1i⌊ij⌋∑i1n∑j1id(j),nloglogn2n即可得到ans \sum_{i 1} ^{n} \sum_{j 1} ^ {i} \frac{i}{j} - \sum_{i 1} ^{n} \sum_{j 1} ^{i} \lfloor\frac{i}{j} \r…

[PowerShell]人人都值得学一点PowerShell实现自动化(2)有哪些可用的场景及方式?

部分读者反应太多知识要学了,学完一轮又一轮,笔者也不想单单为了制造学习而学习,所有Excel催化剂所发布的内容,都是笔者所亲自使用到的,当然很多领域也没有深挖到很底的程度。PowerShell使用场景虽然说PowerShell也是在…

[2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)

[2021.1.31多校省选模拟12]随机变换的子串 对于这三种操作,我们惊奇地发现有这样的性质,所有长度大于4的字符串都可以通过变换变为长度小于等于4的字符串,那么查询本质不同的字符串我们只需要处理12种字符串的出现次数即可。 然后对于区间所…

GG and MM(every sg 游戏)

GG and MM 结论 题意: 每组给n个游戏,每个游戏有两堆石头,GG和MM轮流操作,操作规则: 从两堆里面选出一堆,假设这堆石头有x个,然后在另一堆里取k*x个石头(k是正整数) 谁不能取石头谁输&…

[2021.1.13多校省选模拟2]T1(动态规划/轮廓线dp)

[2021.1.13多校省选模拟2]T1 一个经典的轮廓线dp,可以发现一定可以找到一条轮廓将这个图形分开,然后使得左半部分由左边处理,右半部分由右边处理,然后我们只需要处理这个折线即可,具体实现需要处理前缀和的前缀最大值&…

[PowerShell]人人都值得学一点PowerShell实现自动化(1)在VisualStudio上使用PowerShell...

最近学PowerShell的知识比较多,也开始有一点点可以分享的知识给大家输出,学一门语言,理当首先找准一个好用的IDE来帮助我们提高学习效率,本文给大家介绍如何在宇宙第一的IDE-Visual Studio上写PowerShell脚本。关于PowerShell的基…

2019-02-21-算法-进化

论代码能力: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的…

E. Jamie and Tree(树链剖分 + 线段树)

E. Jamie and Tree 思路 直接rootvroot vrootv; 找lcalcalca,lcalca(root,u),lca(root,v),lca(u,v)lca {lca(root, u), lca(root, v), lca(u, v)}lcalca(root,u),lca(root,v),lca(u,v)中depdepdep最深的: rootrootroot不在lcalcalca的子树…

[2021.1.17多校省选模拟4]T1(莫比乌斯反演/组合数学/枚举倍数)

[2021.1.17多校省选模拟4]T1 一般人都会想着去枚举直线的斜率,但是枚举斜率之后就会产生多条直线,并且这些直线的长度不一,难以快速求解,所以我们考虑换一种方法枚举。 枚举最远点对的横纵坐标之差,这样很容易计算这…

程序员35岁不转型就退休,是真的吗?

周六下午,DevOps群里,有人贴出来这么一张图:据说,这张图来自于谷歌,Google程序员之间存在这一条鄙视链,站在顶端的是C工程师,其次是Java工程师,再次是Python工程师,接下来…

Java修炼之路——基础篇——平台无关性

Java如何实现平台无关性? 首先说无论是哪种语言,都需要经过操作系统和CPU来完成程序的运行。平台无关性指的是程序不会因为操作系统和处理器的不同而不能运行或者发生运行错误。而不同的CPU和OS组成的平台的机器指令是不同的。 C\C等语言,需…

.net测试篇之Moq框架简单使用

Moq简介Moq是.net平台下的一个非常流行的模拟库,只要有一个接口它就可以动态生成一个对象,底层使用的是Castle的动态代理功能.它的流行赖于依赖注入模式的兴起,现在越来越多的分层架构使用依赖注入的方式来解耦层与层之间的关系.最为常见的是数据层和业务逻辑层之间的依赖注入,…

LibreOJ #6207. 米缇(杜教筛 + 拉格朗日插值)

#6207. 米缇 推式子 ∑i1n∑j1ndK(ij)∑i1n∑j1n∑x∣i∑y∣j[gcd(x,y)1]ixkyk∑i1n∑j1n∑x∣i∑y∣j∑d∣gcd(x,y)μ(d)ixkyk∑d1nμ(d)dk∑i1nd∑x∣iixk∑j1nd∑y∣iyk∑d1nμ(d)dk∑i1nd∑x∣ixk∑j1nd∑y∣iyk∑d1nμ(d)dk(∑i1nd∑x∣ixk)2∑d1nμ(d)dk(∑x1ndxk∑x∣i…

Java修炼之路——基础篇——值传递

什么是值传递?引用传递? 值传递:值传递是将变量的一个副本传递到方法中,方法中如何操作该副本,都不会影响原变量的值。引用传递:引用传递是将变量的地址传递到方法中,方法中操作该变量&#xf…

A. 树与路径(树论/多项式/分治FFT)

A. 树与路径 首先考虑一个dp的方法,对于这种链划分的题目,有一个很重要的思想就是按照每个点的角度考虑,实际上链划分就是匹配问题,每个点只能出一条边和入一条边,所以我们拆点之后就是匹配,这也是网络流最…

.NET Core on K8S学习实践系列文章索引(持续更新)

近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个2019年的flag:完成这个《.NET Core on K8S学习实践》系列文章!这个系列会持续更新,先发个草稿列表,后续更新&a…

Java修炼之路——基础篇——数据类型

基础数据类型: 整型(byte short int long )、浮点型、布尔型、字符型boolean:只表示一位的信息,true,false。默认为false,基本上占一字节char: 16位,2字节,Java内部使用Unicode字符集最小值是’…

dft + fft(模板)

dft(多项式相乘模板) /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>using namespace std;const double pi acos(-1.0);const int N 3e6 10;struct Complex {double r, i;Complex(double _r 0, double _i 0) : …

P4245 【模板】任意模数多项式乘法

P4245 【模板】任意模数多项式乘法 https://www.luogu.com.cn/blog/AzusaCat/solution-p4245 首先这类问题指的是对于一个非NTT模数&#xff0c;我们如何计算多项式乘法&#xff0c;对于NTT不容易找到单位根&#xff0c;对于FFT又会爆精度。 方法1&#xff1a;三模数NTT 寻找…