微信小程序訂閱消息設計
隨着微信小程序的普及,開發者需要一種高效的方式向用戶傳遞重要信息。訂閱消息作爲一種官方推送機制,可以在用戶授權的前提下主動發送消息。本文將詳細解析微信小程序訂閱消息的使用場景、實現流程及注意事項,幫助開發者高效利用這一能力。
什麼是訂閱消息
訂閱消息是一種無需用戶主動觸發即可發送的單向消息推送方式。不同於服務通知,訂閱消息需要用戶明確授權,開發者可以在特定場景下向用戶發送事先約定的信息。
特點:
- 單向推送:消息從開發者單向發送給用戶。
- 需用戶授權:每次發送前必須獲得用戶的訂閱授權。
- 消息限制:單次訂閱只能發送一次消息。
使用場景
訂閱消息適用於以下常見場景:
- 物流通知:提醒用戶包裹的配送狀態。
- 服務預約:通知用戶服務時間的變更。
- 活動提醒:向用戶推送活動報名成功或即將開始的通知。
- 訂單狀態更新:更新用戶訂單的支付、發貨等狀態。
實現流程
訂閱消息的實現流程主要包括以下幾個步驟:
01 在微信公衆平臺申請模板
在小程序管理後臺:
-
進入 "基礎功能 -> 訂閱消息",選擇 "選用"。
-
搜索或創建符合需求的消息模板。
-
保存模板後,記錄模板 ID,後續開發中需要用到。
可以選用已經審覈通過的,也可以自行配置然後等待審覈。
訂閱消息模板
選用模板關鍵詞:
模板選用編輯
02 配置啓動消息推送功能
在小程序管理後臺:
-
進入 "開發 -> 接口設置",開啓 消息推送 功能。
-
設置消息推送的 推送地址 和 Token,該地址用於接收微信服務器推送的事件通知。
-
驗證推送配置是否成功,例如可以通過接收微信推送的測試消息確認配置無誤。
爲什麼需要配置消息推送?
消息推送功能爲小程序提供了事件通知能力,比如用戶授權訂閱、模板消息的發送結果等。當用戶完成訂閱或消息發送失敗時,微信服務器會主動推送事件到配置的推送地址,幫助開發者實時監控消息狀態並進行相應處理。
消息推送後端接口配置
可以在配置之前,通過微信開放平臺調試工具中驗證你的 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); // 處理失敗情況
}
});
});
}
注意:
-
用戶可以選擇 “總是保持以上選擇,不再詢問”,此後微信前端不再喚起彈框讓用戶選擇。
-
模板 ID 必須提前在管理後臺申請並啓用。
04 服務端發送訂閱消息
通過小程序的服務器接口https://api.weixin.qq.com/cgi-bin/message/subscribe/send
向用戶發送消息。
設計要點:
-
每次用戶選擇的模板 ID 列表需要和具體的訂單號進行綁定,因爲用戶可以在前端每次都選擇不同的模板,後端如果沒有記錄直接發送,那麼會被微信服務器拒絕。
-
訂閱消息是一次性的,使用完成後,如果用戶沒有再次進行授權的話,無法進行消息的發送。
-
很多訂閱消息是後置的,是用戶在選擇接收的模板後,後續訂單出現狀態變化時,進行觸發的。
-
在訂單狀態發送變化後,發送異步事件通知,在 EventListener 中進行統一處理
-
異步事件發送微信訂閱消息,記得設置在數據庫事務提交之後,按需加入一致性保障,一般失敗可以丟棄或者立即重試幾次。
-
最後,需要確保發送的字段與模板字段一一對應,否則會報錯。
例如:簽到微信訂閱消息通知部分代碼實例:
@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