'components' => [
'bot' => [
'class' => 'frontend\components\TelegramComponent',
'apiToken' => '414134665:AAHfOIdeikQD04NdKckL8wadhqzggvmSqw0',
],
]
<?php
namespace frontend\components;
use SonkoDmitry\Yii\TelegramBot\Component;
class TelegramComponent extends Component
{
public function sendMessage(
$chatId,
$text,
$parseMode = null,
$disablePreview = false,
$replyToMessageId = null,
$replyMarkup = null,
$disableNotification = false
)
{
return parent::sendMessage(
$chatId,
$text,
$parseMode,
$disablePreview,
$replyToMessageId,
$replyMarkup,
$disableNotification
);
}
}
<?php
namespace frontend\controllers;
use app\models\User;
use frontend\components\TelegramComponent;
use yii\db\Exception;
use yii\web\Controller;
class TelegramController extends Controller
{
public function actionWebhook()
{
try{
$bot = new TelegramComponent();
echo $bot->setWebhook(['url' => ['web-hook']]);
} catch (Exception $e){
$e->getMessage();
}
}
public function actionIndex()
{
try{
$content = file_get_contents('php://input');
$chatId = $content['message']['chat']['id'];
$user = User::findOne(\Yii::$app->user->id);
$user->telegram_chat_id = $chatId;
$user->save();
} catch (Exception $e){
$e->getMessage();
}
}
}
use app\models\User;
use frontend\components\TelegramComponent;
use yii\db\Exception;
use yii\filters\AccessControl;
use yii\web\Controller;
use frontend\models\Telegram;
class TelegramController extends Controller
{
public function beforeAction($action)//Обязательно нужно отключить Csr валидацию, так не будет работать
{
$this->enableCsrfValidation = ($action->id !== "webhook");
return parent::beforeAction($action);
}
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['webhook'],
'rules' => [
[
'allow' => true,
'roles' => ['?'],
],
],
],
];
}
public function actionWebhook()
{
$data = json_decode(file_get_contents('php://input'), true);//Обязательно json формат
if(isset($data['message']['chat']['id']))
{
$chatId = $data['message']['chat']['id'];//Получаем chat_id
$message = isset($data['message']['text']) ? $data['message']['text'] : false;
$send = false;
if (strpos($message, '/start') !== false) {//Возвращает позицию
$explode = explode(' ', $message);//Разбивает строку на подстроки
$token = isset($explode[1]) ? $explode[1] : false;//Получаем токен
$data = [
'raw' => $token,
'chat_id' => $chatId,
];
$send = Telegram::start($data);//Сравниваем токен и если имеется схожесть то сохраняем telegram_chat_id в бд
} else {
$send = 'Комманда не найдена. Если Вы уверены в том, что ошибка, обратитесь в тех поддержку';
}
$send = $send ? '' : 'Что-то пошло не по плану. Обратитесь в тех.поддержку';
}
}
}
<?php
namespace frontend\models;
use common\models\User;
class Telegram
{
public static function start($data){
return self::login($data);
}
public static function login($data)
{
$token = $data['raw'];//берем токен который отправляем
if ($token && $user = User::findOne(['token' => $token])) {//сравниваем
if ($user->telegram_chat_id) {
return "Уважаемый $user->name, Вы уже авторизованы в системе. ";
}
$user->telegram_chat_id = $data['chat_id'];//сохраняем chat_id в бд
$user->save();
return "Добро пожаловать, $user->name. Вы успешно авторизовались!";
} else {
return "Извините, не удалось найти данный токен!";
}
}
}