微信小程序訂閱消息設計

隨着微信小程序的普及,開發者需要一種高效的方式向用戶傳遞重要信息。訂閱消息作爲一種官方推送機制,可以在用戶授權的前提下主動發送消息。本文將詳細解析微信小程序訂閱消息的使用場景、實現流程及注意事項,幫助開發者高效利用這一能力。

什麼是訂閱消息

訂閱消息是一種無需用戶主動觸發即可發送的單向消息推送方式。不同於服務通知,訂閱消息需要用戶明確授權,開發者可以在特定場景下向用戶發送事先約定的信息。

特點:

  1. 單向推送:消息從開發者單向發送給用戶。
  2. 需用戶授權:每次發送前必須獲得用戶的訂閱授權。
  3. 消息限制:單次訂閱只能發送一次消息。

使用場景

訂閱消息適用於以下常見場景:

實現流程

訂閱消息的實現流程主要包括以下幾個步驟:

01 在微信公衆平臺申請模板

在小程序管理後臺:

  1. 進入 "基礎功能 -> 訂閱消息",選擇 "選用"。

  2. 搜索或創建符合需求的消息模板。

  3. 保存模板後,記錄模板 ID,後續開發中需要用到。

可以選用已經審覈通過的,也可以自行配置然後等待審覈。

訂閱消息模板

選用模板關鍵詞:

模板選用編輯

02 配置啓動消息推送功能

在小程序管理後臺:

  1. 進入 "開發 -> 接口設置",開啓 消息推送 功能。

  2. 設置消息推送的 推送地址 和 Token,該地址用於接收微信服務器推送的事件通知。

  3. 驗證推送配置是否成功,例如可以通過接收微信推送的測試消息確認配置無誤。

爲什麼需要配置消息推送?

消息推送功能爲小程序提供了事件通知能力,比如用戶授權訂閱、模板消息的發送結果等。當用戶完成訂閱或消息發送失敗時,微信服務器會主動推送事件到配置的推送地址,幫助開發者實時監控消息狀態並進行相應處理。

消息推送後端接口配置

可以在配置之前,通過微信開放平臺調試工具中驗證你的 api 接口,圖中右側有驗證的結果。地址:https://developers.weixin.qq.com/apiExplorer

消息推送驗證

03 在前端請求用戶訂閱

調用wx.requestSubscribeMessage 接口,向用戶請求訂閱。

示例代碼:

/**
 * 向用戶請求訂閱消息
 */
export function requestSubscribeMessage(templateIds: string[]) {
  return new Promise((resolve, reject) ={
    wx.requestSubscribeMessage({
      tmplIds: templateIds,
      success(res) {
        // 篩選出狀態爲 accept 的 templateId
        const acceptedTemplateIds = Object.entries(res)
          .filter(([_, status]) =status === 'accept')
          .map(([templateId, _]) => templateId);

        resolve(acceptedTemplateIds); // 返回 accept 的模板 ID 數組
      },
      fail(err) {
        console.error('訂閱請求失敗:', err);
        reject(err); // 處理失敗情況
      }
    });
  });
}

注意

04 服務端發送訂閱消息

通過小程序的服務器接口https://api.weixin.qq.com/cgi-bin/message/subscribe/send 向用戶發送消息。

設計要點:

  1. 每次用戶選擇的模板 ID 列表需要和具體的訂單號進行綁定,因爲用戶可以在前端每次都選擇不同的模板,後端如果沒有記錄直接發送,那麼會被微信服務器拒絕。

  2. 訂閱消息是一次性的,使用完成後,如果用戶沒有再次進行授權的話,無法進行消息的發送。

  3. 很多訂閱消息是後置的,是用戶在選擇接收的模板後,後續訂單出現狀態變化時,進行觸發的。

  4. 在訂單狀態發送變化後,發送異步事件通知,在 EventListener 中進行統一處理

  5. 異步事件發送微信訂閱消息,記得設置在數據庫事務提交之後,按需加入一致性保障,一般失敗可以丟棄或者立即重試幾次。

  6. 最後,需要確保發送的字段與模板字段一一對應,否則會報錯。

例如:簽到微信訂閱消息通知部分代碼實例:

@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void onAppointmentSigned(AppointmentSignedEvent event) {
  try {
    AppointmentOrderDetailDTO appointmentOrderDetail =
            appointmentOrderQueryExecutor.getDetail(event.getOrderId());
    UserAccountDTO userAccountDTO =
            userAccountQueryExecutor.getDetail(Long.valueOf(appointmentOrderDetail.getUserId()));

    WxSubscribeSignAppointmentCmd subscribeSignAppointmentCmd = WxSubscribeSignAppointmentCmd.builder()
            .openId(userAccountDTO.getOpenId())
            .orderNo(event.getOrderId())
            .userName(userAccountDTO.getAccountName())
            .coachName(appointmentOrderDetail.getCoachName())
            .courseName(appointmentOrderDetail.getCourseName())
            .signTime(appointmentOrderDetail.getSignTime()
                    .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
            .build();
    messageCmdExecutor.sendAppointmentSignMessage(subscribeSignAppointmentCmd);
  } catch (Exception e) {
      log.warn("發送預約簽到訂閱消息失敗!", e);
  }
}

總結

訂閱消息作爲小程序的重要能力,可以幫助開發者提升用戶體驗。然而,在實現過程中需嚴格遵守微信的接口規範和用戶隱私保護要求,以保證功能的穩定性和用戶的信任感。希望本文能爲開發者提供清晰的指導,助力開發高效實用的小程序功能。

附錄

參考個人微信小程序,進入 “預約” tab,發起預約:

查看微信小程序訂閱的消息模板

訂閱消息接收列表

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/nUyWBquyaQgA3Q0OaUMvVA