SpringBoot实现微信订阅消息推送

本文详述了如何使用SpringBoot实现微信小程序订阅消息推送。首先介绍创建订阅消息模板的过程,接着讲解如何获取接口调用凭证和微信用户openid,最后阐述发送订阅消息的步骤,包括前端和后端的关键代码实现。文章中还列出了解决前端调试、授权数据缓存等问题的方法。
摘要由CSDN通过智能技术生成

前言

最近公司业务需求,需要实现微信小程序订阅消息推送;因为之前也没接触过,所以也花费了一些时间才完成,所以

在这里我会详细叙述每个步骤,尽量把我所踩的坑体现出来;

其实我做完总结了一下主要就是以下几个步骤,如果不出意外按照下面的步骤就可以实现小程序的订阅消息推送。

一、创建小程序订阅消息模板

消息模板就是我们发送微信服务通知的消息模板,就像下图这个,这个需要我们自己去选择;

微信公众平台官网:https://mp.weixin.qq.com/

而创建消息模板需要去微信公众平台上创建,打开连接会出现如下界面;

在这里插入图片描述

一般依托微信平台的服务都是在这个平台申请和管理,例如公众号、订阅号、小程序…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEjJaHtk-1663664746770)(SpringBoot实现微信订阅消息推送.assets/image-20220826165741024.png)]

一般一个邮箱只能申请一个小程序,如果你是个人开发可以先申请一个小程序进行开发测试,这里就不详细介绍如何

申请;如果你没有接触过小程序,是公司或者客户的小程序,那么就需要用客户的微信账号进行登录,一般申请人就

是管理员,还需要他将你添加到项目成员中;至此,你就可以开始进行开发了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCTYlSSk-1663664746771)(SpringBoot实现微信订阅消息推送.assets/image-20220826170811563.png)]

我们可以在 功能->订阅消息->我的模板中选用模板

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRjFZ1qW-1663664746772)(SpringBoot实现微信订阅消息推送.assets/image-20220826171122480.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lUPK9BZM-1663664746772)(SpringBoot实现微信订阅消息推送.assets/image-20220826171631713.png)]

选择需要的模板,这里有一点需要注意的,消息模板的有效性 分为一次性订阅和 长期订阅。

长期订阅:只需要用户授权一次即可长期推送订阅消息。

一次性订阅:需要用户先授权一次之后才能收到订阅消息,而且只能收到一次。下次则需要用户继续授权。

但是一般的账号主题只能申请一次性订阅,只有公共服务类账号才可以申请长期订阅;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8baNtu21-1663664746773)(SpringBoot实现微信订阅消息推送.assets/image-20220826171224818.png)]

选用模板时如果没有我们需要的关键词我们也可以申请,不过需要审核,大概一两天的时间;

OK,到这里我们已经搞定了小程序订阅消息的模板;

二、发送订阅消息

微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html

设置好了模板消息接下来我们就需要考虑如何将我们准备的消息内容填到我们的准备好的模板参数中然后发送给指定的用

户,我们还需要获取几个发送订阅消息的必填参数;

1、 获取接口调用凭证(auth.getAccessToken)

官方文档连接:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html

我们需要注意的调用此接口返回的参数access_token,它是小程序全局唯一后台接口调用凭据,调用绝大多数后台接

口时都需使用 access_token

但是它的有效期是2小时,所以最好写一个定时任务比如每隔100分钟更新一次access_token,避免每次调用小程序后台接

口都的生成一个access_token,需要注意的是新的access_token会覆盖旧的access_token。

注意

也就是说最后我们要发送订阅消息到指定用户调用sendSubscribeMsg方法是需要携带这个access_token的,所以我们

必须要先获取它,我们当然可以自己后端写个接口,然后前端拿appId和secret去请求这个接口然后返回

access_token,但是这个步骤在小程序已经在微信模版消息推送三方sdk中已帮我们封装好了,他会帮我们在获取微信

用户openid时调用这个接口然后发送消息时把access_token拼接上去;这个我们待会会说,所以我们暂时不需要考虑这

步。

这里说一下appId和AppSecret是什么?

1.1、appId和AppSecret

