应用场景:微信小程序开发中,如果要向用户发送模板消息,需要用到formId,而每个formId使用后即失效(支付产生的prepay_id只有一个,只能发送一条模板消息),因此对于需要给单个用户发送多条模板消息的场景,需要对formId进行收集、管理。
本文只提供后台保存、获取及管理formId的示例,不涉及小程序收集。
注意:本示例不保存formId的收集时间,因此无法据此删除过期formId,而是优先使用最新收集的formId,维护最新的formId集合,当连续7天之内收集不到用户的formId,就无法向用户发送模板消息。
示例代码如下,请根据你的实际做相应调整:
/**
* 保存一个新收集的formId,以text数据类型保存在数据库中,以逗号分隔
* @$user_id string 用户id
* @$formId string 新增的formId
* @return mixed
*/
public function addFormId($user_id, $formId)
{
# 查询原有的 formId
$oriFormId = self::get(['user_id' => $user_id])['form_id'];
# 原来有就在后边加上,原来没有就只有新收集的formId
$oriFormId = ($oriFormId) ? explode(',', $oriFormId . ',' . $formId) : [$formId];
#--检查方法,仅保留最新指定数量的formId:
$oriFormId = $this->checkNewFormId($oriFormId);
# 将检查处理方法返回的数组转换成字符串,并保存
$newFormid = implode(',', $oriFormId[0]);
self::update(['form_id' => $newFormid], ['user_id' => $user_id], true);
}
/**
* 获取一个formId用于发送模板消息
* @$user_id string 用户id
* @return string
*/
public function getFormId($user_id)
{
# 原来的 formId
$oriFormId = self::get(['user_id' => $user_id])['form_id'];
# 用户无formId的处理,根据实际需求来定
if (empty($oriFormId)) return ['msg' => '该用户无formId'];
$oriFormId = explode(',', $oriFormId);
#--删除最新的一个formId
$res = array_pop($oriFormId);
#--检查方法,仅保留最新指定数量的formId:
$oriFormId = $this->checkNewFormId($oriFormId);
# 更新formId集合
$newFormid = implode(',', $oriFormId[0]);
self::update(['form_id' => $newFormid], ['user_id' => $user_id], true);
#--返回最新的一个formId及当前用户formId的数量:
return [$res,$oriFormId[1]];
}
/**
* 仅保留最新的指定数量的 formId
* @$oriFormId array 原来的 formId
* @return array
*/
public function checkNewFormId($oriFormId)
{
#--指定保留formId的数量:
$num = 60;
# formId数量:
$count = count($oriFormId);
if ($count > $num) {
foreach ($oriFormId as $k => $i) {
if ($k < ($count - $num)) {
# 大于指定保留数量时,会删除较旧的formId,保留较新的(本例是60个)。
unset($oriFormId[$k]);
} else {
break; #--指定数量以内的保留,直接退出循环
}
}
}
#--返回最新的formId集合及其数量:
return [$oriFormId, ($count > $num) ? $num : $count];
}