评论

记账小程序之订阅消息提醒方案

最近在做记账小程序,之前加的一个功能,预算设置,可以设置本年度每个月的预算额度。

最近在做记账小程序,之前加的一个功能,预算设置,可以设置本年度每个月的预算额度。

但是光设置预算还不够,我想在用户每次记账的时候 能自动提醒用户 预算额度,剩余预算,等信息

好了需求想好了接下来就是实现。

首先在我的页面 增加一个 系统设置-》消息提醒 用来开启和关闭 是否发送订阅消息的开关,

这个开关在数据库当中也会独立创建一个字段跟用户做关联。

系统设置里面 加了一个 切换选项可以进行 订阅消息的开关设置。

当点击开的时候会弹出订阅消息确认弹框。让用户同意

用户同意以后 会更新数据库里面的 订阅字段

在用户进行记账操作的时候就会通过api给用户发送一个订阅消息啦

好好好。。。。

看看代码如何实现,,,

首先我们在小程序app.js 里面封装了一个订阅消息 和 取消订阅消息的 函数

// 订阅消息
  getSubscribeMessage: function(tmplIds, callBack = null){
    const _this = this
    if(tmplIds) {
      wx.requestSubscribeMessage({
        tmplIds: tmplIds,
        success (res) { 
          console.log(res)
          if(res[tmplIds[0]] === 'accept' && res.errMsg === 'requestSubscribeMessage:ok'){
            _this.ajaxPost('/api/set-user-is-subscribe', {is_subscribe: 1}, (res)=>{
              if(res.code === 200){
                wx.showToast({
                  icon: 'none',
                  title: '订阅成功',
                })
                callBack && callBack(true)
              }
            })
          } else {
            wx.showToast({
              icon: 'none',
              title: '订阅失败',
            })
            callBack && callBack(false)
          }
        },
        complete(res) {
          wx.showToast({
            icon: 'none',
            title: '订阅失败',
          })
          callBack && callBack(false)
        }
      })
    } else {
      _this.ajaxPost('/api/set-user-is-subscribe', {is_subscribe: 2}, (res)=>{
        if(res.code === 200){
          wx.showToast({
            icon: 'none',
            title: '取消订阅成功',
          })
          callBack && callBack(false)
        }
      })
    }

  },


然而在我的页面里,我们在进入我的页面的时候就会通过接口去拿 模板消息的 tmpids,

tmpids 是通过接口返回的。

  getAppConfigs() {
    app.ajaxPost('/api/get-app-config', {}, (res)=>{
      if(res.code === 200){
        this.setData({
          appConfig: res.data
        })
      }
    })
  },


// 订阅消息
  onChangeSubscribe({detail}) {
    const ids = this.data.appConfig.tmpl_ids
    if(ids) {
      if(detail) {
        app.getSubscribeMessage(ids, (res) => {
          this.setData({ isSubscribe: res });
        })
      } else {
        app.getSubscribeMessage(null, (res)=>{
          this.setData({ isSubscribe: res });
        })
      }
    } else {
      wx.showToast({
        icon: 'none',
        title: '找不到订阅模板',
      })
    }

  },

然后在用户点击订阅的时候我们直接就可以通过事先获取的tmpids 来进行订阅授权

这就是小程序端的订阅消息逻辑啦啦啦啦。。。。

我们继续看看api部分怎么实现的。(php示例)

接口我们事先配置好了 小程序的tmpid

然后在get-app-config 接口里面获取小程序的配置信息

  // 获取小程序配置信息
  public function getAppConfig() {
    $param = Request::param();
    $appid = Request::param('appid');
    $appConfig = config($appid);
    $appConfig['app_secret'] = '';
    return apiSuccess($appConfig ); 
  }


然后在小程序进行记账的时候 我们在看下 是怎么触发订阅消息的吧

  // 添加修改 记账信息
  public function setTallyMainEdit() {
    $param = Request::param();
    $mainModel = model('main');
    $userModel = model('user');
    $data = [
      'book_id' => $param['book_id'],
      'category_id' => $param['category_id'],
      'type' => $param['type'],
      'money' => $param['money'],
      'name' => $param['name'],
      'desc' => $param['desc'],
      'date' => $param['date']
    ];

    if(empty($param['category_id']) || empty($param['type']) || empty($param['money']) || empty($param['name']) || empty($param['date'])) {
      return apiError('缺少参数');
    }

    if(isset($param['id']) && !empty($param['id'])) {
      $mainModel->where(['id'=>$param['id']])->update($data);
    } else {
      $data['user_id'] = $param['user_id'];
      $mainModel->save($data);
    }

    // 添加或者修改完记账信息后 如果该用户开启订阅消息 那么就发送信息
    $userInfo = $userModel->where(['id'=>$param['user_id']])->find();
    if($userInfo['is_subscribe'] == 1) {

        $appid = Request::param('appid');
        $appConfig = config($appid);
        $app = Factory::miniProgram($this->config);

        $time1 = date("Y-m-d H:i:s");
        $budgetInfo = model('budget')->where(['user_id'=>$param['user_id']])->whereTime('date', 'month')->find();
        $user_zhichu = $mainModel->where(['user_id'=>$param['user_id'], 'is_del'=>1, 'type'=>1])->whereTime('date', 'month')->sum('money');
        $amount6 = 0;
        $amount3 = 0;
        $thing4 = $appConfig['name'].'提醒您:';
        if($budgetInfo) {
          $amount6 = $budgetInfo['money'].'元';
          $amount3 = $budgetInfo['money'] - $user_zhichu;

          if($amount3 > 0 && $amount3 < 300) {
            $thing4 = $thing4.'不足300块,怎么带你去香港?';
          }
          if($amount3 < 0) {
            $thing4 = $thing4.'预算不足,真能花啊!';
          }
          if($amount3 >= 300) {
            $thing4 = $thing4.'预算充足,别太放纵!';
          }

        } else {
          $thing4 = $thing4.'请设置本月预算!';
        }
     
        $data = [
            'template_id' => $appConfig['tmpl_ids'][0],
            'touser' => $userInfo['openid'],
            'page' => '/pages/tally/index',
            'data' => [
                'time1' => [
                    'value' => $time1,
                ],
                'amount3' => [
                    'value' => $amount3.'元',
                ],
                'thing5' => [
                  'value' => $userInfo['nick_name'],
                ],
                'amount6' => [
                    'value' => $amount6,
                ],
                'thing4' => [
                    'value' => $thing4,
                ],
            ],
        ];
 
       $res = $app->subscribe_message->send($data);
      //  var_dump($res);die;
    }



    return apiSuccess(); 
  }


嗯嗯嗯写的 略微有点乱。。。。

就是记账成功以后,先判断你是否设置订阅,如果设置了,那么就组装订阅消息数据。

调用接口进行发送

到此为止订阅消息就完成了。。。。

最后再说下订阅消息模板怎么开通。

在这里申请就好了。。。。

就这样吧,,,结束!!!

最后一次编辑于  2022-11-04  
点赞 1
收藏
评论
登录 后发表内容