Рубрика: Без рубрики

Почему Тинькофф-эквайринг АПИ не удаётся проверить токен

Когда ваш сайт получает нотификацию от Тинькофф-банка, он конкатенирует все параметры запроса и высчитывает sha256-хеш. Алгоритм простой, но есть несколько нюансов:

  1. Нужно удалить из входящих параметров поле Token;
  2. Нужно добавить параметр Password, который содержит пароль от терминала (указан в личном кабинете);
  3. Самое важное! Поле Success нужно привести из boolean в строку «true» или «false», иначе при конкатенации PHP будет подставлять в строку 1 или 0, из-за чего сгенерированный вами токен не будет совпадать с пришедшим от банка.

Вот так выглядит функция генерации токена:

/**
 * @return string
 */
public function generateToken($data) : string
{
    $data = array_except($data, 'Token');
    $data = array_merge($data, ['Password' => config('tinkoff.secretKey')]);

    // Success field to string
    $data['Success'] = $data['Success'] ? 'true' : 'false';

    ksort($data);
    $data = implode(array_values($data));

    return hash('sha256', $data);
}

Как сконвертировать PDF в изображение (JPG, PNG) с помощью PHP

Это можно сделать с помощью Imagick, но это не очень удобно:

$imagick = new Imagick('file.pdf[0]');
$imagick->setImageFormat('jpg');
file_put_contents($pathToImage, $imagick);

Вместо этого можно подключить пакет spatie/pdf-to-image ( composer require spatie/pdf-to-image ) и использовать его:

$pdf = new Spatie\PdfToImage\Pdf('file.pdf');
$pdf->saveImage($pathToImage);

Вы можете явно указать расширение файла в $pathToImage. Если не укажите, то изображение по-умолчанию сохранится в JPG.

Ошибка отправки почты через Яндекс (SMTP)

На одном проекте почта отправляется через сервис Яндекса «Почта для домена». Всё работало отлично, пока кто-то из менеджеров не решил обновить настройки почтовой программы. Настройки обновил, и в это же время перестала уходить почта с сайта:

Failed to authenticate on SMTP server with username ...
Читать далее

Как получить Email пользователя при авторизации Вконтакте через Laravel Socialite

Стандартный способ получения эл. почты в Laravel Socialite не работает для Вконтакте:

$userSocial = Socialite::driver('vkontakte')->user();
$user = new User;
$user->name = $userSocial->name;
$user->email = $userSocial->email;
$user->save();

Это происходит потому, что Вконтакте возвращает ответ в нестандартном формате JSON. Вот так можно получить почту пользователя:

public static function getUserEmail($user, $provider)
{
    if($provider == 'vkontakte') {
        return $user->accessTokenResponseBody['email'] ?? null;
    }
    return $user->email;
}

Yii2 и label у hidden-поля в ActiveForm

Для меня было полной неожиданностью, что yii2 по-умолчанию отображает label у скрытого поля. Но спрятать его достаточно просто:

echo $form->field($model, 'user_id')->hiddenInput()->label(false);

Скругленные края у таблицы в Bootstrap

Обычный border-radius для бутстраповской таблицы не даст нужного эффекта. Края у таблицы всё равно останутся без скругления.

Документация рекомендует использовать такой способ для скругления краев у таблицы:

<div class="panel panel-default">
    <table class="table table-striped"> ... </table>
</div>

Как настроить папку public_html в Yii2

У новичков часто возникает проблема при выгрузке Yii2-приложения на хостинг с папкой public_html. По-умолчанию, Yii2 использует папку web для хранения index. php и статики.

Исправляется все достаточно просто. Добавляем символьную ссылку:

rm public_html && ln -s application/web public_html

AccessControl в Yii2 редиректит на site/login

AccessControl в Yii2 при запрете доступа (403 ошибка) перенаправляет на адрес site/login.

Поменять адрес можно в настройках компонента User:

'components' => [
        'user' => [
            'identityClass' => 'app\models\User', 
            'enableAutoLogin' => true, 
            'loginUrl' => ['/account/login']
        ],
    ],

Если указать loginUrl как null, то вместо редиректа будет отображаться 403 ошибка.

Подробнее в документации компонента yii\web\User.

Как передать Yii2 один-ко-многим в Backbone

При передаче коллекции со связями, нужно обязательно указать asArray (), иначе атрибут не заполняется в модели, бекбон ругается.

$collection = MindLeak::find()
    ->where([
        'user_id' => Yii::$app->user->identity->id,
        'is_predefined' => MindLeak::PREDEFINED_NO
    ])
    ->joinWith('examples')
    ->asArray()
    ->all();