最近在做记账小程序,之前加的一个功能,预算设置,可以设置本年度每个月的预算额度。
但是光设置预算还不够,我想在用户每次记账的时候 能自动提醒用户 预算额度,剩余预算,等信息
好了需求想好了接下来就是实现。
首先在我的页面 增加一个 系统设置-》消息提醒 用来开启和关闭 是否发送订阅消息的开关,
这个开关在数据库当中也会独立创建一个字段跟用户做关联。
系统设置里面 加了一个 切换选项可以进行 订阅消息的开关设置。
当点击开的时候会弹出订阅消息确认弹框。让用户同意
用户同意以后 会更新数据库里面的 订阅字段
在用户进行记账操作的时候就会通过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();
}
嗯嗯嗯写的 略微有点乱。。。。
就是记账成功以后,先判断你是否设置订阅,如果设置了,那么就组装订阅消息数据。
调用接口进行发送
到此为止订阅消息就完成了。。。。
最后再说下订阅消息模板怎么开通。
在这里申请就好了。。。。
就这样吧,,,结束!!!