Skip to content
目录

微信小程序模板消息

1、前端代码

收集 formid

html
<form report-submit="true" className="cu-footer" onSubmit="{this.handlePay}">
  <button form-type="submit" className="mainbtn topay">
    去支付
  </button>
</form>
js
fly.post('gatherFormId', {
  formId: e.detail.formId,
});

收集 formID 存到数据库中,可以无限发送消息。

2、后端代码

获取 access_token 传入小程序 APPID 和 小程序 secret

js
const getAccessToken = () =>
  new Promise((resolve, reject) => {
    fly
      .get(
        `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.appId}&secret=${config.secret}`,
      )
      .then((res) => {
        console.log('请求哈哈哈');
        console.log(res.data);
        resolve(res.data);
      })
      .catch((err) => {
        reject(err);
      });
  });
js
/**
     *  发送模板消息
     */
    async sendTemplateMsg(param) {
        const page =
            param.type === 'course'
                ? `pages/course/myDetail?id=${param.orderId}`
                : `pages/order/detail?id=${param.orderId}`;
        let opts = {
            touser: param.openId,            //用户openID
            template_id: param.template_id, //小程序后台申请的id
            form_id: param.formId,          //收集的formID
            page,
            data: {
                keyword1: {
                    value: param.orderId    //根据申请的模板消息,对应的keyword1输入value值, (订单ID)
                },
                keyword2: {
                    value: param.price     //价格
                },
                keyword3: {
                    value: param.time     //下单时间
                },
                keyword4: {
                    value: '待支付'
                },
                keyword5: {
                    value: param.title
                },
                keyword6: {
                    value: '请在30分钟内支付完成'
                }
            }
        };
        //发送模板消息
        await fly
            .post(
                `https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=${
                    param.accessToken
                }`,
                opts
            )
            .then(res => {
                const result = JSON.parse(res);
                if (result.errcode == '0' && result.errmsg === 'ok') {
                    this.logger.info('模板消息发送成功');
                    console.log('模板消息发送成功');
                } else {
                    this.logger.info('模板消息发送失败');
                    console.log('模板消息发送失败');
                }
            })
            .catch(error => {
                console.log('失败了');
                console.log(error);
            });
    }

3、无限发送模板消息

fromId 发送一次就失效了,而且有时效限制 7 天。

那么我们可以收集用户更多的 formId,并设置失效时间。

每次使用的时候,先过滤删除掉已经失效的 formID。

js
   async usableFormId() {
        const nowTime = +new Date();
        //去除过期的formId
        await this.ctx.model.FormId.remove({ expire: { $lte: nowTime } });
        const formIds = await this.ctx.model.FormId.find().lean();
        return removeRepeatArrObj(formIds); //去重筛选出openID和formID
    }

然后在筛选出可以的数据,openId 和 formId 。

循环发送模板消息,就做到了无限制发送!