收藏
回答

订阅消息,subscribeMessage.send报43101

框架类型 问题类型 终端类型 AppID 环境ID 基础库版本
小程序 Bug 微信iOS客户端 wx8100e90348aee741 zqb-business-4gshc9mc29f54068 2.16.1

背景介绍:小程序已经上线三个月了,发送订阅消息的云函数是在其它云函数内采用cloud.callFunction调用功能来触发的。

有90%以上的用户接收不到订阅消息。

我同事们的手机,经过我确认,已经授权,并且多次授权。有的可以接收到,有的接收不到。

请问这种BUG怎么排查?

另外,发送订阅消息的云函数报以下错误,看不出来所以然:

[这里是正常的日志...]

 {"traceId":"86ea4f96fca24a63a90d506bcc25396c","functionName":"sendMsg","childOf":"","errorMessage":"","errorCode":"","source":"server-sdk","invoker":"administrator","ua":"tcb-node-sdk/2.4.7","invokerIp":"9.193.48.125","spanId":"b917805c66db2ee3","service":"function","startTime":"1642144193175","endTime":"1642144196783","event":"InvokeFunction","timeCost":"3608","seqId":"1642144197878_0.5277659077549728_16841746-17e576bda87_4"}

REPORT RequestId:f890700e-7508-11ec-abeb-52540048fc82 Duration:2911ms Memory:256MB MemUsage:104.827232MB

END

以上

----------------------------------------分隔线----------------------------------------

经过郑旭东提醒,改成延时调用发送订阅消息的云函数,上面的红色字体报错消息没有了。

不过,多次授权的还是会接收不到消息,报43101错误,不知道问题出在哪里...

把代码付上:

  const tasks = []
  for (saler of salerList) {
    const promise = new Promise((resolve,reject)=>{
      const _saler = {
        salerID: saler._id,
        nickName: saler.nickName,
        _openid: saler._openid
      }
      cloud.openapi.subscribeMessage.send({
        "touser": _saler._openid,
        "page": '...',
        "lang": 'zh_CN',
        "templateId": '...',
        "miniprogramState": 'formal',
        "data": {
          ...
        }
      }).then(res=>{
        resolve(Object.assign({},res,_saler))
      }).catch(err=>{
        resolve(Object.assign({},err,_saler))
      })
    })
    tasks.push(promise)
  }
  // 等待所有任务执行完成
  await Promise.all(tasks).then(async(res) => {
    console.log("发送完成", res.length)
    const successList = res.map((saler)=>saler.errCode === 0 ? saler.salerID : null).filter((salerID)=> salerID !== null)
    const refuseList = res.map((saler)=>saler.errCode === 43101 ? saler.salerID : null).filter((salerID)=> salerID !== null)
    console.log("发送成功:", successList.length)
    console.log("发送失败[拒绝接收]:", refuseList.length)
    //提取发送成功的saler._id用于数据库更新
    await db.collection('saler').where({
      _id: _.in(successList)
    }).update({
      data: {
        "accecpNoticeNum": _.inc(-1)
      }
    })
  }).catch(function(err) {
    console.log("Promise.all err", err)
  })

以上

谁能帮帮我!!!

最后一次编辑于  2022-01-26
回答关注问题邀请回答
收藏

1 个回答

  • 郑旭东
    郑旭东
    2022-01-14

    cloud.callFunction前面写await了吗?

    2022-01-14
    有用
    回复 5
    • 陈浩
      陈浩
      2022-01-16
      没有呢
      2022-01-16
      回复
    • 郑旭东
      郑旭东
      2022-01-16回复陈浩
      异步执行云函数,该云函数不能正常发送订阅消息。你加上await试下
      2022-01-16
      回复
    • 陈浩
      陈浩
      2022-01-17回复郑旭东
      哦,还有这种说法?我试试先。不过我倾向于使用延时调用。先试试先。谢谢了。
      2022-01-17
      回复
    • 郑旭东
      郑旭东
      2022-01-17回复陈浩
      延时调用固然很好,所以你可以维持延时调用业务逻辑,同时把你的发送消息的逻辑改造到即时调用里。
      2022-01-17
      回复
    • 陈浩
      陈浩
      2022-01-18回复郑旭东
      改成延时调用发送订阅消息的云函数,上面的报错消失了。
      cloud.openapi.subscribeMessage.send函数是使用await调用的
      不过,多次授权的还是会接收不到消息,报43101错误,不知道问题出在哪里...
      2022-01-18
      回复
登录 后发表内容