uniapp微信小程序消息订阅快速上手

news2024/11/19 13:18:35

一、微信公众平台小程序开通消息订阅并设置模板

在这里插入图片描述

这边的模板id和详细内容后续前后端需要使用

二、uniapp前端

需要是一个button触发
js:

wx.getSetting({
	success(res){
		console.log(res)
		if(res.authSetting['scope.subscribeMessage']){
			// 业务逻辑
		}else{
			uni.requestSubscribeMessage({
			  tmplIds: [_config.TEMPLATE_ID],
			  success (res) {
				  console.log("订阅成功!")
				  // 业务逻辑
			  },
			  fail(res) {
			     // 即使用户拒绝订阅也要继续原来的业务逻辑
			  }
			})
		}
	}
})

三、java后端

@Component
@Slf4j
public class WxAccessTokenUtil {
    @Value("${WX_APPID}")
    String APP_ID;
    @Value("${WX_SECREAT}")
    String SECREAT;
    @Value("${WX_TEMPLATE_ID}")
    String TEMPLATE_ID;

    public String getWxAccessToken(){
        String res = HttpClient.doGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APP_ID+"&secret="+SECREAT);
        JSONObject jsonObject = JSON.parseObject(res);
        return jsonObject.getString("access_token");
    }


    public void sendReservationSubscribeMsg(String touser,String id,String apparatusName,String state){
        String token = getWxAccessToken();
        JSONObject jsonObject2 = new JSONObject();
        jsonObject2.put("access_token",token);
        jsonObject2.put("touser",touser);
        jsonObject2.put("template_id",TEMPLATE_ID);
        jsonObject2.put("page","/pages/appointment_detail/appointment_detail?id="+id);
        JSONObject data = new JSONObject();
        JSONObject thing2 = new JSONObject();
        thing2.put("value",apparatusName);
        data.put("thing2",thing2);
        JSONObject phrase3 = new JSONObject();
        phrase3.put("value",state);
        data.put("phrase3",phrase3);
        jsonObject2.put("data",data);
        String res = HttpClient.doPost("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+token,jsonObject2.toString());

        log.warn("微信小程序订阅消息:{}",res);
    }
}

其中thing2、phrase3是模板的字段名,根据自己模板去修改即可

HttpClient.java

public class HttpClient {

    public static void main(String[] args) {
        String APP_ID = "xxx";
        String SECREAT = "xxx";
        String res = HttpClient.doGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APP_ID+"&secret="+SECREAT);
        com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(res);
        String token = jsonObject.getString("access_token");

        JSONObject jsonObject2 = new JSONObject();

