公众号一次性订阅消息

2023-10-29

洛塔服务号回复007获取代码。

功能说明

之前发布通知,要用订阅通知替代一次性订阅消息,不知道是被骂的太惨还是技术原因,一次性订阅消息还是一直能用。

和模板消息不同的是,一次性订阅消息无需用户关注公众号,但是必须用户点击同意发送才能接收消息。

  • 模板消息:需要关注公众号,无需用户同意也可发送
  • 一次性订阅消息:无需关注公众号,需要用户同意才能发送
    如果用户关注了公众号,那么消息就在公众号里发送。如果没有关系,消息就在服务通知里。

准备工作

  • 公众号后台设置ip白名单
    位置:设置与开发–>基本配置,右侧IP白名单
    将域名能够访问的服务器ip地址添加进去

  • 获取模板id
    此处的模板id和模板消息的完全不同,每个公众号都有固定值。
    模板Id位置:设置与开发–>接口权限,右侧一次性订阅消息,点击查看模板id

  • 设置业务域名
    设置位置:设置与开发–>公众号设置–>右侧功能设置,点击 业务域名 后面的设置。
    此处需要下载文件,然后部署到服务器访问根目录中,即可成功保存。可以直接用nginx或者tomcat的ROOT中,80端口访问。

生成授权链接

我最终的授权链接是:https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=wx276049d6a7551dca&scene=1000&template_id=FHIXqn7zsGh_CECK7oIfKAVdQFHzAInncglc6wctAWg&redirect_url=http://test.lootaa.com/lootaa-wechat/wx7&reserved=lootaatest7#wechat_redirect

各个参数含义

  • action:固定值,用get_confirm
  • appid:公众号的appid
  • scene:场景值,0-10000任一数值,相同场景多次订阅就算一次
  • template_id:上面刚刚写到的获取模板Id
  • redirect_url:对应后台接收订阅跳转的路径,下面会介绍。必须是业务域名+后缀
  • reserved:防攻击用的,会原样返回给上面的路径中
  • wechat_redirect:必须都加上#wechat_redirect

redirect_url对应方法

后台使用springboot来开发,nginx做端口转发。
nginx配置:

        location /lootaa-wechat/ {
                proxy_pass http://127.0.0.1:2022/lootaa-wechat/;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header Host $host;
        }

application.properties配置

server.port=2022
server.servlet.context-path=/lootaa-wechat

对应的controller添加注解@RestController,方法添加注解@GetMapping。

  • 可以根据接收到的参数做自身业务处理,本篇只做了打印操作
  • 发送一次性订阅消息也放到了接收代码中,真实业务肯定是在其他地方的,根据业务场景再调用发送消息
  • 返回值使用了response形式,订阅成功或者识别均可设置跳转页面
  • 发送订阅消息的参数与模板消息的比较类似,但是又不完全一样,避免直接复制出问题。
package com.lootaa.wechat;

import java.util.Objects;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

/**
 * 一次性订阅
 * 前置条件:公众号后台设置ip白名单;获取到了模板id;设置了业务域名
 * 入口链接:https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=wx276049d6a7551dca&scene=1000&template_id=FHIXqn7zsGh_CECK7oIfKAVdQFHzAInncglc6wctAWg&redirect_url=http://test.lootaa.com/lootaa-wechat/wx7&reserved=lootaatest7#wechat_redirect
 */
@RestController
public class Test007 {

	public static final String APPID = "wx276049d6a7551dca";
	public static final String SECRET = "cbe109fdf6f399bd72ed3a4afafa21b1";
	
	@GetMapping("wx7")
	public void wxGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String openid = request.getParameter("openid"); //用户唯一标识,只在用户确认授权时才会带上
		String templateId = request.getParameter("template_id"); //订阅消息模板ID
		String action = request.getParameter("action"); //用户点击动作,"confirm"代表用户确认授权,"cancel"代表用户取消授权
		String scene = request.getParameter("scene"); //订阅场景值
		String reserved = request.getParameter("reserved"); //请求带入原样返回
		System.out.println(openid);
		System.out.println(templateId);
		System.out.println(action);
		System.out.println(scene);
		System.out.println(reserved);
		if(Objects.equals(action, "cancel")) { //取消授权
			response.sendRedirect("https://blog.csdn.net/m0_58095675");
			return;
		}
		
