极速快3精准计划|极速快3有规律吗
用戶
 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

掃一掃,登錄網站

小程序社區 首頁 教程 新手教程 查看內容

[博客小程序]評論通知功能實現(二)——實戰過程中的坑

Rolan 2019-4-15 00:22

上一篇小程序發送模板消息的幾種實現主要介紹了實現評論通知功能最重要的一環,這篇文章主要介紹實現該功能的具體實戰。實現流程思路其實很簡單,簡單畫了個流程圖如下:這里有兩個比較坑的地方,一個是微信本身發送 ...

上一篇 小程序發送模板消息的幾種實現 主要介紹了實現評論通知功能最重要的一環,這篇文章主要介紹實現該功能的具體實戰。

實現流程

思路其實很簡單,簡單畫了個流程圖如下:

這里有兩個比較坑的地方,一個是微信本身發送模板消息的限制:

當用戶在小程序內發生過提交表單行為且該表單聲明為要發模板消息的,開發者需要向用戶提供服務時,可允許開發者向用戶在7天內推送有限條數的模板消息(1次提交表單可下發1條,多次提交下發條數獨立,相互不影響)

另外一個就是管理員如何初始化自己的formId的問題,而且自身的formId需求量比較大,讀者評論完之后就要向管理員推送消息。

所以無奈,增加了一個后臺配置的功能,定期手動觸發去生成自己的FormId「自動不行,只能手動,淚奔中」

另外補充下,網上說的通過嵌套穿透的方式無限獲取formId的方式已經行不通了,生成出來的formId都是一樣的。

評論提交收集FormId

首先我們需要收集用戶的 FormId ,有FormId才能發送對應的模板消息,在表單標簽上加上 report-submit 屬性即可。

<form catchsubmit="formSubmit" report-submit="true">

這樣我們在提交評論表單的時候會獲取到對應的 FormId , 我們將這個FormId保存至我們的云函數中。

//評論提交按鈕部分代碼
console.info(e.detail.formId)
if (e.detail != undefined && e.detail.formId != undefined) {
    var data = {
        formId: e.detail.formId,
        author: 0,
        timestamp: new Date().getTime()
      }
    wxApi.insertFormIds(data).then(res => {
        console.info(res)
      })
    }
    
//調用云數據庫
function insertFormIds(data) {
  return db.collection('openid_formids').add({
    data: data
  })
}

這樣管理員在接收到評論之后回復時就可以到 openid_formids 的集合中找到對應的formId來進行評論回復的模板消息推送了。

管理員生成FormId

為了讓管理員能有更多的 FormId 來接收評論通知,因此我在小程序中搭建了個生成FormId的小頁面。

這樣偶爾登錄自己的小程序,查看下自己FormId的使用情況,若沒有了可以手動生成幾個。

當然,這里會有一個權限問題,理論上這個頁面只有管理員才可以展示,而其他人是沒有權限訪問的,因此需要提供個驗證權限的云函數。

這里可以使用云函數的環境變量來簡單做個驗證,將你的管理員的openId配置在環境變量中,云函數驗證下openId是否一致即可。

云函數代碼如下,這樣代碼中不會存放敏感信息,開源的代碼上傳 github 也不會泄露。

/**
 * 驗證
 * @param {} event 
 */
async function checkAuthor(event) {
  if (event.userInfo.openId == process.env.author) {
    return true;
  }
  return false;
}

發送模板消息

最后就是發送模板消息的實現了,方法在上一篇說的比較具體了,基于我的博客小程序,使用云調用是最方便的。

主要邏輯是根據傳入的openId(如果為空默認取管理員的openId)到云數據庫中取對應的formId。

然后基于openId和formId發送相應的模板消息,發送后從云數據庫中移除「發送一次后FormId就已經失效了」

具體代碼實現如下:

/**
 * 發送通知消息
 * @param  event 
 */
async function sendTemplateMessage(event) {

  var touser = "";
  var form_id = "";
  var openId = event.tOpenId == "" ? process.env.author : event.tOpenId

  //1.獲取formId
  var openIdformIds = await db.collection('openid_formids').where({
    _openid: openId
  }).limit(1).get()
  if (openIdformIds.code) {
    return;
  }
  if (!openIdformIds.data.length) {
    return;
  }
  touser = openIdformIds.data[0]['_openid']
  form_id = openIdformIds.data[0]['formId']

  //2.取到后從云數據庫中移除
  const removeResult = await db.collection('openid_formids').doc(openIdformIds.data[0]['_id']).remove()
  console.info(event.nickName + ":" + event.message)
  
  //3.發送模板消息
  const sendResult = await cloud.openapi.templateMessage.send({
    touser: touser,
    templateId: template,
    formId: form_id,
    page: 'pages/detail/detail?blogId=' + event.blogId,
    data: {
      keyword1: {
        value: event.nickName // keyword1 的值
      },
      keyword2: {
        value: event.message // keyword2 的值
      }
    },
  })
  return sendResult
}

到這里,具體實現流程就介紹完了,過程中還是會遇到些編碼問題「主要還是對前端不是很熟悉,基本功問題」

總結

雖然功能基本實現,也已經上線了,但其實還是有一些細節問題的。

比如通知消息點進去之后應該自動轉到對應的評論區域,formId過期需要定時清理,管理員FormId需要通知管理員等,可以利用小程序的定時觸發器等功能慢慢優化,后期優化后再來寫文章總結。

鮮花
鮮花
雞蛋
雞蛋
分享至 : QQ空間
收藏
原作者: bug2048 來自: bug2048
极速快3精准计划 为什么玩pk10老是输 北京pk赛车怎么看走势 八宝饭推测福彩3地今晚 快乐赛车五码看号技巧 第一时间看开码结果第 江苏时时视频 凤彩网彩票官网网站 360重庆时时五星基本走势 湖北新十一选五开奖果 湖北税务app缴纳社保