        jsonObject2.put("access_token",token);
        jsonObject2.put("touser","xxxxx");
        jsonObject2.put("template_id","xxxx");
        jsonObject2.put("page","/pages/tabbar/mine/mine");
        JSONObject data = new JSONObject();
        JSONObject phrase1 = new JSONObject();
        phrase1.put("value","待审核");
        data.put("phrase1",phrase1);
        JSONObject thing2 = new JSONObject();
        thing2.put("value","已成功提交预约申请,请耐心等待审核。");
        data.put("thing2",thing2);
        jsonObject2.put("data",data);
        jsonObject2.put("miniprogram_state","trial");
        System.out.println(HttpClient.doPost("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+token,jsonObject2.toString()));


    }

    public static String doGet(String httpurl) {
        HttpURLConnection connection = null;
        InputStream is = null;
        BufferedReader br = null;
        String result = null;// 返回结果字符串
        try {
            // 创建远程url连接对象
            URL url = new URL(httpurl);
            // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接方式:get
            connection.setRequestMethod("GET");
            // 设置连接主机服务器的超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取远程返回的数据时间:60000毫秒
            connection.setReadTimeout(60000);
            // 发送请求
            connection.connect();
            // 通过connection连接,获取输入流
            if (connection.getResponseCode() == 200) {
                is = connection.getInputStream();
                // 封装输入流is,并指定字符集
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                // 存放数据
                StringBuffer sbf = new StringBuffer();
                String temp = null;
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            connection.disconnect();// 关闭远程连接
        }

        return result;
    }

    public static String doPost(String httpUrl, String param) {

        HttpURLConnection connection = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        String result = null;
        try {
            URL url = new URL(httpUrl);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取主机服务器返回数据超时时间:60000毫秒
            connection.setReadTimeout(60000);

            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
            connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
            // 通过连接对象获取一个输出流
            os = connection.getOutputStream();
            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
            os.write(param.getBytes());
            // 通过连接对象获取一个输入流,向远程读取
            if (connection.getResponseCode() == 200) {

                is = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

                StringBuffer sbf = new StringBuffer();
                String temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 断开与远程地址url的连接
            connection.disconnect();
        }
        return result;
    }
}

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

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

相关文章

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念: 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程 2.自动化测试分类: 一般IT上所说的自动化测试是指功能自动化测试,通过编码的方式用一段程序来测试一个软件的功…

Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

Ctfshow 命令执行 web29 pregmatch是正则匹配函数,匹配是否包含flag,if(!preg_match("/flag/i", $c)),/i忽略大小写 可以利用system来间接执行系统命令 flag采用f*绕过,或者mv fl?g.php 1.txt修改文件名&#xff0c…

初识Visual Basic编辑器并建立一段简单的代码(下)

【分享成果,随喜正能量】时间宝贵,切莫贪睡。学习诸大菩萨的精神,勇猛精进不懈怠;随缘进取不疲厌。单是说不行,要紧的是做。 《VBA之Excel应用》(10178983)是非常经典的,是我推出的…

【运维】linkis1.3.2添加jdbc引擎(添加mysql、greenplum、starrocks、doris数据源查询)与配合多数据源管理提交任务初探

文章目录 一. 引擎的安装1. 前置工作2. 获取引擎插件3. 上传和加载4. 引擎刷新4.1. 重启刷新4.2. 检查引擎是否刷新成功 二. 测试mysql、starrocks与doris数据库1. 通过shell提交任务2. 通过(IDE)shell进行提交3. 通过接口提交 三. 添加greenplum四. 通过linkis的数据源管理提交…

【java毕业设计】基于SSM+MySql的人才公寓管理系统设计与实现(程序源码)--人才公寓管理系统

基于SSMMySql的人才公寓管理系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于SSMMySql的人才公寓管理系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业…

VGG简单学习

VGG简单学习 简单介绍 在AlexNet网络的基础上,为了设计深层神经网络,牛津大学设计了VGG网络,采用块的设计理念,将AlexNet中多个重复的卷积层和池化层组成一个块 论文中,使用3x3卷积核,padding1的卷积层 和带有2x2的汇…

网工内推 | 网络工程师专场,CCNP证书优先,多次晋升机会

01 上海正诺信息科技有限公司 招聘岗位:网络工程师 职责描述: 1、负责公司办公内网内网需求对接、实施和方案的标准化; 2、负责办公网络、机房的网络设备(接入层)的运维、变更、故障解决; 3、负责公司网…

网络通信原理ARP协议(第四十六课)

ARP/RARP报文 ARP(Address Resolution Protocol,地址解析协议)是用来将IP地址解析为MAC地址的协议。RARP(Reverse Address Resolution Protocol,反向地址解析协议)是用来将MAC地址解析为IP地址的协议。 字段长度(bit)含义Ethernet Address of Destination48比特目的…

【GitHub】Pycharm本地项目打包上传到Github仓库的操作步骤

文章目录 1、Pycharm端的设置操作2、Github端的设置操作3、Pycharm上配置Github4、Git本地项目至GitHub仓库5、前往Github中查看确认6、常见报错 1、Pycharm端的设置操作 通过CtrlAltS快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,…

【视频笔记】2023年上半年最耀眼的AI创业公司

大模型赛道: OpenAI(估值270-290亿美元):继续融资3亿美元 Anthropic(估值50亿美元):绑定谷歌、免费开放Claude2 Adept(估值10亿美元):推出ACT-1模型&#xf…

Navicat Premium连接sqlserve数据库失败?你需要注意这几点看看配置对了么?

新建数据库连接的时候这么填的信息 报错 原因1:sqlserver数据库的端口和IP地址之间不是:连接而是用,连接 改成如下样式用逗号连接端口和IP地址就好了 原因2:在Navicat Premium中需要安装一个sqlserver的插件 找到安装路径的根目…

2023年Android性能优化常见30道面试题解

在Android开发领域,性能优化是一个关键而广泛讨论的话题。对于任何一位Android开发者而言,了解和掌握性能优化的技巧是至关重要的。无论是在开发过程中还是在面试环节中,掌握Android性能优化的知识都能展示出你作为一名优秀开发者的能力。 本…

机器学习需要面对的两大问题:泛化性和可信性

随着人工智能的迅速发展,机器学习成为了炙手可热的领域,它让计算机能够从数据中学习并做出智能决策。然而,机器学习在取得巨大成功的同时,也面临着两个重大挑战:泛化性和可信性。这两大问题的解决关系到机器学习应用的…

驱动开发day3

#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include<linux/io.h> #include <linux/device.h> #include "led.h"int major; char kbuf[256] {0};//定义指针接收映射…

【HarmonyOS北向开发】-01 HarmonyOS概述

飞书原文链接-【HarmonyOS北向开发】-01 HarmonyOS概述https://fvcs2dhq8qs.feishu.cn/docx/TDf2d2KMaoPSUUxnvg2cASDdnCe?fromfrom_copylink

k8s 自身原理之高可用

说到高可用&#xff0c;咱们在使用主机环境的时候&#xff08;非 k8s&#xff09;&#xff0c;咱做高可用有使用过这样的方式&#xff1a; 服务器做主备部署&#xff0c;当主节点和备节点同时存活的时候&#xff0c;只有主节点对外提供服务&#xff0c;备节点就等着主节点挂了…

Typora上传文件到Gitee

工作内容,不对外开放 一、Typora上传笔记到CSDN 一、安装node.js 官网链接:Node.js (nodejs.org) 下载后得到一个.msi文件,双击即可。 win + R 打开CMD,基于node -v 和npm -v,验证是否安装成功: 二、配置Gitee 1、新建仓库 2、开源此仓库 2.1、初始化readme文件

测试微信个人收款,实现静态博客文章付费和及时显示

1. 个人微信收款&#xff0c;不需要微信认证&#xff0c;这里通过赞赏码 2. hugo实现静态博客&#xff0c;付费功能是需要服务器动态实现的&#xff0c;可通过第三方实现 3. 通过javascript调用服务器&#xff0c;实现付费后即时显示&#xff0c;以及页面显示付费网友信息&am…

股市杠杆操作是什么意思?期货杠杆平台指的是什么?

在股市和期货市场中&#xff0c;杠杆操作是一种常见的投资手段。然而&#xff0c;许多人对于杠杆操作的概念和风险并不清楚。本文将科普股市杠杆操作和期货杠杆平台的相关知识&#xff0c;帮助读者了解其意义和特点。 一、股市杠杆操作的含义 股市杠杆操作是指通过借入资金股票…

EDA软件—Cadence学习笔记分享(内含安装教程)

作为流行的EDA工具之一&#xff0c;Cadence一直以来以其强大的功能受到广大EDA工程师的青睐。Cadence可以完成整个IC设计流程的各个方面。 Cadence 软件是一个功能强大的系统工具&#xff0c;包括很多功能模块&#xff0c;如原理图输入: 数字、模拟及混合电路仿真:自动布局、布…