nodejs发送模板消息到公众号

功能展示

在这里插入图片描述

1、申请公众号

需要申请企业公众号,公众号需要完成认证才可以使用模板消息功能,认证需要300大洋

2、配置公众号

2.1 公众号-功能-添加功能插件里找到模板消息申请使用(有审核时间需要等待审核通过可以使用)
2.2 审核通过后进入模板消息功能
在这里插入图片描述
在模板消息里可以选择适合自己的模板来使用也可以选择添加新模板(添加新模板有7-15天审核)
在这里插入图片描述
2.3 配置我们后续再代码中需要使用到的appid、 AppSecret
在这里插入图片描述
其中ip白名单需要配置成我们服务器的ip,不配置无法获取后续需要的access_token
在这里插入图片描述

3、nodejs代码

const express = require('express')
const router = express.Router();
const request = require('request')
var path = require("path");
// 获取验证模块(你们不用管着这个,这个是我用来获取数据库数据的方法可以删掉)
var authorization = require(path.join(process.cwd(), "/modules/authorization"));
// 通过验证模块获取订单service(你们不用管着这个,这个是我用来获取数据库数据的方法可以删掉)
var orderServ = authorization.getService("OrderService");
//公众号appid
const appid = '********************'
//公众号secret
const appsecret = '**************'
//模板id
const template_id = '***************'
//测试openid暂时写死
//正式使用需要改成触发本次事件用户在公众号中的openid
//具体怎么获得自己查baidu我这里就不写了
const openid = '*****************'

//获取公众号token
function getToken () {
  return new Promise((resolve, reject) => {
    //需要发送get请求
    const url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret + "";
    let option = {
      url: url,
      method: "GET",
      json: true,
      headers: {
        "content-type": "application/json",
      }
    };
    request(option, function (error, response, body) {
      resolve(body)
    });
  })
}

//对公众号发送模板信息
function sendMessage (access_token, orders) {
  return new Promise((resolve, reject) => {
  	//需要发送POST请求
    const url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' + access_token
    let al = '';
    orders.map(v => {
      al += v.goods_name + v.goods_number + "瓶,"
    })
    al = al.slice(0, -1)
    const order = orders[0]
    const data = {
      "touser": openid,
      "template_id": template_id,
      "data": {
        "first": {
          "value": "订单通知",
          "color": "#173177"
        },
        "keyword1": {
          "value": order.order_number,
          "color": "#173177"
        },
        "keyword2": {
          "value": order.order_name,
          "color": "#173177"
        },
        "keyword3": {
          "value": order.order_phone,
          "color": "#173177"
        },
        "keyword4": {
          "value": order.consignee_addr,
          "color": "#173177"
        },
        "keyword5": {
          "value": order.order_price + '元',
          "color": "#173177"
        },
        "remark": {
          "value": al,
          "color": "#173177"
        }
      }
    }
    let option = {
      url: url,
      method: "POST",
      json: true,
      body: data,
      headers: {
        "content-type": "application/json",
      }
    };
    request(option, function (error, response, body) {
      resolve(body)
    });
  })

}

router.post('/', async (req, res, next) => {
//start 这块代码你们用不到的话跳过就可以了
  //订单编号
  const { order_number } = req.body
  //获取订单信息
  const orders = await new Promise((resolve, reject) => {
    orderServ.getOrderByOrdernumber(order_number, function (err, orders) {
      resolve(orders);
    })(req, res, next);
  })
 //end 这块代码你们用不到的话跳过就可以了
  //获取access_token
  const { access_token } = await getToken()
  //发送模板消息到公众号
  const msgRes = await sendMessage(access_token, orders)
  res.sendResult(msgRes, 200, "登录成功");
});
module.exports = router;
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页