收藏
回答

云调用subscribeMessage.send出现如下问题如何解决?

一、云调用错误如下:

Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fail missing wxCloudApiToken

二、附源码:

async function batchSend(event) {
  const { messages } = event
​
  console.info({event: JSON.stringify(event)})
  console.info('处理订阅消息', messages.length)
  // 循环消息列表
  const sendPromises = messages.map(async message => {
    let { touser, page, data, templateId } = message
    // 发送订阅消息
    await cloud.openapi.subscribeMessage.send({
      touser,
      templateId,
      page,
      data,
    })
  });
​
  await Promise.all(sendPromises)
}

三、现象描述:

  1. 直接云端测试云函数5 次, 结果:失败、成功、失败、成功、成功。
  2. 一旦出错后,会一直报上述错误。需要调用其他云调用成功一次,才可以恢复。恢复后又是间歇性失败。
  3. 其他云调用,如“cloud.openapi.wxacode.getUnlimited”从不会失败。

总结:这个问题已经追踪了两天了,仍然没有找到必现的规律,失败的概率很大,很容易复现。跟其他人说的miniprogram_statestring参数也无关,因为我一直没有传此参数,默认值为formal。

回答关注问题邀请回答
收藏

5 个回答

  • 曹宏涛
    曹宏涛
    2021-03-25

    已找到问题:

    云调用openapi的触发,必须用云函数触发。如果自己的逻辑是指定条件触发,可以用云函数的定时器触发。

    我之前出错是因为:由外部的一套 node服务,用“@cloudbase/node-sdk”包触发的云函数。

    我目前的技术架构是:

    1. 部分逻辑用云函数实现,部分逻辑在一个 node 的服务中实现。
    2. 模板消息逻辑:触发指定条件后,由云函数批量塞到rocketmq消息队列中。然后在 node 中按一定的速度操作消息队列并发送。(为了削峰填谷并维护模板消息的状态)
    3. 如果在 node 中用 http 接口发送,需要自己维护 access_token,再加上我做的消息队列服务这块要同时服务很多小程序,会比较复杂。因此把消息内容发回指定的小程序云函数发送,这样就不用维护多套access_token。

    结论:

    不知道云函数为什么要做这个限制。我目前准备把发送订阅消息,全部在 node 中用 http 接口发送。

    大家有什么其他的方案,也可以给我留言。

    2021-03-25
    有用 2
    回复 5
    • L U C🤫
      L U C🤫
      2021-06-26
      我测试确实是需要小程序端触发才能发送
      2021-06-26
      回复
    • Logix_o
      Logix_o
      2021-09-17
      定时触发器->云函数->发送订阅通知,也不行
      2021-09-17
      1
      回复
    • 珠穆
      珠穆
      2021-11-17
      巨坑!不能用小程序手动模拟触发,必须在云函数里触发
      2021-11-17
      回复
    • 纳格兰晚风
      纳格兰晚风
      2021-12-30回复Logix_o
      是的,我这也不行,接口就是在云函数中调用的,同样报这个错
      2021-12-30
      回复
    • 见龙在田
      见龙在田
      2022-03-16回复Logix_o
      我用云函数的trigger,然后调用cloud.openapi.subscribeMessage.send,虽然能发送出去消息,但是也会出现异常。异常信息如下,也是不得其解。


      exception occured {
        "errCode": -504002,
        "errMsg": "callFunction:fail -504002 functions execute fail. requestID t_1647352800638_12041-17f8de0ebd5_2, TypeError: Do not know how to serialize a BigInt\n at JSON.stringify (<anonymous>)\n at callback (/var/runtime/node12/CallbackContext.js:31:23)\n at /var/runtime/node12/CallbackContext.js:81:16\n at /var/runtime/node12/Runtime.engine.js:237:13\n at processTicksAndRejections (internal/process/task_queues.js:97:5)"
      }
      2022-03-16
      回复
  • 原版橘子皮
    原版橘子皮
    2022-03-09

    开启调试工具,手动云函数触发也不行,这问题坑得不要再坑了,微信能不能醒醒?

    本地测试都没问题的代码,发布到云上。业务到时间了,点云函数测试,竟然各种报这个错,搞啥?

    触发器也有问题,代码写得有错的话,一丁点日志都没有,我都不知道云函数跑了没跑。

    微信云开发实在还是太不成熟,自己玩自己的生态,满地坑

    2022-03-09
    有用
    回复
  • Wdam
    Wdam
    2021-05-25

    没太懂你的解决方案,能详细说说嘛

    2021-05-25
    有用
    回复
  • yinghua
    yinghua
    2021-03-29

    是的 官方说不能用服务端触发,只能用小程序端触发

    2021-03-29
    有用
    回复
  • 陈宇明
    陈宇明
    2021-03-25

    无效参数,你把参数打印检查下

    2021-03-25
    有用
    回复 2
    • 曹宏涛
      曹宏涛
      2021-03-25
      2021-03-25
      回复
    • 曹宏涛
      曹宏涛
      2021-03-25
      问题是多次测试时,参数没有变化过。但是有时候正确,有时候错误。
      2021-03-25
      回复
登录 后发表内容
问题标签