收藏
回答

企业微信客服,接收消息和事件。如何得知回调事件与消息列表里面的具体哪一条消息是关联的呢?

收到的回调事件里面并没有有价值的信息,如下:

<xml>
    <ToUserName>
        <![CDATA[ww897b5b25811a6935]]>
    </ToUserName>
    <CreateTime>1652421098</CreateTime>
    <MsgType>
        <![CDATA[event]]>
    </MsgType>
    <Event>
        <![CDATA[kf_msg_or_event]]>
    </Event>
    <Token>
        <![CDATA[ENCFG7dkUb7fxCr69qHM9wUtKiG5xZcHwCVn5evBcNwhYio]]>
    </Token>
</xml>


通过token,调用读取消息API,得到是的是个列表。

{
    "errcode":0,
    "msg_list":[
        {
            "msgid":"MXbuYYJYGqC7TXxX9XCCq1zsauJJarCezFsPvGQTh",
            "open_kfid":"wkBxgUCAAAQIqDO0UIcFg2ioTFYzHpXg",
            "external_userid":"wmBxgUCAAAnSN7-a3duAYORYF2vSxo-w",
            "send_time":1652421128,
            "origin":3,
            "msgtype":"text",
            "text":{
                "content":"啊啊啊啊啊"
            }
        }
    ],
    "next_cursor":"HHFq49uYHoiCuZRv9Png",
    "errmsg":"ok",
    "has_more":0
}

这里即使 "limit"1 拉取最新的一条数据,也可能存在多个回调然后合并了消息,如何得知回调事件与消息列表里面的具体哪一条消息是关联的呢?
回答关注问题邀请回答
收藏

1 个回答

  • WXY
    WXY
    05-17

    微信客服的回调事件只是通知有新的消息/事件,回调数据中没有告诉是谁发的、发的内容,需要企业通过接口读取。如果你请求读取消息的时不填cursor和limit,会有读取大于1条消息的情况。关键参数cursor是每次读取消息时返回的next_cursor,如下第3行:

    {
        "errcode": 0,
        "errmsg": "ok",
        "next_cursor": "4gw7MepFLfgF2VC5npN",
    	"has_more": 1,
        "msg_list": [
            {'222gujiguji': 'balbalbala'},
            {'333gujiguji': 'balbalbala'}
         ]
     }
    


    按照API文档的建议是每次读取消息都要存一下的cursor,下一次请求加上,例如加上 {'cursor': 'b4Hidu7Dcy7GLh', 'limit': '10'}, 就可以获取从这个cursor之后的10条数据。

    05-17
    有用
    回复 2
    • WXY
      WXY
      05-17
      有个需要处理的坑(也许不会经常遇到)假如有20个用户同时点击了关注或发送了消息。在收到微信的回调事件后,再通过API读取消息保存下来的cursor,哪个是最新的呢?😑这些请求的间隔只相差几微秒,后端按照时间和msgid来去重、排列也不一定得出实际最新产生的那个cursor,也许只要保存微信服务器发来的最后那个请求中的cursor。。。
      05-17
      回复
    • CRUD Boy
      CRUD Boy
      星期二 09:27
      好的,明白了,谢谢哈
      星期二 09:27
      回复
登录 后发表内容