公众号一次性订阅消息

这篇具有很好参考价值的文章主要介绍了公众号一次性订阅消息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

洛塔服务号回复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");
			
	}
	
}

执行效果

分别为确认授权、公众号收到订阅消息(已关注了公众号)、服务通知收到订阅消息(没有关注公众号)
公众号一次性订阅消息
公众号一次性订阅消息
公众号一次性订阅消息文章来源地址https://www.toymoban.com/news/detail-491873.html

到了这里,关于公众号一次性订阅消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谷歌支付接入流程(一次性支付,连续订阅)

    android同胞我相信很多人跟我一样谷歌支付运行自己的app的时候调用支付发现都是出现一个问题签名不同我们今天就来解决这个问题 先正常导入接入流程后面会提到问题的解决 1、导入依赖 2、清淡文件添加权限 3、代码接入kotlin的代码是在activity里面写 4、支付的类和接口直接

    2024年02月13日
    浏览(17)
  • Kafka系列之:一次性传送和事务消息传递

    本文档概述了加强 Kafka 消息传递语义的提案。 Kafka 目前至少提供一次语义,即。当进行可靠性调整时,可以保证用户每条消息写入都将至少保留一次,而不会丢失数据。由于生产者重试,流中可能会出现重复。例如,代理可能会在提交消息和向生产者发送确认之间崩溃,导

    2024年02月16日
    浏览(12)
  • Spring Cloud 微服务系列文章合集,一次性看个够!

    微服务架构图 为了方便大家可以直接下载编辑,这里用的ProcessOn画的架构图,可以直接克隆一个出来进行编辑,地址:https://www.processon.com/view/6523a1b37fde9c4bb35c7278 微服务系列文章合集,点击阅读 Spring Cloud 微服务系列前言 Spring Cloud 微服务系列包版本号约定 IntelliJ IDEA 创建多模

    2024年02月08日
    浏览(13)
  • python 一次性删除列表(list)的空白元素(空内容) 或者 一次性删除列表(list)中的指定元素

    看看下述代码: 输出: 当你遇见这种情况,有哪些方法来去除里面的空内容呢(即 \\\'\\\' )? 1.1 删除空内容(方法一) : 输出: 1.2 删除空内容(方法二) : 需要 配合 lambda 表达式 一起使用! 输出: 2.3 删除指定内容 : 输出: 注 :此方法既可以删除空元素,也可以删除指

    2024年02月03日
    浏览(21)
  • 《一次性分割一切》阅读笔记

    目录 0 体验 1 摘要 2 十个问题 参考文献 体验地址 :SEEM - a Hugging Face Space by xdecoder 体验结果 : 将哈士奇和汽车人从图片中分割出来。 尽管对于交互式人工智能系统的需求不断增长,但在视觉理解(例如分割)中的人工智能交互方面,很少有全面的研究。本文受到基于提示的

    2024年02月01日
    浏览(25)
  • 一次性打包学透 Spring

    不知从何时开始,Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中,很多 Java 开发者从工作的第一天开始就在使用 Spring Framework,甚至有人调侃“不会 Spring 都不好意思自称是个 Java 开发者”。 之所以出现这种局面,源于 Spring 是一个极为优秀的一站式集成框架

    2023年04月19日
    浏览(22)
  • Python:一次性输出多个量

    有的时候我们在输入一个字符串时,需要在中间加一个int类型变量时,如果一段一段输出就要写三个print,非常麻烦。今天bug君就给大家讲讲如何在Python里一次性输出多个量。 粽所粥汁,在Python里输出需要写 print(\\\"输出内容\\\") ,而输出一个变量则需要写 print(变量名) 。 注意:

    2024年02月04日
    浏览(57)
  • 如何一次性启动多个SpringBoot项目

    在做微服务这块的架构设计的时候,当微服务数量越来越多的时候,本地启动各个服务的时候,可能得手动启动每个启动类。这样就很麻烦,因此记录一下如何在 idea 里面一键启动所有的项目。 比如我项目里面有5个微服务:那么就对应了5个启动类。 1.项目右上角编辑: 2.点

    2024年02月16日
    浏览(16)
  • charles证书安装,一次性说明白

    windows上安装好charles后,需要给软件安装证书。 1、点击help - SSL proxying,选择第二个install Charles Root Certificate证书安装   2、如果以前安装过证书,但是过期了(有效期一般1年),证书界面会显示过期字样,此时就要先点击一下Reset Charles Root Certificate,然后再点击第一步中的

    2024年02月05日
    浏览(61)
  • 一次性搞懂什么是AIGC!

    你知道什么是AIGC吗?不知道?没关系,我来告诉你。AIGC就是人工智能生成内容(Artificial Intelligence Generative Content),也就是让AI自己动手创作各种各样的内容,比如图片、视频、音乐、文字等等。听起来很酷吧?那么,AIGC是怎么做到的呢?下面,我就用最简单的语言,给你

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包