这段时间做了一个签到的微信小程序,需要在每天给用户发送签到提醒通知。其实之前做投票小程序时有实现过消息通知,主要是在创建投票和点击投票时通过提交表单的方式生成formId并传给服务器,服务器可以使用这个formId给用户发消息,比如投票结束后创建者和参与者都会收到结果通知。但微信小程序里面限制每个formId只能发送一次消息,并且有7天的有效期,也就是说,这种方式无法做到多次发送消息,并且如果超过了有效期也无法再发送。那么怎么突破这个限制呢?
通过上述描述我们知道,提交一次表单可以生成一个formId,给用户发一条消息需要使用一个formId,如果我们将每个formId理解为一块钱,提交一次表单可以存一块钱,发送一条消息需要花一块钱,并且这个钱7天不用就会失效,那么要突破限制就需要尽可能多的不断的存钱,这样在用的时候才不会捉襟见肘。
因此我们采用的方案是,服务端提供一个单独的上传formId的api,前端将小程序里面的各个界面尽可能的做成表单的形式并尽可能的使用按钮控件,从而生成formId并传给服务器。这样,只要用户进入我们的小程序,并进行过一些操作,就会不断的生成一些新的formId,服务器可以将这些formId存起来,当需要发消息给用户的时候再从这个存款里面取,如果取出的formId失效了,那就再取一条,直到所有的存款都花光了或过期了才会出现发送不了的情况。但是这种概率是非常小的,除非用户确实完全不再用了,那发不了消息也无所谓了。
由于要将很多非按钮样式的view改为button,需要将按钮的原始样式清除,而有些button确实是真正的按钮,需要使用按钮原始样式,因此需要在app.wxss文件中做处理。下面是示例代码:
*.wxml布局文件
<form report-submit="true" bindsubmit="postFormId">
/*用户头像,并非真正的按钮,虽然改用button控件,但按钮样式是清除了的,可以当做view一样处理,自己定义需要的样式*/
<button class="avatar" form-type="submit">
<image src="{{avatar}}" />
</button>
/*真正的按钮,需要采用原始按钮的样式(定义在.button中),加上class="button"即可*/
<button class="button" bindtap="clickFunction" form-type="submit">真正的按钮</button>
</form>
app.wxss文件:
/*由于需要利用button生成formId,要将非button样式的控件写成button,因此需要清除掉默认button的样式*/
button, button::after, .button-hover {
margin-left: 0;
margin-right: 0;
padding-left: 0;
padding-right: 0;
box-sizing: unset;
border: 0;
border-radius: 0;
background-color: transparent;
text-align: inherit;
line-height: 1;
-webkit-tap-highlight-color: transparent;
}
/*真正的button样式的控件需要设置class为button*/
.button {
width: 690rpx;
height: 86rpx;
background-color: #12b7f5;
color: #fff;
font-size: 36rpx;
margin-bottom: 20rpx;
position: relative;
display: block;
margin-left: auto;
margin-right: auto;
padding-left: 14px;
padding-right: 14px;
box-sizing: border-box;
text-align: center;
text-decoration: none;
line-height: 2.55555556;
border-radius: 5px;
-webkit-tap-highlight-color: transparent;
overflow: hidden;
}