PHP开发Viber Bot用Bogdaan/viber-bot SDK时onConversation触发后无法发欢迎消息
问题定位与修复方案
错误原因
- Bogdaan/viber-bot SDK仅对
onMessage、onText等消息接收事件做了返回值自动发送的封装,onConversation对应Viber的conversation_started会话开启事件,SDK不会自动处理该事件回调的返回值,直接返回消息对象不会触发消息发送。 - 你构造的文本消息对象缺少必填的
receiver(接收用户ID)参数,Viber平台所有消息发送请求都要求明确指定接收者ID,否则会直接拦截请求。 - 若
$botSender配置的名称、头像不符合Viber平台要求(名称与后台注册的机器人名称不一致、头像为非公网HTTPS链接),也会导致消息发送失败。
修复方案
将直接return消息的逻辑改为主动调用SDK的sendMessage方法,补充接收用户ID参数即可,修改后的代码如下:
$bot = new Bot(['token' => $apiKey]); $bot ->onConversation(function ($event) use ($bot, $botSender, $log ) { $log->info('onConversation ' . var_export($event, true)); $userId = $event->getSender()->getId(); $userName = $event->getSender()->getName(); $context = $event->getContext(); if ($context != "" && $context != null) { add_with_referral($userId, $userName, $context); } else { add_user($userId, $userName, $log); } // 主动调用发送接口,补充必填的接收者ID参数 $bot->sendMessage( (new \Viber\Api\Message\Text) ->setSender($botSender) ->setReceiver($userId) ->setText("Can i help you?") ); })
额外校验项
- 确认
$botSender的name字段和Viber开发者后台注册的机器人名称完全一致,若配置了avatar字段,必须为公网可直接访问的HTTPS链接,不能包含鉴权参数或特殊字符。 - 若
add_with_referral、add_user方法执行耗时超过15秒,会导致Viber webhook响应超时,消息发送被中断,建议将用户数据入库逻辑改为异步队列处理。
内容的提问来源于stack exchange,提问作者Никита Кобзарь
相关产品推荐
相关产品推荐

