微信小程序云开发,定时发送订阅消息报错:{ Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fai

整天净瞎bb搞...

新的订阅消息来了,什么玩意?省去了formID 的模板消息,对字段类型还控制,也算是给前后端都省了一个方法,但是!要授权啊!好吧,前端又回来了,总结:折腾。

搞起来发现用户触发云函数可以发送模板消息,但定时执行会报错:

{ Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fail Invalid request param

    at new CloudSDKError (/var/user/node_modules/wx-server-sdk/index.js:6389:28)

    at Object.<anonymous> (/var/user/node_modules/wx-server-sdk/index.js:424:35)

    at step (/var/user/node_modules/tslib/tslib.js:136:27)

    at Object.next (/var/user/node_modules/tslib/tslib.js:117:57)

    at fulfilled (/var/user/node_modules/tslib/tslib.js:107:62)

    at <anonymous>

    at process._tickCallback (internal/process/next_tick.js:188:7)

  errCode: -501007,

  errMsg: 'subscribeMessage.send:fail Invalid request param' }

这不是和原来模板消息 一样的问题吗?还是需要用户点击?真是改了个j8...

算了,还是用request-promise请求吧,懂的直接到后面复制代码。

第一步:云函数中:package.json 中增加引用 request-promise

"dependencies": {
    "wx-server-sdk": "latest",
    "request-promise": ""
 }

第二步

新建集合(表明)accessToken,添加记录:

“_id”:“ACCESS_TOKEN”

新建云函数timerGetAccessToken,搞成定时执行,调用时间:"config": "10 2 */1 * * * *" 每一小时一次

这个方法同样引入request-promise

目的是获取有效token保存起来拱send使用

//timerGetAccessToken
const cloud = require('wx-server-sdk')
cloud.init({
  env: 'test-mmmmm'
  // env: 'jvben-rrrrr'
})
const db = cloud.database()
const coll_token = db.collection('accessToken');
const rq = require('request-promise')
const APPID = 'wxb*********';
const APPSECRET = 'a************************';

exports.main = async (event, context) => {
  try {
    let res = await rq({
      method: 'GET',
      uri: "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET,
    });
    res = JSON.parse(res)
    let resUpdate = await coll_token.doc('ACCESS_TOKEN').update({
      data: {
        token: res.access_token
      }
    })
  } catch (e) {
    console.error(e)
  }
}

到这里先执行一下timerGetAccessToken 看access_token获取到没

第三步

在你的定时发送函数下新建templateMessage.js,代码如下

const rp = require('request-promise');
const sendTemplateMsg = async(token, param) => {
  return await rp({
    json: true,
    method: 'POST',
    uri: 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' + token,
    body: {
      touser: param.touser,
      template_id: param.templateId,
      page: param.page,
      data: param.data
    }
  }).then(res => {
    return true
  }).catch(err => {
    return false
    console.error(err)
  })
}
module.exports = {
  sendTemplateMsg: sendTemplateMsg,
}

index.js中:写sendMsg方法传参调用就可以了:

const templateMessage = require('templateMessage.js')
const cloud = require('wx-server-sdk')

async function sendMsg(data) {
  let tokenRes = await db.collection("accessToken").doc("ACCESS_TOKEN").get();
  let token = tokenRes.data.token; // access_token
  let param = {
    touser: data.openId,
    page: '******',
    data: {
      thing1: {
        value:"啊实打实大" 
      },
      date2: {
        value:"2019-12-12" 
      }
    },
    templateId: '******************************',
  }
  var result = await templateMessage.sendTemplateMsg(token, param);
  return result
}

结束:没啥想说的,感觉这个问题未来会修复,毕竟人家云开发都有几万的套餐了。。。。

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值