概述
消息能力是小程序能力中的重要組成,我們為開發者提供了訂閱消息能力,以便實現服務的閉環和更優的體驗。
- 訂閱消息推送位置:服務通知
- 訂閱消息下發條件:用戶自主訂閱
- 訂閱消息卡片跳轉能力:點擊查看詳情可提愛轉至該小程序的頁面
消息類型
- 一次性訂閱消息
一次性訂閱消息用於解決用戶使用小程序后,后續服務環節的通知問題。用戶自主訂閱后,開發這可不限時間的下發一條對應的服務消息 ; 每條消息可單獨訂閱或退訂(開發者自行控制發送)。 - 長期訂閱消息
一次性訂閱消息可滿足小程序的大部分服務場景需求,但線下公共服務領域存在一次性訂閱無法滿足的場景,如航班延誤,需根據航班實時動態來多次發送消息提醒,為便於服務,因此提供了長期性訂閱消息,用戶訂閱一次后,開發者可長期下發多條消息。
目前長期性訂閱消息僅向政務民生、醫療、交通、金融、教育等線下公共服務開放。
使用步驟
第一步 選擇/配置模板
在微信公眾號平台配置並獲取模板ID。
登錄https://mp.weixin.qq.com 在功能 >訂閱消息欄目,在我的模板中列出了當前用戶定義的所有模板信息,
當不存在模板或沒有合適的模板時,可在 公共模板 中申請添加新模板,待審核通過后便可使用。
第二步 訂閱消息
在小程序中通過編碼的方式調用微信接口 wx.requestSubscribeMessage 進行消息訂閱。
示例
布局代碼
<button bindtap="dingyue_message" >訂閱消息</button>
js 代碼
/**
* 訂閱-消息
* @param {*} e
*/
dingyue_message : function(e){
wx.requestSubscribeMessage({
tmplIds: ['模板ID'],
success:function(res){
console.log('success:' + res.errMsg)
},
fail: function(res){
console.log('error:' + res.errMsg + " " + res.errCode)
}
})
}
實例中點擊訂閱消息
按鈕,會彈出訂閱消息界面,返回用戶訂閱消息的結果。
注意事項
- 一次性模板 Id 和永久模板 Id 不可同時使用
- 低版本基礎庫2.4.4~2.8.3 已支持訂閱消息接口調用,僅支持傳入一個一次性 tmplId / 永久 tmplId。
- 2.8.2 版本開始,用戶發生點擊行為或者發起支付回調后,才可以調起訂閱消息界面。
- 2.10.0 版本開始,開發版和體驗版小程序將禁止使用模板消息 formId。
- 一次授權調用里,每個tmplId對應的模板標題不能存在相同的,若出現相同的,只保留一個。
- 2.10.0 版本開始,支持訂閱語音消息提醒
第三步 服務端消息發送
發送訂閱消息的調用方式有 HTTPS調用 和 雲調用 兩種方式,本文只介紹 HTTPS調用。
請求地址
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
請求參數
參數名 | 類型 | 默認值 | 必須 | 說明 |
---|---|---|---|---|
access_token / cloudbase_access_token | string | 是 | 接口調用憑證 | |
touser | string | 是 | 接收者(用戶)的 openid | |
template_id | string | 是 | 所需下發的訂閱模板id | |
page | string | 否 | 點擊模板卡片后的跳轉頁面,僅限本小程序內的頁面。支持帶參數,(示例index?foo=bar)。該字段不填則模板無跳轉。 | |
data | Object | 是 | 模板內容,格式形如 { "key1": { "value": any }, "key2": { "value": any } } | |
miniprogram_state | string | 否 | 跳轉小程序類型:developer為開發版;trial為體驗版;formal為正式版;默認為正式版 | |
string | 否 | 進入小程序查看”的語言類型,支持zh_CN(簡體中文)、en_US(英文)、zh_HK(繁體中文)、zh_TW(繁體中文),默認為zh_CN |
返回值
屬性 | 類型 | 說明 |
---|---|---|
errCode | number | 錯誤碼 |
errMsg | string | 錯誤信息 |
errCode 代碼說明
代碼 | 說明 |
---|---|
0 | 成功 |
40003 | touser字段openid為空或者不正確 |
40037 | 訂閱模板id為空不正確 |
43101 | 用戶拒絕接受消息,如果用戶之前曾經訂閱過,則表示用戶取消了訂閱關系 |
47003 | 模板參數不准確,可能為空或者不滿足規則,errmsg會提示具體是哪個字段出錯 |
41030 | page路徑不正確,需要保證在現網版本小程序中存在,與app.json保持一致 |
請求示例
/// <summary>
/// 微信發送消息
/// </summary>
public class MessageService : IMessageService
{
/// <summary>
/// 發送秒殺活動消息
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<ServiceResult<WeixinResultBase>> SendSeckillMessageAsync(SeckillMessageRequest request)
{
var goodsName = request.GoodsName;
if (goodsName.Length >= 20)
{
goodsName = request.GoodsName.Substring(0, 15) + "...";
}
var req = new SendMessageRequest
{
OpenId = request.OpenId,
TemplateId = request.TemplateId,
Page = $"{_seckillPagePath}?corpId={request.CorpId}&customerId={request.CustomerId}",
Data = new Dictionary<string, object>()
{
{"thing1",new { value = goodsName } },
{"time2",new { value = request.Time } },
{"thing3",new { value = "秒殺活動即將開始,支持一鍵發布到商店" } }
}
};
return await SendMessageAsync(req);
}
public async Task<ServiceResult<WeixinResultBase>> SendMessageAsync(SendMessageRequest request)
{
//先從緩存讀取token
var accessToken = await _cache.GetStringAsync("store_assistant_accesstoken");
var url = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={_appId}&secret={_appSecret}";
var response = await _httpClientFactory.GetClient().GetAsync(url);
var accessTokenResult = await response.Content.ReadAsAsync<WxAccessTokenQueryResult>();
if (accessTokenResult != null && accessTokenResult.ErrCode == 0)
accessToken = accessTokenResult.AccessToken;
var url = $"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={access_token.Result}";
var response = await _httpClientFactory.GetClient().PostDataAsync(url, request);
var responseTxt = await response.Content.ReadAsStringAsync();
var sendMsgResult = JsonConvert.DeserializeObject<WeixinResultBase>(responseTxt);
if (sendMsgResult != null && sendMsgResult.ErrCode == 0)
return ServiceResult.Succeed(sendMsgResult);
return ServiceResult.Failed(sendMsgResult, sendMsgResult.ErrCode, sendMsgResult.ErrMsg);
}
}
/// <summary>
/// 發送微信消息通知
/// </summary>
public class SendMessageRequest
{
/// <summary>
/// 用戶openId
/// </summary>
[JsonProperty("touser")]
public string OpenId { get; set; }
/// <summary>
/// 訂閱模板id
/// </summary>
[JsonProperty("template_id")]
public string TemplateId { get; set; }
/// <summary>
/// 跳轉頁面
/// </summary>
[JsonProperty("page")]
public string Page { get; set; }
/// <summary>
/// 模板類型
/// </summary>
[JsonProperty("data")]
public Dictionary<string, object> Data { get; set; }
/// <summary>
/// 跳轉小程序類型 (eveloper為開發版;trial為體驗版;formal為正式版;默認為正式版)
/// </summary>
[JsonProperty("miniprogram_state")]
public string MiniType { get; set; } = "formal";
/// <summary>
/// 語言類型(默認為zh_CN)
/// </summary>
[JsonProperty("lang")]
public string Lang { get; set; } = "zh_CN";
}