微信小程序中服务器主动向小程序多个客户端发送通知消息(模板消息)的解决方法

    因公司做的一项目,需要用到移动端,但是移动端的操作功能不是很多。如果开发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删除掉。

    下面就是最终的消息通知展示:



评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值