		// 发送订阅消息,这部分可以放到其他任何地方,跳转适合的时机再发送。测试方便就直接发送了
		// 先获取access_token,这部分正式环境需要配置定时获取,每天2000次调用限制
		String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET;
		String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).execute().body();
		System.out.println(result);
		String accessToken = JSON.parseObject(result).getString("access_token");
		// 发送模板消息
		url = "https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=" + accessToken;
		JSONObject param = new JSONObject();
		param.put("touser", "ohUHp6iaFJq6SISTVwHS5lkb9Pb8"); //接收人的openid
		param.put("template_id", templateId);
		param.put("url", "https://blog.csdn.net/m0_58095675"); //非必填,点击后跳转的页面
		param.put("scene", scene); 
		param.put("title", "15字以内消息标题"); 
		// 如果要调整小程序需要下面这个,非必填
		JSONObject miniprogram = new JSONObject(); 
		miniprogram.put("appid", "wxa3b096d8546b270d"); //小程序的appid
		miniprogram.put("pagepath", "pages/station/station"); //不填就是默认首页,这个可以带参数
		param.put("miniprogram", miniprogram); 
		// 数据参数
		JSONObject data = new JSONObject();
		JSONObject content = new JSONObject();
		content.put("value", "一次性订阅消息值");
		content.put("color", "#666666"); //文字颜色
		data.put("content", content);
		param.put("data", data);
		result = Jsoup.connect(url).ignoreContentType(true).method(Method.POST).requestBody(param.toString()).execute().body();
		System.out.println(result);
		
		// 确认授权后跳转的目的展示页面
		response.sendRedirect("https://blog.csdn.net/m0_58095675");
			
	}
	
}

执行效果

分别为确认授权、公众号收到订阅消息(已关注了公众号)、服务通知收到订阅消息(没有关注公众号)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

公众号一次性订阅消息 的相关文章

  • GPT 学习笔记-让GPT基于embeddings搜索来回答问题

    1 什么是embedding search 嵌入 Embedding 是一种将离散的符号 如词语 字符或文档 映射到连续向量空间的表示方法 它将离散的符号转换为实数向量 从而使得计算机可以更好地处理和理解文本数据 OPENAI提供内置的Em

