公众号开发(4) —— 使用Senparc.Weixin SDK进行模板消息推送

news2024/11/24 6:50:30

微信公众号支持推送模板消息给特定用户,只要获取到公众号用户的openid向微信提供的接口发送post请求即可向特定用户推送模板消息,以下记录简单记录使用Senparc.Weixin SDK进行模板消息推送的过程。

1 模板消息建立

在微信公众号测试账号中添加如下消息模板:

{{first.DATA}} 
商品名称:{{product.DATA}}
商品价格:{{price.DATA}} 
购买时间:{{remark.DATA}} 
{{remark.DATA}}

在这里插入图片描述
添加成功后就可以获取到模板ID,向用户推送模板消息时需要用到该模板ID。
在这里插入图片描述

2 使用C#推送模板消息

后台程序在公众号开发(2) —— 盛派.net SDK + vue搭建微信公众号网页开发框架基础上进行了简单修改:
(1)首先在WeixinController建立模板消息对应的实体类:

    /// <summary>  
    /// 定义模版中的字段属性(需与微信模版中的一致)  
    /// </summary>  
    public class ProductTemplateData
    {
        public TemplateDataItem first { get; set; }
        public TemplateDataItem product { get; set; }
        public TemplateDataItem price { get; set; }
        public TemplateDataItem time { get; set; }
        public TemplateDataItem remark { get; set; }
    }

(2)在WeixinController添加一个SendMsg,SendMsg根据openId和模板消息ID将固定模板消息推送给特定用户,模板里的值有value和color两个,指的是keyword.DATA的内容和文字颜色。

       /// <summary>
        /// 根据公众号用户openid推送模板消息给特定用户
        /// </summary>
        private bool SendMsg(string openId) 
        {
            string templateId = "AxOpX0kPwguD1eOKyOitBgxtUbqlWI5Zw17v8Xw2Wb8";   //模版id  
            string linkUrl = "http://www.baidu.com";    //点击详情后跳转后的链接地址,为空则不跳转  
            //根据appId判断获取    
            if (!AccessTokenContainer.CheckRegistered(AppId))    //检查是否已经注册    
            {
                AccessTokenContainer.RegisterAsync(AppId, AppSecret);    //如果没有注册则进行注册    
            }
            string accessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret).access_token;  //获取AccessToken值

            //为模版中的各属性赋值  
            var templateData = new ProductTemplateData()
            {
                first = new TemplateDataItem("您好,您的订单已支付成功!", "#173177"),
                product = new TemplateDataItem("旺旺大礼包", "#173177"),
                price = new TemplateDataItem("99.8元", "#173177"),
                time = new TemplateDataItem("2016-11-09 16:50:38", "#173177"),
                remark = new TemplateDataItem("感谢您的光临~", "#173177")
            };
            SendTemplateMessageResult sendResult = TemplateApi.SendTemplateMessage(accessToken, openId, templateId, linkUrl, templateData);
            //发送成功  
            if (sendResult.errcode.ToString() == "请求成功")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

(3)修改之前的GetOpenId这个api,获取到用户openId后再调用SendMsg发送一个模板消息给用户,发送成功后会返回"send msg OK"给前端:

     /// <summary>
        /// 根据code获取微信公众号用户openid
        /// </summary>
        [HttpGet]
        [Route("GetOpenId/")]
        public ActionResult GetOpenId(string code)
        {
            string retString = "";
            string accessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret).access_token;  //获取AccessToken值
            OAuthAccessTokenResult result = null;
            result = OAuthApi.GetAccessToken(AppId, AppSecret, code);
            if (SendMsg(result.openid))
            {
                retString = "send msg OK";
            }
            else {
                retString = "send msg Fail";
            }
            return Content(retString);
        }

(4)选择前端授权登录后发送一条模板消息给用户:

  created () {
    // 从 window.location.href 中截取 code
    let code = this.getUrlCode().code;

    if (code) {
      console.log('code', code);
      //code已存在,使用code通过后端获取Openid
      let url = 'http://192.168.1.4/api/WeiXin/GetOpenId'
      axios.get(url, {
        params: {
          code: code,
        }
      })
        .then((res) => {
          console.log('openid', res.data);
        })
        .catch((error) => {
          alert(error);
        });
    } else {
      //code不存在,调用维修接口获取code
      this.getCodeApi();
    }
  },

微信web 开发者工具中打开vue项目地址,授权登录后可以看到"send msg OK":
在这里插入图片描述

打开关注的测试公众号,可以看到推送的这条模板消息:
在这里插入图片描述

3 参考

1 https://blog.csdn.net/a816120/article/details/107233868/
2 https://www.jianshu.com/p/9d77e6d0ebb8
3 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

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

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

相关文章

数据结构之排序【冒泡排序和快速排序之一的实现及分析】内含动态演示图

引言&#xff1a; 今天分享一下一点小事迹&#xff0c;自从从学校回到家里&#xff0c;我已经好久没睡上一个好觉了&#xff0c;因为真的冷&#xff0c;莫名被窝总是感觉很冷&#xff0c;然后穿着袜袜的脚也是冰凉&#xff0c;所以每次早晨要起床的时候总是感觉非常的冷&#…

shell基础使用

一、hello world 首先建立一个tmux vim test.sh //再创建一个test.sh文件 进入文件后&#xff0c;创建一个如下命令&#xff0c;指明bash为脚本解释器 #! /bin/bash //相当与c头文件echo "hello world"运行方式 1.作为可执行文件 acs9e0ebfcd82d7:~$ chmod x test.s…

我是如何将2千万StackOverflow问答翻译成中文的?

