Node.js开发微信公众号4 - 发送模板

news/2024/7/10 0:09:56 标签: vue, nodejs, websocket, ajax, post

1.先要在后台创建一个自定义模板

模板内容如下

{{first.DATA}}
姓名:{{keyword1.DATA}}
性别:{{keyword2.DATA}}
体温:{{keyword3.DATA}}
{{remark.DATA}}

2.发送模板服务,此服务需要请求携带用户参数用户自定义模板内容

router.post("/sendTemplateMsg", async (req, res, next) => {
  try {
    // 接受h5请求的用户参数
    const infoData = req.body
    // 获取access_token
    const { access_token } = await accessToken.fetchAccessToken()
    // 发送模板
    await sendTemplateMsg(infoData, access_token)
    res.send({
      state: "success",
      msg: "模板消息推送成功",
    })
  } catch (error) {
    console.log("模板消息推送失败:" + error)
    next(error)
  }
})

3.发送模板核心代码,会根据对应用户open_id 发送对应用户公众号

const rp = require("request-promise-native") //发送请求

class Template {
  constructor() {}
  sendTemplateMsg(userInfo, access_token) {
    const url = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${access_token}`
    const requestData = {
      touser: userInfo.openid, //openid
      template_id: "xxx", //模板id
      url: userInfo.avatar, //跳转url
      data: { //模板数据
        first: {
          value: "身份信息",
          color: "#173177",
        },
        keyword1: {
          value: userInfo.nickname,
          color: "#1d1d1d",
        },
        keyword2: {
          value: userInfo.sex === 1 ? "男" : "女",
          color: "#1d1d1d",
        },
        keyword3: {
          value: userInfo.phone,
          color: "#1d1d1d",
        },
        remark: {
          value: userInfo.msg,
          color: "#173177",
        },
      },
    }

    const options = {
      url,
      method: "POST",
      json: true,
      headers: {
        "content-type": "application/json",
      },
      body: requestData,
    }

    return new Promise((resolve, reject) => {
      rp(options)
        .then(() => {
          console.log("发送模板成功")
          resolve()
        })
        .catch((err) => {
          console.log(`发送模板失败: ${err}`)
          reject(err)
        })
    })
  }
}

const template = new Template()

module.exports = template

 


http://www.niftyadmin.cn/n/1319189.html

相关文章

黑马程序员-12 网络编程

------- android培训、java培训、期待与您交流! ---------- 传输协议UDP 将数据及源和目的封装到数据包中,不需要建立连接; 每个数据包的大小限制在64K以内; 因无连接,是不可靠协议; 不需要建立连接&#x…

前端面试题CSS-两盒子水平垂直居中

让子盒子在父盒子里水平垂直居中 只要回答一个就好了 1.定位 父盒子设置: position:relative; 子盒子-已知宽高: position:absolute;top:50%;left:50%;mar…

Java:定时启动线程

这里提供两种在指定时间后启动线程的方法。一是通过java.util.concurrent.DelayQueue实现;二是通过java.util.concurrent.ScheduledThreadPoolExecutor实现。1. java.util.concurrent.DelayQueue类DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中…

PL/SQL块定义部分--LOB类型

在Oracle的早期版本中,使用LONG 和 LONG RAW 类型存放大数据。从8i版本开始,Oracle引入了LOB数据类型,并且Oracle建议开发人员尽量去使用LOB类型而不去使用 LONG 和 LONG RAW 。LOB类型和LONG、LONG RAW类型相比有几个不同的地方。如&#xf…

前端面试题CSS-盒子模型

三种盒子模型 1.标准盒子模型 css对应的属性:box-sizing:content-box 设置的元素大小是内容的大小,不是盒子的大小 盒子的大小 content padding border margin 2.IE盒子模型(怪异盒子模型 ) css对应的属性&am…

Surface初体验

由于研发需要公司购入了一台Surface RT,今天拿到后玩了玩,发点牢骚。先说硬件,Surface RT的配置还是不错的,T30 双核处理器,2GB内存,在使用过程中感觉非常流畅。自从开始买了iPad以后,再使用其…

windows命令行下启动oracle[转载]

--总结启动命令如下:lsnrctl [start|stop|status] --启动监听器,停止监听器,查看监听器的状态;net [start|stop] oracleserviceorcl 一、独立启动&…

前端ACE加密和解密

下载依赖 yarn add crypto-js 在vue中使用 import CryptoJS from crypto-js export default {data () {return {strKey: CryptoJS.enc.Utf8.parse("SKYWORTH"), //十六位十六进制数作为密钥iv: CryptoJS.enc.Utf8.parse(IDS), //十六位十六进制数作为密…