首页 > 编程语言 >前后端微信小程序订阅消息推送

前后端微信小程序订阅消息推送

时间:2023-05-14 22:32:02浏览次数:48  
标签:body 订阅 code 微信 access 获取 token 推送 模板


小程序端

  • 开发前需要获取小程序设置模板 ID,没有设置模板消息时可以添加新的模板 mp.weixin.qq.com
  • 拥有模板 ID 后,需要获取到下发消息权限

用户下发推送消息权限

在订单或者其它操作完成时,调起客户端小程序订阅消息界面,获取到用户操作结果

// index.wxml
<button bindtap="bindSubscribeMessage"> 获取下发权限 </button>

// index.js
bindSubscribeMessage() {
  wx.requestSubscribeMessage({
    tmplIds: ['tmplIds'],
    success (res) { 
      console.log(res)
      }
  })
}
复制代码

传送用户 code

由于消息推送服务端需要小程序 openid 所以我们需要将通过 wx.login 登录小程序将 code 发送给服务端

bindLogin() {
  /* 1. 获取code 请求开发服务器 
    * 2. 开发服务器通过 code + appid + secret 请求微信服务器获取 openid
    */
  wx.login({
    success: res => {
      if (res.code) {
        const { task } = this.data;
        this.request(Object.assign(task, { code: res.code }));
      }
    }
  });
}
复制代码

服务端

这里由于是自己模拟服务端,使用的 Koa 来实现基本流程,其他后端实现流程应该是一样的

由于推送消息需要小程序 access_tokenopenid,所以我们先要获取这两个参数

获取流程

获取小程序客服端传参 code

通过客户端发送接口 app/send 拿到参数 code

function getBodyMessage(ctx) {
  const { body } = ctx.request;
  return body;
}
复制代码

获取 openid

通过 code + secret(小程序密钥) + appid 获取 openid

function getOpenId(js_code) {
    return new Promise(resolve => {
        http(
            {
                url: `https://api.weixin.qq.com/sns/jscode2session`,
                method: 'get',
                qs: {
                    grant_type: 'authorization_code',
                    js_code,
                    appid: APP.appid,
                    secret: APP.secret
                },
                json: true //设置返回的数据为json
            },
            (error, response, body) => {
                if (!error && response.statusCode == 200) {
                    resolve(body);
                }
            }
        );
    });
}
复制代码

获取 access_token

function getAccessToken() {
    return new Promise(resolve => {
        http(
            {
                url: `${WX_API}/token`,
                method: 'get',
                qs: {
                    grant_type: 'client_credential', // 注意 type 类型
                    appid: APP.appid,
                    secret: APP.secret
                },
                json: true //设置返回的数据为json
            },
            (error, response, body) => {
                if (!error && response.statusCode == 200) {
                    const { access_token } = body;
                    resolve(access_token);
                }
            }
        );
    });
}
复制代码

推送消息

我们获取到 openidaccess_token 后就可以推送消息给用户了

function sendMessage({ access_token, openid, msg }) {
    const requestData = {
        touser: openid,
    template_id: APP.template_id,
    // 模板消息属性和属性值需要注意内容限制
        data: {
            thing1: {
                value: msg.taskName
            },
            thing10: {
                value: msg.remarks
            },
            thing9: {
                value: msg.className
            }
        }
  };
  console.log(requestData);
    return new Promise((resolve, reject) => {
        http(
            {
                // 注意 access_token 需要在接口形式传送 
                url: `${WX_API}/message/subscribe/send?access_token=${access_token}`,
                headers: {
                    'content-type': 'application/json'
                },
                method: 'post',
                body: requestData, // 需要注意是放在 body 上,而不是 form 上
                json: true // 设置返回的数据为json
            },
            (error, response, body) => {
                if (!error && response.statusCode == 200) {
                    resolve(body);
                } else {
                    reject();
                }
            }
        );
    });
}
复制代码

这里我们需要注意

  • 下发的消息模板需要注意订阅消息参数值内容限制,需要参考
  • 下发模板消息属性需要注意
  • 开发模式下,授权一次下发一次消息
  • 后端启动 npm run dev

实现效果

2020-03-05更新

小程序模板消息中有两种模板

  • 一次性订阅
  • 长期订阅

这两个模板根据小程序的服务类型来区分,只有部分服务类型:医疗、民生、交通、教育之类的线下服务开放长期订阅模板库选择。

社区有篇帖子详细的说明了一些区别

作者:Mondo

标签:body,订阅,code,微信,access,获取,token,推送,模板
From: https://blog.51cto.com/owenzhang24/6275238

相关文章

  • 微信使用SQLite?
    SQLite是一个被大家低估的数据库,但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上,SQLite是一个非常可靠的数据库,它可以处理TB级的数据,但它没有网络层。接下来,本文将与大家共同探讨SQLite在过去一年中最新的SQL功能。SQLite“只是”一个库,它不是传统意义上的服......
  • 巽风推送
    巽风推送巽风集市,补货上新推送钉钉群延迟低至1s,极速推送,不漏推不重推。限时扫码免费入群......
  • Nacos Client 源码分析(二)服务订阅与推送消息处理
    1.概述在上一篇文章《NacosClient源码分析(一)事件的发布与订阅》分析了NacosClient的发布订阅机制,但我们现在还不清楚NotifyCenter的publishEvent方法是怎么被调用的以及客户端向服务端订阅服务的具体流程。下面我们对继续分析Nacos的源码。2.服务订阅还是从NacosNamin......
  • 更改微信PC版(电脑版、windows版)的消息提示音
    目标:声音文件包含在微信PC版安装路径中的「WeChatResource.dll」文件中,修改它。路径举例:C:\ProgramFiles(x86)\Tencent\WeChat\[3.9.2.26] 用到的软件:eXeScope下载地址:https://www.123pan.com/s/kW3DVv-aHxJA.html复制链接(破解版)https://ro.softpedia-sec......
  • ubuntu20下企业微信解决中文乱码问题
    主要是参考 ubuntu20.04安装企业微信,以及解决中文乱码及升级最新版本解决的乱码问题,字体是微软雅黑,从 https://github.com/owent-utils/font/blob/master/%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91/MSYH.TTC下载。......
  • gRPC 实现服务端消息推送
    1.gRPC简介gRPC是一种高性能、开源和通用的RPC框架,支持多种编程语言。在gRPC中,有四种类型的RPC,分别是UnaryRPC、ServerStreamingRPC、ClientStreamingRPC和BidirectionalStreamingRPC。UnaryRPC:一元RPC一元RPC是最简单的RPC类型,它是一种单向的请求-......
  • 微信公众号图文添加附件&秀米添加附件?三步轻松实现
    很多人都不知道,其实公众号文章正文是支持添加附件的,只是需要借助一个叫做“文章附件”的网站来实现。公众号自身是不支持直接上传文件的,但是我们可以通过另外的方式来实现。其实原理很简单,公众号文章中是可以添加小程序链接的,把小程序链接对应的小程序页面做成下载页面,就能实现公......
  • 微信小程序开发工具怎样支持xdebug调试
     在做PHP项目时候用xdebug进行调试,如果使用浏览器我一般直接XdebugHelper浏览器插件。配合PHPSTORM进行调试。 微信小程序并不支持cookies,因此需要另想办法,可以在微信小程序的request里加上cookies头,如下代码所示:wx.request({url:'',header:{'Cooki......
  • 后端消息推送-SSE协议
    介绍HTTP服务器推送也称HTTP流,是一种客户端-服务器通信模式,它将信息从HTTP服务器异步推送到客户端,而无需客户端请求。现在的web和app中,越来越多的场景使用这种通信模式,比如实时的消息提醒,IM在线聊天,多人文档协作等。以前实现这种类似的功能一般都是用ajax长轮询,而现......
  • SQL Server非默认实例、默认端口、更改端口后 进行发布订阅 配置
    角色服务器名称实例名称端口发布服务器TEST1mysqlserver14333订阅服务器TEST2mysqlserver14333    解决办法:需要在A和B服务器上分别配置对方的数据库别名操作:SQLServer网络配置->SQLNativeClient10.0配置->别名->新建别名  要求......