因公司做的一项目,需要用到移动端,但是移动端的操作功能不是很多。如果开发app的话,就需要开发两个版本;为了方便,经过商量后就采用了微信小程序开发。但是,由于小程序的局限性,导致某些功能不太好实现,本文主要针对小程序消息通知(实现服务器主动向不同客户端发送消息通知)进行一种解决思路的介绍。
小程序开发官方API中的消息通知有下发条件且只有两种情况:

如果我们在开发的过程中需要实现某个用户操作完成之后,需要通知下个用户来进行操作,我们需要发送一条通知消息给接下来需要操作的用户。但是小程序官方文档中的消息通知只有在支付与表单提交的时候,才能下发消息通知。因此我们只能从这两种里面选择实现。我们用排除法,支付肯定不行,所以就只剩下表单提交了,但是表单提交又涉及到一个问题,就是要求小程序内发生提交表单的行为,而且只能是通知到操作本人。因此,我们就需要换种思路来解决问题,下面就解决思路做以介绍。
既然不能直接用表单的提交操作,我们就需要想办法间接的用表单方式实现消息通知。我们可以先获取到表单提交的数据(主要是获取formId,微信小程序的模板消息发送提供的接口中必要参数--表单提交方式条件下),将数据保存到后端,然后在用的时候,取出即可。
具体做法就是,前台获取formId发送到后台服务器,后台调用接口实现发送消息通知,由于formId只能有用户触发表单提交操作产生,英雌需要前台将每次获取得到的formId都要发送到后台服务器,后台将收集到的formId与对应的用户绑定存储,代码实现如下:小程序端:
<form bindsubmit="submit" report-submit='true' >
<button form-type="submit" type="default" size="mini">提交</button>
</form>
submit: function (e) {
console.log(e.detail.formId);
}
注意:表单的需要添加属性 report-submit='true'。
后台服务器保存实体:
public class WeChatUserMapper implements Serializable{
private Integer id;
private String formId;//表单Id
private String openId;//微信账号的openId
private String templateId;//消息模板Id
private Date createDate;//创建日期
public WeChatUserMapper() {
}
public WeChatUserMapper(Integer id, String formId, String openId, String templateId, Date createDate) {
this.id = id;
this.formId = formId;
this.openId = openId;
this.templateId = templateId;
this.createDate = createDate;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "form_id")
public String getFormId() {
return formId;
}
public void setFormId(String formId) {
this.formId = formId;
}
@Column(name = "open_id")
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
@Column(name = "template_id")
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date",length = 23)
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
当然,存储的formId肯定需要给一个上限,要不然,formId的个数会无限存储。将获取的formId存储后,最后就是调用模板消息发送接口,实现消息通知发送。当然,发送之前必须得判断,formId是否还有效,因为,formId获取后,只有7天的生命周期,一旦超过这个时间,该formId就无效,从而会导致发送消息通知失败,因此,在每次获取你保存的formId对应的映射信息时,你必须保证formId的有效性,将无效的formId清除掉。同时也要讲已用过的formId删除掉。
下面就是最终的消息通知展示: