1. 程式人生 > 實用技巧 >微信小程式訂閱訊息-寫於2020.7.26

微信小程式訂閱訊息-寫於2020.7.26

目錄

微信小程式訂閱訊息

此部落格是為了記錄一下工作中對接小程式推送

  • 所需的資料基本都是後臺返回的
  • 業務邏輯:
    • 使用者在使用者列表中選擇一個需要接受訊息推送的使用者,系統將資料按照訊息模板推送給該使用者
      • 使用者列表是後端資料渲染的,openid 作為屬性渲染上去了(通過選擇使用者取到 openid)
      • 提醒:接收訂閱訊息的對方使用者需要先點選授權接收訂閱訊息才能收到訊息
  • 補充:網上說授權訂閱一次只能接收一條訊息,但我在開發環境中一次授權後好像能多次接收到訂閱訊息...
    • 難道說的是授權一個模版只能接收到該模板對應的模板訊息?
    • 亦或是開發環境不受這個限制?

大前提歩鄹(要在網頁上操作)

前提1:首先要用小程式管理員使用者在微信公眾平臺中開通訂閱訊息許可權(需要申請幾天時間,所以要提前申請)

  • 可以先用官方模版把流程走通,後續再替換成申請下來的業務模板(欄位型別官方文件中有介紹)

獲取接收訂閱訊息授權(授權後就可以給他發訊息了)

前提2:接收推送訊息的使用者需要點選授權(通過點選函式來調起授權)

// 關鍵程式碼
wx.requestSubscribeMessage({
    tmplIds: ['38odFtWJoyJW_9Qu2dAn3MGMNzeVnhSBxoIyCF8cOqM'],  // 需要使用者同意授權的訊息模版id(可以一次性詢問幾個訂閱訊息授權)
    success(res) {
        // 使用者同意授權的回撥函式,此時已經可以給使用者發起模板訊息了(親測這裡已經可以傳送了,但我的業務邏輯不是這裡)
        console.log('res', res)
    },
    fail(err) {
        // 這裡可以捕捉到報錯
        console.log(err)
    }
})

向用戶傳送訂閱訊息

js 程式碼(傳送訂閱訊息這一步需要的引數)

  • 關鍵函式官方文件:subscribeMessage.send
    • 裡面的 訂閱訊息引數值內容限制說明 一定要好好看看

提醒:能不能發出訂閱訊息,能不能點進去訂閱訊息還和 miniprogram_stat 引數的值有關

  • access_token
    • 提前獲取(我的是後端有個介面專門獲取 access_token 的)
  • openid 接收訊息使用者的 openid
    • 提前獲取(後端返回的使用者列表,點選其中使用者時獲取到 openid)
  • template_id 訊息模板 id(微信公眾平臺申請的,即小程式控制面板)
    • 需要提前好幾天準備(此處可以先用官方模版先把流程走通)
  • page 點訊息卡片進入到小程式的頁面(可攜帶 url 引數)
  • miniprogram_state 跳轉小程式型別(一般寫在配置中去讀取,開發、線上環境改一下值就行)
    • 會直接影響到
  • data 與訊息模板對應的欄位
    • 與提前申請的模板訊息對應起來(欄位個數、值型別都不能錯,否則會發不出去)
  recordDetail: function(event) {
    var that = this
    var openid = event.currentTarget.dataset.openid
    console.log(openid)

    wx.showModal({
      // title: '提示',
      content: '是否推送給他/她',
      success (res) {
        if (res.confirm) {
          console.log('使用者點選確定')
          // 先請求獲取到 access_token----
          wx.request({
            url: urlList.getAccessToken,
            method: 'POST',
            success: function (res) {
              if (res.data.IsSuccess) {
                that.setData({
                  access_token: res.data.ReturnData.access_token
                })
                // 傳送訂閱訊息
                wx.request({
                  url: urlList.sendMsg + '?access_token=' + that.data.access_token,
                  data: {
                    touser: openid,
                    template_id: 'GWcd05LeF1cSDwetcmp88QyMYpXOP6huX9afaByOBgM',
                    page: 'pages/patrol_detail/patrol_detail?id=' + that.data.id,
                    miniprogram_state: urlList.version,
                    data: {
                      "thing1": {
                        "value": that.data.contractname
                      },
                      "number2": {
                        "value":that.data.contractnum
                      },
                      "amount3": {
                        "value":  '10元'
                      },
                      "phrase4": {
                        "value": '五個純漢字'
                      },
                      "thing6": {
                        "value": that.data.head
                      }
                    }
                  },
                  method: 'post',
                  success(res) {
                    console.log(res);
                    if(res.data.ReturnData.errcode == "43101") {
                      wx.showModal({
                        title: '提示',
                        content: '對方未授權推送,無法推送訊息',
                        showCancel:false,
                        success(res) {
						return false
                        }
                      })
                    }
                    var paramErr = {
                      // 這些錯誤碼都是自己程式碼的問題,對應官網文件轉述成自己的話,控制檯打個錯誤資訊或者記錄日誌
                      //   43101 是使用者授權問題,應該引導授權或怎麼樣
                      "40003": "openid為空或者不正確",
                      "40037": "訂閱模板id為空或者不正確",
                      "47003": "模板引數不準確,可能為空或者不滿足規則,errmsg會提示具體是哪個欄位出錯",
                      "41030": "page路徑不正確,需要保證在現網版本小程式中存在,與app.json保持一致"
                    }
                    if(res.data.ReturnData.errcode in paramErr) {
                      // 列印自定義後的錯誤資訊,方便確定問題所在
                      console.log(paramErr[res.data.ReturnData.errcode])
                      return false
                    }
                    wx.showModal({
                      title: '提示',
                      content: '推送成功',
                      showCancel:false,
                      success(res) {
                        // 返回兩層(推送頁面、選擇使用者,不需要使用者再返回回去)
                        wx.navigateBack({
                          delta: 2
                        })
                      }
                    })
                  },
                  fail: function() {
                    console.log("推送失敗!")
                  }
                })
              }
            }
          })
        } else if (res.cancel) {
          console.log('使用者點選取消')
        }
      }
    })
  },

備註:此部落格寫於 2020.7.26 8:25,後續可能會因官方更新而失效