eggjs實現微信發送訂閲功能

語言: CN / TW / HK

theme: fancy

需求

有這麼一個需求,一羣小夥伴要去一個地方集合,但是人數很多,無法統計;那麼我們就需要做一個簽到功能(小程序);當散會以後,我們又可以發送通知給簽到者你簽到成功啦!現在可以離開了。

要實現這種功能就需要用到小程序的訂閲功能!

訂閲功能又分為一次訂閲和長期訂閲功能,如果是一次訂閲的話需要每次都授權,否則通知不到用户;但是大部分功能都只能一次訂閲;大家可以詳情看看文檔 微信訂閲相關文檔

設置訂閲

在微信公眾平台上開通訂閲功能

根據自己的需求進行配置即可!

如下圖:

Snipaste_2023-03-10_10-37-52.png

訂閲授權

在tmplIds中填寫你配置的訂閲模板id;需要訂閲的消息模板的id的集合,一次調用最多可訂閲3條消息;這樣授權以後就可以發送訂閲消息了

javascript wx.requestSubscribeMessage({ tmplIds: ['*********************'], success (res) { console.log(res); }, fail(err){ console.log(err); } })

小程序獲取code

前台獲取code;主要用於獲取openid時使用;有效時間只能60秒左右(我記得好像是)

javascript wx.login({ success: res => { console.log(res); // 發送 res.code 到後台換取 openId, sessionKey, unionId } })

獲取openid

這兒需要傳遞過來的code(前台獲取的code)然後通過小程序的開放接口以及appid和appSecret獲得openid;小程序登錄技術文檔

```javascript const Controller = require('egg').Controller;

const wxConfig = { appid: '**', appSecret: '****' }

class WxMinniController extends Controller { // 通過 wx.login 接口獲得臨時登錄憑證 code 後傳到開發者服務器調用此接口完成登錄流程 async openid() { const { ctx } = this; const { code } = ctx.request.body; const urlStr = 'https://api.weixin.qq.com/sns/jscode2session' const data = { appid: wxConfig.appid, // 小程序 appId secret: wxConfig.appSecret, // 小程序 appSecret js_code: code, // 登錄時獲取的 code grant_type: 'authorization_code' // 授權類型,此處只需填寫 } const result = await ctx.curl(urlStr, { data: data, dataType: 'json', }); if(result.data.errmsg){ ctx.body = { code: 201, msg: '操作失敗', errcode: result.data.errcode, errmsg: result.data.errmsg }; }else{ ctx.body = { code: 200, msg: '操作成功', openid: result.data.openid, session_key: result.data.session_key }; } } } module.exports = WxMinniController;

``` 成功返回:

javascript { "code": 200, "msg": "操作成功", "openid": "***********", "session_key": "****==" }

獲取access_token

獲取access_token的目的主要是為了發送訂閲消息的時候需要攜帶這個值才能成功發送訂閲消息通知用户;token有效期為7200s

獲取接口調用憑據文檔

javascript async accessToken () { const { ctx } = this; const urlStr = 'https://api.weixin.qq.com/cgi-bin/token' const data = { appid: wxConfig.appid, // 小程序 appId secret: wxConfig.appSecret, // 小程序 appSecret grant_type: 'client_credential', // 登錄時獲取的 code } const { data:result } = await ctx.curl(urlStr, { method:"GET", data, dataType: 'json', }); ctx.body = { code: 200, msg: '操作成功', data:result, }; }

發送訂閲消息

  • touser 用户openid
  • template_id 訂閲模板
  • miniprogram_state 跳轉小程序類型 developer為開發版;trial為體驗版;formal為正式版;默認為正式版
  • lang 進入小程序查看”的語言類型,支持zh_CN(簡體中文)、en_US(英文)、zh_HK(繁體中文)、zh_TW(繁體中文),默認為zh_CN
  • data 模板內容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }的object
  • page 點擊模板卡片後的跳轉頁面,僅限本小程序內的頁面。支持帶參數,(示例index?foo=bar)。該字段不填則模板無跳轉

更多的信息可以根據文檔配置相關的信息 發送訂閲消息文檔

參數説明: row格式,data中的time24需要和微信公眾號裏面配置的訂閲消息字段保持一致

javascript { "touser": "*************************", "template_id": "*********************************", "miniprogram_state":"developer", "lang":"zh_CN", "data": { "time24": { "value": "2019年11月11日 20:20" }, "time27": { "value": "2019年11月11日 20:20" }, "thing21": { "value": "小程序由公眾號:廣東專插本最前線開發" }, "thing23": { "value": "小程序由公眾號:廣東專插本最前線開發" } } }

發送訂閲消息相關代碼:

```javascript async subscription () { const { ctx } = this; const { access_token, touser, template_id } = ctx.request.body; const urlStr = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' + access_token; const data = { "touser": touser, // 接收者(用户)的 openid "template_id": template_id, // 所需下發的訂閲模板id "miniprogram_state":"developer", // 跳轉小程序類型 "lang":"zh_CN", // 語言類型 "data": { "time24": { "value": "2019年11月11日 20:20" }, "time27": { "value": "2019年11月11日 20:20" }, "thing21": { "value": "小程序通知簽到提醒" }, "thing23": { "value": "小程序通知簽到提醒" } } } const { data:result } = await ctx.curl(urlStr, { method:"POST", data, dataType: 'json', headers:{ "Content-type":"application/json" } });

ctx.body = {
    code: 200,
    msg: '操作成功',
    data:result,
  };

} ```

當你做到這兒的時候就説明訂閲消息基本上完成了;我做的這個可能比較粗糙,大家可以根據文檔做一些優化功能!

希望小夥伴們有所收穫哦!拜拜啦!下次再見

往期文章