TP5后台微信小程序formId管理方法

 

应用场景:微信小程序开发中,如果要向用户发送模板消息,需要用到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];

    }

 

你可能感兴趣的:(小程序formId管理)