一、云调用错误如下:
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)
}
三、现象描述:
- 直接云端测试云函数5 次, 结果:失败、成功、失败、成功、成功。
- 一旦出错后,会一直报上述错误。需要调用其他云调用成功一次,才可以恢复。恢复后又是间歇性失败。
- 其他云调用,如“cloud.openapi.wxacode.getUnlimited”从不会失败。
总结:这个问题已经追踪了两天了,仍然没有找到必现的规律,失败的概率很大,很容易复现。跟其他人说的miniprogram_statestring参数也无关,因为我一直没有传此参数,默认值为formal。
已找到问题:
云调用openapi的触发,必须用云函数触发。如果自己的逻辑是指定条件触发,可以用云函数的定时器触发。
我之前出错是因为:由外部的一套 node服务,用“@cloudbase/node-sdk”包触发的云函数。
我目前的技术架构是:
结论:
不知道云函数为什么要做这个限制。我目前准备把发送订阅消息,全部在 node 中用 http 接口发送。
大家有什么其他的方案,也可以给我留言。
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)"
}
开启调试工具,手动云函数触发也不行,这问题坑得不要再坑了,微信能不能醒醒?
本地测试都没问题的代码,发布到云上。业务到时间了,点云函数测试,竟然各种报这个错,搞啥?
触发器也有问题,代码写得有错的话,一丁点日志都没有,我都不知道云函数跑了没跑。
微信云开发实在还是太不成熟,自己玩自己的生态,满地坑
没太懂你的解决方案,能详细说说嘛
是的 官方说不能用服务端触发,只能用小程序端触发
无效参数,你把参数打印检查下
{
touser: 'o2qwy5d-olNi4ws_mHYPjlyAhsCQ',
templateId: 'OsMv2UzJQhcPgxoqIrQ6w0xaadnK4-zVkGZqYxsSpvE',
page: 'pages/main/lottery-profile/lottery-profile?activityId=0SRF9SddDoWEiJ',
data:
{
date2: { value: '2021年3月25日 11:00' },
thing1: { value: '恭喜你!获得【十年珍...】免费抽奖名额' },
thing4: { value: '抽奖名额即将过期,请尽快参与抽奖>>' }
}
}