Сервисы

Как настроить уведомления из Github Actions в Discord

Настраиваем уведомления о событиях через Github Actions в Discord. Мы с командой стали использовать Discord для рабочей коммуникации, в одном из каналов хотели настроить уведомления из Github-репозитория о результатах работы CI/CD.

Что мы сделаем: когда появился новый пул-реквест или появились коммиты в открытом пул-реквесте, нужно прогнать тесты и отправить результат в Дискорд.

Для работы с Дискордом из Гитхаб Экшнс будем использовать готовый экшн appleboy/discord-action@master. Делаем вот так в файле .github/workflows/main.yml:

name: Testing
on: [pull_request]

jobs:
  testing:
    name: Testing
    runs-on: ubuntu-18.04
    steps:
      - name: Send start notification to Discord
        uses: appleboy/discord-action@master
        with:
          webhook_id: ${{ secrets.DISCORD_WEBHOOK_ID }}
          webhook_token: ${{ secrets.DISCORD_WEBHOOK_TOKEN }}
          color: "#8b9b9c"
          username: "GitHub Bot"
          message: |
            Tests started by 👤 ${{ github.actor }}
            From `${{ github.head_ref }}` to `${{ github.base_ref }}`
            Event `${{ github.event_name }}`
            PR ${{ github.event.number }}: ${{ github.event.pull_request.url }}

После этого нужно добавить сикреты в раздел Secrets в настройках репозитория в Гитхабе. Поскольку сикреты содержат в себе информацию о вебхуке Дискорда, то сначала создадим вебхук. Переходим в настройки сервера, идём в вебхуки и создаём вебхук:

Создаём вебхук в Дискорде

После того, как сделали вебхук — копируйте ссылку и переходите по ней. Ссылка выглядит примерно так: https://discordapp.com/api/webhooks/{id}/{token}. Копируем из ссылки id и token, используем их для добавления сикретов в настройках репозитория в гитхабе.

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

Результат работы уведомлений в Дискорде

Как сбросить кеш VK, FB и Telegram для Opengraph-изображений

Бывает так, что вы расшарили ссылку на свой сайт в соцсетях, после чего изменили на сайте картинку-превью или заголовок, а соцсети не подтягивают новые данные. Это происходит потому, что сервисы один раз получают информацию о ссылке и сохраняют её у себя в кеше, и в следующий раз уже берут информацию из своего кеша. Как заставить соцсети обновить информацию о своей ссылке?

Сбросить кеш в Фейсбуке

https://developers.facebook.com/tools/debug/

Переходим по ссылке — это дебаг-панель Фейсбука. В форме сверху указываем ссылку на свой сайт и загружаем результат. Для обновления данных нужно нажать кнопку «Повторить скрапинг».

Как сбросить кеш Фейсбук для ссылки
Дебаг-панель для сброса кеша Фейсбука

Сбросить кеш Вконтакте

https://vk.com/dev/pages.clearCache

Открываем страницу, прокручиваем вниз к форме для указания ссылки, заполняем её и жмём «Выполнить». В случае успеха вы увидите надпись response: 1. После этого можете расшаривать Вконтакте вашу ссылку с новой превью.

Пример сброса кеша Вконтакте. Результат выполнения — успешно (response: 1)

Сбросить кеш для Телеграма

Пишем боту @WebpageBot, далее просто следуем инструкциям: отправьте ссылку боту, дальше он сам всё сделает. В ответном сообщении пришлёт обновлённые данные и кнопки для повторного обновления данных на случай, если вы в режиме реального времени вносите изменения и занимаетесь отладкой.

Пример работы бота

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

Когда ваш сайт получает нотификацию от Тинькофф-банка, он конкатенирует все параметры запроса и высчитывает 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);
}

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

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

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

Ошибка SSL connect error при работе с PayPal IPN в PHP

ПэйПал недавно внес изменения в свои сервисы, из-за чего часть IPN-слушателей (Listeners) могли не работать.

Вот пример кода моего IPN-listener:

$uri = 'https://'.$this->getPaypalHost().'/cgi-bin/webscr';
$this->post_uri = $uri;
$ch = curl_init();

if ($this->verify_ssl) {
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CAINFO, dirname(dirname(__FILE__)) . '/cert/api_cert_chain.crt');
}

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->follow_location);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);

$this->response = curl_exec($ch);
$this->response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));


Однако при проверке IPN-запроса к Пэйпал я получал SSL connect error.

Решение простое — необходимо обновить библиотеку curl до версии 7.34+.

Подробнее можно почитать на стэковерфлоу.