小程序想要向用户的微信服务通知中发送消息,可以使用小程序开发文档里提供的订阅消息来实现,效果如图:

微信小程序订阅消息java开发_微信


实现订阅消息需要前后端配合

前端工作:

1.获取订阅消息模板

打开微信公众平台,输入账号密码登录,进入到“订阅消息”页面去获取模板

微信小程序订阅消息java开发_小程序_02

2.获取openid

需要由前端先去调用 wx.login 方法去获取code,然后后端再根据这个code去调用微信服务端的api,获取openid,有了openid以后,才能向用户微信发送订阅消息(发送订阅消息的api是由后端调用的)

wx.login({
	success (res) {
		console.log(res.code) // 拿着这个code传给后端,后端调用微信服务端api去取得openid
	}
})

注:openid的一般用法是,后端获取openid后,将其保存在用户表中,用户登录时,如果检测到该用户已有openid字段,就不需要再次获取;如果没有,则调用 wx.login 方法与后端配合去获取openid

3.检查用户是否有同意了订阅消息

wx.getSetting({ // getSetting方法用来获取小程序向用户请求过的权限
	withSubscriptions: true, // 这个字段为true时,用来获取用户订阅消息的订阅状态
	success (res) {
		// 我们需要判断的是res.subscriptionsSetting.itemSettings这个字段
		// 假设你的模板id为"abcd",itemSettings里,如果没有名为abcd的属性,表明用户还未订阅过消息
		// 如果有名为adcd的属性,且属性值为reject,表明用户拒绝订阅该消息
		// 如果有名为abcd的属性,且属性值为accept,表明用户已接受该订阅消息
		console.log(res.subscriptionsSetting.itemSettings)
	}
})

需要注意的是,检查用户是否有同意了订阅消息,必须要在真机上调试调用

4.如果用户没有订阅消息,则发起订阅消息弹窗

// 发起订阅消息弹窗
wx.requestSubscribeMessage({
	tmplIds: ['abcd'], // 模板id列表
	success (res) {},
	fail (err) {}
})

需要注意的是,发起订阅弹窗的方法,必须手动触发(比如点击按钮触发)或者在支付回调中才能触发,在别的回调中是无法触发的,如下

wx.getSetting({
	withSubscriptions: true,
	success (res) {
		// 先判断用户是否有订阅了该消息
		if (res.subscriptionsSetting.itemSettings['模板id'] !== 'accept') {
			wx.requestSubscribeMessage({
				tmplIds: ['模板id'],
				success (res) {}
			})
		}
	}
})

这样的代码是错误的做法,除非是支付方法的回调,否则只能手动触发,一点击按钮,就要调用wx.requestSubscribeMessage方法。此外,该方法也必须在真机上调试

wx.requestSubscribeMessage方法的运行效果:

微信小程序订阅消息java开发_小程序_03


使用规则:

如果你勾选了“总是保持以上选择,不再询问”,那么不管你选择的是取消还是允许,只要是用你的微信号打开的小程序,都再也不会发起订阅消息弹窗。后续要更改设置的话,只能到小程序的设置中去设置

微信小程序订阅消息java开发_字段_04


但是,若你一直不勾选“总是保持以上选择,不再询问”,则每一次都会发起订阅消息弹窗。且这个时候,在小程序的设置中是无法设置的,只能一次次地点击取消或允许。

除此之外,发送订阅消息的次数与你点击允许的次数成正比。如果不勾选“总是保持以上选择”,则你允许一次,后端只能发送一次消息给你,没办法发送多次后端工作:

1.获取openid,将openid保存在用户表中

2.根据模板id,openid,以及字段详情,调用微信服务端api,发送消息给微信用户

微信小程序订阅消息java开发_字段_05

上诉各个api仅是简单介绍,实际开发中也够用了。更详细的用法,还是需要查看微信开发者文档