随机推荐

  • 防止matplotlib画完图后自动关闭

    为防止matplotlib画完图后自动关闭图像窗口 可以在代码的尾部加上 pyplot pause 0 例 import tensorflow as tf import numpy as np import matplotlib pylab
  • windows xp卡机的解决妙招

    使用windows xp时间比较长后 有时运行会很不流畅 甚至会不响应鼠标键盘对操作 很多时候是系统的假死 和真正的死机不同 假死完全可以被 救活 假死的根源在于explorer exe 整个图形界面的驱动 既然会假死 那就一定有解决方法
  • pyqt5 槽函数传递参数

    内置槽函数是不允许传递参数的 这里有两种解决方法 方法一 使用lambda表达式 button clicked connect lambda self onButtonClick 1 这个时候就可以将数值1传递到所调用的方法中 方法二 使用
  • flowable(五) - 使用flowable-admin-ui 流程部署到数据库

    前言 看完别人集成boot项目的demo 他的部署方式是通过和moderer项目里面的代码进行部署的 flowable流程资源部署方式 这里提到了Model方式部署 设计器中的发布就是用的此方法这里就是上篇作者的代码 所以说 设计器的发布
  • jupyter 写入csv pandas_pandas:如何简单3步绘制直方图

    大家好 这是近期学习的data analysis 那本书的总结 发表这些东西的主要目的就是督促自己 希望大家关注评论指出不足 一起进步 内容我都会写的很细 并且按照文章中的代码自己也可以做出一样的结果 一个目的就是零基础也能懂 因为自己就是
  • Tensorflow Serving部署tensorflow、keras模型详解

    写在篇前 本篇介绍如何使用Tensorflow Serving组件导出训练好的Tensorflow模型 并使用标准tensorflow model server来部署深度学习模型预测服务 tensorflow model server主要负
  • 信道建模那些事--仿真Matlab

    一 小尺度衰落 瑞利信道 莱斯信道 和大尺度衰落Matlab信道建模 一般论文中给出的是下面高亮的大尺度衰落模型 要把它换成单位是W的 dB换成W公式推导如下所示 公式中 P L 0 PL 0 PL
  • PLSQL编程详细

    目录 1 概念和目的 1 1 什么是PL SQL 1 2 程序结构 1 3 Hello World sqlplus编译运行 开启输出 set serveroutput on 1 4 变量 1 4 1 普通变量 1 4 2 引用型变量 引用型
  • RS485主从式多机通讯协议

    RS485主从式多机通讯协议一 数据传输协议 此协议定义了一个控制器能认识使用的消息结构 而不管它们是经过何种网络进行通信的 它描述了一控制器请求访问其它设备的过程 如何回应来自其它设备的请求 以及怎样侦测错误并记录 它制定了消息域格局和内
  • 车载LED 舞台灯 备用灯 智能过热调节降压恒流芯片NS4116

    车载LED是一种在汽车和其他交通工具中广泛使用的照明技术 车载LED具有许多优点 使其成为汽车照明系统的流行选择 关于车载LED的一些重要信息 高亮度和能效 车载LED灯具有高亮度 能够产生明亮 清晰的光线 同时具有较低的能耗 这使得它们比
  • 用ChatGPT编写测试大纲和测试用例

    问 当用户未支付时 不需要数据上报 当用户支付成功时 需要数据上报 请以这个逻辑帮我写测试用例 ChatGPT 好的 根据您提供的逻辑 我可以为您列出一些测试用例 1 确认在用户未支付时 不会产生数据上报 2 测试在用户支付成功后 数据是否
  • 公安交管工作数字化转型存在的问题及对策建议

    近年来 数字中国 交通强国 数字政府 等关键词密集出现在党和国家层面的各种会议 文件 报告和规划中 特别是在党的二十大报告中 明确提出加快建设 数字中国 和 交通强国 2023年初 又先后印发了 数字中国建设整体布局规划 和批准组建国家数据
  • ps 命令查看进程下的线程及线程状态

    ps 命令查看进程下的线程及线程状态 查看java所有线程 ps eLf grep java 查看进程下的所有线程cpu利用率 top H p 25120 其中25120为Java进程号 下图红色标注的地方为线程状态 其中总数为28 当前运
  • Windows 32位、64位 Android Studio 解压版安装及SDK配置

    android studio最新版只有64位可以直接安装 不用配置 32位只能解压后自己安装SDK并配置 android studio需要安装jdk才能运行 我的jdk已经配置好 可以通过在cmd中输入java version检查jdk是否
  • CH5-数据存储

    文章目录 目标 一 数据存储方式 目标 1 1 数据存储方式 二 文件存储 目标 2 1 将数据存入文件中 内部存储 外部存储 2 2 从文件中读取数据 内部存储 外部存储 申请SD卡写文件的权限 2 3 实战演练 保存QQ账号与密码 三
  • linux网络名字空间介绍

    1 什么是网络名字空间 what are network namespaces Generally speaking an installation of Linux shares a single set of network inter
  • sockjs-node请求一直报错

    今天在运行本地项目时候 一直提示sockjs node info 请求失败 我一直在想本地并没有这个请求接口 这个是哪里来的 后来经过查阅资料发现 sockjs node 是一个JavaScript库 提供跨浏览器 JavaScript 的
  • 蓝桥杯省赛2021 回路计数 python

    题目描述 蓝桥学院由 21栋教学楼组成 教学楼编号 1 到 21 对于两栋教学楼 a 和 b 当 a 和 b 互质时 a和 b之间有一条走廊直接相连 两个方向皆可通行 否则没有直接连接的走廊 小蓝现在在第一栋教学楼 他想要访问每栋教学楼正好
  • python实现onvif客户端及问题小结

    python实现onvif客户端及问题小结 文章目录 python实现onvif客户端及问题小结 1 前言 2 python onvif安装及ptz示例 2 1 openwrt下安装pip及python onvif 2 2 ptz示例 3
  • 公众号一次性订阅消息

    洛塔服务号回复007获取代码 功能说明 之前发布通知 要用订阅通知替代一次性订阅消息 不知道是被骂的太惨还是技术原因 一次性订阅消息还是一直能用 和模板消息不同的是 一次性订阅消息无需用户关注公众号 但是必须用户点击同意发送才能接收消息 模