大家好&#xff01;大家觉得如果需要翻译SO上全部问答可以怎么做呢&#xff1f;我讲讲我是怎么的&#xff0c;大家看看做得怎么样。 自我介绍 我是一名有10年开发经验的老程序员。做过大数据&#xff0c;做过Java程序员&#xff0c;也做过算法工程师&#xff0c;目前是一名大厂…

Spring Security的项目中集成JWT Token令牌安全访问后台API

Spring Security的项目中集成JWT Token令牌安全访问后台API引言JWT 简介jwt token 的适用场景jwt 的结构完整jwtjwt 的使用方式客户端获取jwt令牌访问受保护资源的具体流程Spring Security 安全框架下使用jwt token新建一个spring boot项目加入spring security 和 jwt 相关依赖…

五、传输层(二)UDP

目录 2.1 UDP概述 2.2 UDP的首部格式 2.3 UDP校验 2.1 UDP概述 UDP无须建立连接。因此不会引入建立连接的时延。 UDP为无连接状态。因此当服务器使用UDP时&#xff0c;一般能支持更多的活动客户机。 UDP分组首部仅有8B的开销&#xff0c;而TCP有20B的首部开销。 应用层…

后端思维篇:如何抽个上报模板

前言 大家好&#xff0c;我是田螺。 我的后端思维专栏好久没更新啦&#xff0c;本文是后端思维专栏的第六篇哈。我的整个后端思维专栏都是跟日常工作相关的哈。 最近刚好优化了安全上报这块的代码&#xff0c;抽了一个基础模板&#xff0c;看起来挺优雅的。所以今天手把手教…

〖产品思维训练白宝书 - 产品思维认知篇⑤〗- 学习 [产品思维] 需要做哪些准备?

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

php wampserver的使用配置

php wampserver的使用配置wampserver1.php时区配置2.修改apache服务器端口号3.设置起始页4.设置web服务器主目录5.设置虚拟目录wampserver WampServer是Windows Apache Mysql PHP集成安装环境&#xff0c;在Windows操作系统下的apache、php和mysql的服务器软件。 1.php时区配…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.2 Consumer Ack

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.2 Consumer Ack7.2.1 Consumer Ack7.2.2 Consumer Ack 小结7.2.3 消息可靠性总结第二天 高级 7 RabbitMQ 高级特性 7.2 Consumer Ack 7.2.…

12.25日周报

周报 代码行数&#xff1a; 周一 704 周二 481 周三 571 周四 589 周五 595 周六 520 周日 537 遇到的问题&#xff1a; 没用过的方法AtomicInteger Insert Proto currentTimeMillis RequestParam BufferedReader UriComponents RestTemplate OSS 不清楚在…

公众号开发(2) —— 盛派.net SDK + vue搭建微信公众号网页开发框架

需求&#xff1a;通过微信公众号菜单跳转到手机端网页&#xff0c;跳转后通过微信授权登录获取微信公众号用户的OpenId&#xff08;用户关注公众号后&#xff0c;用户在公众号的唯一凭证&#xff09;&#xff0c;通过OpenId和后台数据库用户信息绑定起来并实现一些业务逻辑。 技…

基于51单片机的电子闹钟设计

使用的单片机是 STC89C52 此设计可以 年 月 日 时 分 秒显示和闹钟功能 能通过8个按键自由调整 时 分 秒 闹钟响铃时间 带复位按键&#xff0c;要是模块抽风&#xff0c;摁复位按键即可&#xff01; 使用 LCD16020A 屏幕显示 屏幕电路设有电位器&#xff…

Tableau可视化设计案例-07 多边形地图和背景图地图

Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔记&#xff0c;B站视频 参考&#xff1a;https://www.bilibili.com/video/BV1E4411B7ef 参考&#xff1a;https://blog.csdn.net/lianjiabin/category_9826951.html 数据下载地址为&#xff1a;https://do…

Java项目:springboot药品管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目属于前后端分离的项目&#xff0c;分为两个角色药品管理员和取药处人员 药品管理员&#xff1a; 登录、退出、药品信息录入、药厂信息录入…

Huawei Certified ICT Professional work (一)

文章目录一&#xff0c; 要求二&#xff0c;搭建拓扑图三&#xff0c;配置接口IP和环回IP四&#xff0c;进行RIP版本的配置并且宣告网段五&#xff0c;实现不同版本的连通&#xff0c;在交界处配置对端的版本号六&#xff0c;R3访问R7的环回地址走R5&#xff0c;改变R4的度量值…

Java项目:SpringBoot+MyBatis送水公司管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 这个项目是一个基于SpringBootMyBatis的送水公司管理系统 管理员权限包括&#xff1a; 客户管理 送水工管理 送水历史管理 计算工资 统计送水数…

79页智慧应急指挥平台1 6 N体系建设方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 行业专网解决…

ARM_SMMU_下

SMMU驱动代码分析 本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本是linux 5.7, 体系结构是aarch64 SMMU的作用是把CPU提交给设备的VA地址&#xff0c;直接作为设备发出的地址&#xff0c;变成正确的物理地址&#xff0c;访问到物理内…

五、传输层(一)传输层的功能

目录 1.1传输层的主要功能 1.2传输层的寻址与端口 1.2.1端口的作用 1.2.2端口号 1.2.3套接字 1.3无连接服务与面向连接服务 1.1传输层的主要功能 物理层、数据链路层和网络层共同解决了主机通过异构网络互联起来所面临的问题&#xff0c;实现了主机到主机的通信。然而在…

【iOS】CAlayer的认识与使用

什么是CALayer CALayer是UIView里的一个图层&#xff0c;其主要功能是负责显示视图与动画。CALayer和UIView 功能是一致的、 不过因为其 更加底层 所以 CALayer 有一些接口、 UIView 里面没有。 CALayer与UIView UIView&#xff1a;用于管理视图的容器。每次创建UIView对象时…