appid它相当于你的小程序在微信中的 ‘身份证’ ,有了它,微信客户端才能确定你的 ‘小程序’ 的身份,并使用微信提

供的高级接口;也就是说每一个小程序或者公众号对应一个appid;appid就像门牌,AppSecret就像钥匙。

appid可以公开,但是AppSecret必须保密。而且微信官方文档反复强调AppSecret的安全级别很高,也就是说如果泄露出

去安全风险很大,要小心保管。你可以重新生成AppSecret,但是切记重新生成AppSecret前,程序里如果有用AppSecret

的地方,要同步修改,否则程序会报错。

可以在微信公众平台开发-开发管理中-开发设置中获取APPID(小程序ID)和AppSecret:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAlqOpUZ-1663664746773)(SpringBoot实现微信订阅消息推送.assets/image-20220914210556129.png)]

2、 获取微信用户openid(auth.code2Session)

官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

这里需要注意的一点是 请求参数js_code:登录凭证校验;通过 wx.login 接口获得临时登录凭证 code 后传到开发者服

务器调用此接口完成登录流程然后返回openid,即用户唯一标识;

也就说我们要先在小程序前端调用 wx.login( )返回登录凭证code,然后我们拿这个code加上appid和secret再去后台访

问上面的链接就可以返回openid了;

ok,接下就可以开始写代码了,先看下前端是怎么写的:

2.1、前端代码

login.vue

export default {
   
		data() {
   
			return {
   
				openId: '',
			};
		},
		onShow() {
   },
		onLoad() {
   
            //调用wx.login()返回登录凭证code
            this.getCode()
        },
		methods: {
   
			async getCode(){
   
				let that = this;
				wx.login({
   
					provider: 'weixin',
					success: function(res) {
   
						console.log('code', res.code);
                        //调用接口返回openid
						that.getopenId(res.code);
					}
				})
			},
			async getopenId(code) {
   
				let params = {
   
					code: code,
				}
				const res = await this.$u.api.getOpenId(params);
				if(res.success) {
   
					console.log('openId', res.data.data.openId);
					this.openId = res.data.data.openId;
				}
			},
            async startLogin(formData) {
   
				//这里登陆接口密码的加密模式省略、、、
				let params = {
   
					username: formData.phone,
					password: password,
					secretKey: this.secretKey,
					openId: this.openId,
				};
				// 登录请求
				const res = await this.$u.api.userLogin(params);
				if (res.success) {
   
					uni.showToast({
   
					    title: '登录成功',
					    duration: 1000
					});
					setTimeout(()=>{
   
						this.$u.route({
   
							type: 'reLaunch',
							url: '/pages/orderList/orderList'
						});
					}, 1200)
					// 调起消息订阅界面
					await this.$u.api.subscribe();
				} else {
   
					this.$msg(res.msg)
				}
			},
        }
}

http.api.js

// api集中管理api
const install = (Vue, vm) => {
   
    let subscribe = () =>{
   
		wx.requestSubscribeMessage({
      // 调起消息订阅界面
		  tmplIds: ['mTJ6Tdr42nOxVVoFn-zi3xGsQqUPRnyExIXpTNwHjWg'],
		  success (res) {
    
		    console.log('订阅消息 成功 ');
		    console.log(res);
		  },
		  fail (er){
   
		    console.log("订阅消息 失败 ");
		    console.log(er);
		  }
		})
	};
    
    //通过coed获取openId
	let getOpenId = (params = {
    }) => vm.$u.post('/app/api/driver/getOpenId', params);
    // 用户登录请求,需要传递params{手机号码,密码  }
	let userLogin = (params = {
    }) => vm.$u.post('/api/Applet/login/login', params);
    、、、
    、、、
}

http.interceptor.js

const install = (Vue, vm) => {
   
	// 请求拦截,配置Token等参数处理登录
	Vue.prototype.$u.http.interceptor.request = (config) => {
   
		config.header._sid = vm.vuex_token;
        //这里为了方便后续接口请求,我将appid放到了请求头中
		config.header.appId = 'wx2e5937bfdcc66ecf';
		return config;
	}
}
</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值