官方文档 里是这么说的:

如果小程序设置了消息推送,普通微信用户向小程序客服发消息时,微信服务器会先将消息 POST 到开发者填写的 url 上,如果希望将消息转发到网页版客服工具,则需要开发者在响应包中返回 MsgType 为 transfer_customer_service 的消息,微信服务器收到响应后会把当次发送的消息转发至客服系统。

{
    "ToUserName": "touser", 
    "FromUserName": "fromuser", 
    "CreateTime": "1504490042", 
    "MsgType": "transfer_customer_service"
}

第一感觉就是把上面这个响应通过 发送消息 的接口发给微信服务器。

后来才发现错的太离谱了。搜了下 transfer_customer_service 这个关键词,基本都是转载官方的更新记录,没找到实例。

事实上,就如同文档所说,在响应包中返回,示例如下:

public function main(Request $request)
{
    $msg = $request->json()->all();

    if ($msg['MsgType'] == 'text' || $msg['MsgType'] == 'image') {
        // 5 分钟内只回复一次
        $now = time();
        if ($now - cache($msg['FromUserName']) > 300) {
            cache([$msg['FromUserName'] => $now], 5);
            $this->sendMessage('balabala...');
        }

        // 转发到官方客服系统
        $data = [
            'ToUserName'    => $msg['FromUserName'],        // 用户 OpenID
            'FromUserName'  => $msg['ToUserName'],          // 小程序 ID
            'CreateTime'    => $msg['CreateTime'],
            'MsgType'       => 'transfer_customer_service'
        ];
        return json_encode($data);
    }

    return 'success';
}

用户发多条信息过来,自动回复只回复一次,不会太烦,同时,把用户的消息转发给网页客服工具。