vue实战(16)——公众号发送订阅消息、模版消息

1、应用场景

基于公众号开发的web页面通常会涉及到微信支付、卡券、授权登录、模版消息、订阅消息等功能,这些功能虽然都是非常成熟的内容,但由于调试起来不方便,问题排查麻烦原因很容易入坑,本节主要围绕订阅消息和模版消息应用场景以及使用方法

  • 订阅消息:官方文档一次性订阅消息有详细介绍,这种订阅方式好处在于无需关注公众号就可以对同意授权的用户发送一次订阅消息,需要单次订阅单次发送,缺点就是每次都需要用户去订阅
  • 模版消息:模版消息发送则需要在微信管理后台配置相应模版,参考模版消息接口中步骤,只能给已关注公众号的用户发送模版消息

2、一次性订阅消息

2.1、一次性订阅消息授权
  • 首先是用户授权,访问链接:
    https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=wxb38cf163da69b&scene=1000&template_id=1uDxHNXwYQfBmXOfPJcjAynHArD8aWMEFNRGSbCc&redirect_url=http%3a%2f%2fsupport.qq.com&reserved=test#wechat_redirect
    其它参数文档中描述都很清楚,template_id需要说明下,这个是需要在微信公众号设置中取,千万别和模版消息中的模版id混淆
    image.png
  • 接下来就是在redirect_url跳转的页面取action("confirm"代表用户确认授权,"cancel"代表用户取消授权)、scene(订阅场景值),场景值需传给后端,不然后端调取微信发送订阅消息时会始终提示用户未订阅


    image.png
2.2、一次性订阅消息发送
  • 请求体的scene和template_id取前端传过来的
  • 发送接口相对简单些,主要是字段对应上一般都会成功的,这里就用第三方模拟请求
    请求接口:https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=33_GOM0Uode_fwaGrriN7gFiZdTJHz9kiQUSTIHOfvciGJhZ1QUB_OmNgEWBMrvNJc_X9XacfGc8n7C-UYx3k91r5nACeBvfXETCDsk-NtHdT_PyEqW0kmv2aMdmgNLSESuEqnXXutXDUDSDSDEEEZ
    body请求体、成功返回值
{
    "touser":"ola5v0pJ_d2OzIEzADFjNdOeko",
    "template_id":"L6t3Q5jnTr1YG7xLY54P2jD_n8OEjr_VUMoyk",
    "miniprogram":{
        "appid":"wx39867ed535e89",
        "pagepath":"index"    
    },
    "scene":"1000",
    "title":"商品发货通知",
    "data":{
        "content":{
            "value":"消息正文内容消息正文内容消息正文内容消息正文内容消息正文内容消息正文内容\n说明文字:描述内容",
            "color":"#f60"
        }
    }
}
// 成功返回值
{
  "errcode": 0,
  "errmsg": "ok"
}
  • 用户订阅后只能接受一条订阅消息,否则会返回失败返回
{
  "errcode": 42001,
  "errmsg": "access_token expired hints: [FImcf8VhE-WRDEza!]"
}
一次性订阅消息

3、模版消息

  • 模版消息相对简单点,需要用户关注公众号,并在微信公众号-模版消息设置添加相应模版


    image.png

请求接口:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=33_wYNe1eOoT3QyqI_oh4Q7MKP0ff_3dz9qU2NsC_36iHpITgJwuYMnnxRUNt9Edo_P-zNfd8QbgyOarE_ZY9LLSOc_CiHdYnzUa1H_E_sTZoZc6806WU4HoRDFRJRUJYAfAFATIK
body请求体、成功返回值

{
           "touser":"ola5v0pJ_dzADDFSNdOeko",
           "template_id":"rdeBdYf9F1h9sj_3s78JJFdseUmaQIev1XcpV94",
           "url":"http://weixin.qq.com/download",          
           "data":{
                   "first": {
                       "value":"恭喜你购买成功!",
                       "color":"#173177"
                   },
                   "keyword1":{
                       "value":"巧克力",
                       "color":"#173177"
                   },
                   "keyword2": {
                       "value":"39.8元",
                       "color":"#173177"
                   },
                   "keyword3": {
                       "value":"2014年9月22日",
                       "color":"#173177"
                   },
                   "remark":{
                       "value":"欢迎再次购买!",
                       "color":"#173177"
                   }
           }
       }
模版消息

4、实现代码

  • 授权一次性订阅消息方法
subscribeAuth() {
  let encodeHost = encodeURIComponent('https://www.tinl.com/active/#/materialResult'); 
  let appId = "wx1d0efh8e6718b";
  alert(encodeHost)
  let templeteId = 'L6t3Q89reTr1Y87MpeP2jDK3_n8OEjr_VUMoyk'
  window.location.href = `https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=${appId}&scene=1000&template_id=${templeteId}&redirect_url=${encodeHost}&reserved=test#wechat_redirect`
}
  • 上报服务端发送消息
reportInfo () {
  const appKey = 'd7879fsdJFDF06bf87d817ec61aca6'
  const screat = 'FNKJFKFJC9D9F467313C321FE9B60'
  const openId = this.materialOpenid
  const appid = 'wx1d0ef78e6718b'
  let times = getMinutes()
  let data = {
    formId: "-1",
    openId: openId,
    projectCode: appid,
    userId: global.materialUserId && Number(global.materialUserId),
  }
  let signStr = `${screat}appKey${appKey}body${JSON.stringify(data)}timestamp${times}${screat}`
  let sign = md5(signStr)
  let response = await axios.post( `api/consumer-sms-feign/miniProgramManager/addUserFormId?appKey=${appKey}&timestamp=${times}&sign=${sign}`,data,{headers:{'x-access-token':global.materialToken}})
  console.log(response)
  if(response.data.code === '1'){
    if(response.data.data === 0){
      alert(`data=>>${response.data.data}订阅上报成功`)
    }
  }
},
  • 由于上报发送消息关系到具体用户,所以上报服务端接口做了加密上报,一般是前后端约定的appKey和screat,再对请求体做好ASCII码进行排序
  • 这里的时间是以分钟传输,方便后端对频繁发送做处理,默认1分钟内只能发一次
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345