The package provides a solution for retrieving chat ID.
Package uses irazasyed/telegram-bot-sdk. So above all follow
Telegram Bot SDK
instructions
and set up your first Telegram Bot. Most likely you need to run:
php artisan vendor:publish --tag="telegram-config"
In config/telegram.php configuration file add bot name parameter and
register DeeplinkCommand. You may not define webhook_url as it will be
reconfigured on a fly.
# config/telegram.php
'bots' => [
'my_bot' => [
'name' => env('TELEGRAM_BOT_NAME'),
'token' => env('TELEGRAM_BOT_TOKEN'),
'certificate_path' => env('TELEGRAM_CERTIFICATE_PATH'),
//'webhook_url' => env('TELEGRAM_WEBHOOK_URL'),
'commands' => [
\Codewiser\Telegram\Commands\DeeplinkCommand::class
],
],
]Implement \Codewiser\Telegram\Contracts\TelegramNotifiable to a
User model. You might need to write a migration...
use \Illuminate\Notifications\Notifiable;
use \Illuminate\Database\Eloquent\Model;
use \Codewiser\Telegram\Contracts\TelegramNotifiable;
class User extends Model implements TelegramNotifiable
{
use Notifiable;
public function routeNotificationForTelegram($notification = null): mixed
{
return $this->telegram_user_id;
}
public function setRouteForTelegram($route): void
{
$this->telegram_user_id = $route;
$this->save();
}
}Now, create service to implement
\Codewiser\Telegram\Contracts\TelegramNotifiableProvider. This is an
example of implementation, your may implement it however you like.
use \Codewiser\Telegram\Contracts\TelegramNotifiableProvider;
class TelegramUserProvider implements TelegramNotifiableProvider
{
/**
* Issue and remember new token for a given notifiable.
*/
public function generateToken(TelegramNotifiable $notifiable): string
{
$token = Str::random(40);
cache()->set(
$token,
[
'key' => $notifiable->getKey(),
'model' => get_class($notifiable),
],
now()->addMinutes(5)
);
return $token;
}
/**
* Find notifiable associated with a given token.
*/
public function resolveToken(string $token): ?TelegramNotifiable
{
$notifiable = cache()->pull($token);
if ($notifiable) {
$key = $notifiable['key'];
$model = $notifiable['model'];
return $model::find($key);
}
return null;
}
}At last, register this service in AppServiceProvider of your application
public function register()
{
$this->app->singleton(TelegramNotifiableProvider::class, fn() => new TelegramUserProvider);
}We are ready to go.
If you are properly configure bot in config/telegram.php this is enough
to use telegram:webhook command provided by Telegram Bot SDK
package. We recommend to read help:
php artisan help telegram:webhook
This package provides webhook controller to deal with incoming messages.
For example DeeplinkCommand, that was
mentioned above, used to handle /start command with deeplink token.
You are free to add any other command handlers to config/telegram.php.
Read more about Bot Commands.
This package brings telegram:poll command to get updates without
registering webhook. Just call a command.
First, we need to issue a deeplink for a user.
use \Illuminate\Http\Request;
use \Codewiser\Telegram\TelegramService;
class DeeplinkController extends Controller
{
public function __invoke(Request $request, TelegramService $service) {
return $service->getDeeplink($request->user());
}
}User follows deeplink, opens telegram client and presses Start button.
Codewiser\Telegram\Commands\DeeplinkCommand handles incoming update,
resolves deeplink token and update User with chat_id.
For now, this user has telegram route and may be notified via Telegram.