driverx18: да, остальное можно оставить в конструкторе. Повторяющийся код, например, билдинг строки запроса почти одинаковый в sendMessage и sendContact, можно вынести в
protected function request($method, $payload)
...
sendMessage($message) {
$this->request('sendMessage', $message)
...
1) это стандарт, в дальнейших проектах будет проще, особенно когда сложность требуемых запросов возрастет 2) так удобней 3) что, если потребуется послать кастомный запрос, например, POST? file_get_contents отпадает, встроенные функции для работы для работы с curl морально устарели 4) что, если тут $this->chatId . '&text=' . $msg); в $msg попадет ¶m=value? Это уже надо строку специально обрабатывать. И таких примеров много.
Станислав: поддержка браузеров и размеров - это все достигается очень легко через autoprefixer и строчкой с medua query.
А вот кнопки и availability согласен, тут сложнее.
https://serviceworke.rs/push-payload_server_doc.html