Интеграция 1С-Битрикс с Pushwoosh
Pushwoosh — российский сервис push-уведомлений, работающий через собственную инфраструктуру поверх FCM/APNs. Преимущество перед прямой интеграцией с FCM: единый API для Web Push, Android, iOS и Huawei; встроенные сегменты, A/B-тесты, аналитика. Интеграция с 1С-Битрикс включает SDK на фронтенде, PHP-клиент для отправки и привязку Pushwoosh-устройств к пользователям Битрикс.
Структура интеграции
Pushwoosh использует понятие hwid (hardware ID) — уникальный идентификатор устройства в Pushwoosh. Нужно хранить соответствие: USER_ID Битрикс → hwid[] Pushwoosh. Один пользователь — несколько hwid (браузеры + мобильные устройства).
Pushwoosh SDK (JS/Android/iOS)
→ Получает hwid, регистрирует устройство в Pushwoosh
→ POST /local/api/pushwoosh/register (привязка hwid к USER_ID)
→ Битрикс событие (заказ, акция)
→ PHP → Pushwoosh API (sendMessage/createMessage)
→ Pushwoosh → FCM/APNs → устройство
Инициализация Web SDK
<script src="https://cdn.pushwoosh.com/webpush/v3/pushwoosh-web-notifications.js"></script>
<script>
var Pushwoosh = Pushwoosh || [];
Pushwoosh.push(['init', {
logLevel: 'error',
applicationCode: 'XXXXX-YYYYY', // Application Code из Pushwoosh Dashboard
safariWebsitePushID: 'web.com.example.shop',
defaultNotificationTitle: 'Магазин Пример',
defaultNotificationImage: 'https://example.com/push-icon.png',
autoSubscribe: false, // управляем подпиской вручную
serviceWorkerUrl: '/pushwoosh-service-worker.js',
}]);
Pushwoosh.push(function(api) {
api.onReady(function() {
// Регистрируем hwid в Битрикс
api.getHWID().then(function(hwid) {
if (hwid) {
registerPushwooshDevice(hwid);
}
});
});
});
function registerPushwooshDevice(hwid) {
fetch('/local/api/pushwoosh/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Bitrix-Csrf-Token': BX.bitrix_sessid()
},
body: JSON.stringify({ hwid: hwid, platform: 'web' })
});
}
// Кнопка подписки
document.getElementById('subscribe-push').addEventListener('click', function() {
Pushwoosh.push(function(api) {
api.subscribe().then(function() {
Pushwoosh.push(function(api) {
api.getHWID().then(registerPushwooshDevice);
});
});
});
});
</script>
Service Worker /pushwoosh-service-worker.js в корне сайта:
importScripts('https://cdn.pushwoosh.com/webpush/v3/pushwoosh-service-worker.js');
Хранение hwid и PHP-клиент Pushwoosh API
class PushwooshService
{
private string $appCode;
private string $apiAccessToken;
private string $apiUrl = 'https://cp.pushwoosh.com/json/1.3/';
public function createMessage(array $recipientHwids, string $content, array $extra = []): array
{
$payload = [
'request' => [
'application' => $this->appCode,
'auth' => $this->apiAccessToken,
'notifications' => [[
'send_date' => 'now',
'ignore_user_timezone' => false,
'content' => $content,
'devices' => $recipientHwids, // массив hwid
'data' => $extra['data'] ?? [],
'ios_title' => $extra['title'] ?? '',
'android_header' => $extra['title'] ?? '',
'link' => $extra['url'] ?? '',
]],
],
];
return $this->request('createMessage', $payload);
}
public function sendMessageToUser(int $userId, string $content, string $title = '', string $url = ''): void
{
$hwids = PushwooshDeviceTable::getHwidsByUserId($userId);
if (empty($hwids)) return;
$this->createMessage($hwids, $content, ['title' => $title, 'url' => $url]);
}
/**
* Массовая рассылка по тегу пользователя (сегментация)
* Например: пользователи, купившие товар из категории X
*/
public function createMessageByTag(string $tagName, string $tagValue, string $content): array
{
$payload = [
'request' => [
'application' => $this->appCode,
'auth' => $this->apiAccessToken,
'notifications' => [[
'send_date' => 'now',
'content' => $content,
'conditions' => [[$tagName, 'EQ', $tagValue]],
]],
],
];
return $this->request('createMessage', $payload);
}
private function request(string $method, array $data): array
{
$ch = curl_init($this->apiUrl . $method);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
return $response ?? [];
}
}
Теги Pushwoosh для сегментации
Pushwoosh поддерживает теги — пользовательские атрибуты устройства. Это позволяет отправлять уведомления по сегментам без передачи списка hwid.
Установка тега при регистрации или изменении данных пользователя:
public function setUserTags(string $hwid, int $userId): void
{
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
$tags = [];
// Группы пользователя → теги
$groups = \CUser::GetUserGroup($userId);
if (in_array(7, $groups)) { // ID группы "Gold"
$tags[] = ['tagName' => 'loyalty_level', 'tagValue' => 'gold'];
}
// Город
if (!empty($user['PERSONAL_CITY'])) {
$tags[] = ['tagName' => 'city', 'tagValue' => $user['PERSONAL_CITY']];
}
// История покупок — суммарная сумма
$totalOrders = $this->getUserOrdersTotal($userId);
$tags[] = ['tagName' => 'orders_total', 'tagValue' => (int)$totalOrders];
$this->request('setTags', [
'request' => [
'application' => $this->appCode,
'auth' => $this->apiAccessToken,
'tags' => $tags,
'hwid' => $hwid,
],
]);
}
Обработка событий из Битрикс
// Смена статуса заказа
AddEventHandler('sale', 'OnSaleStatusOrder', function(string $statusId, \Bitrix\Sale\Order $order) {
$userId = (int)$order->getUserId();
$notifications = [
'O' => ['Заказ #' . $order->getField('ACCOUNT_NUMBER'), 'Заказ принят, передаём в обработку'],
'D' => ['Заказ отправлен', 'Посылка уже в пути — отслеживайте доставку'],
'F' => ['Заказ выполнен', 'Спасибо за покупку! Оставьте отзыв — вам важен ваш опыт'],
];
if (!isset($notifications[$statusId])) return;
[$title, $content] = $notifications[$statusId];
$url = '/personal/order/detail/' . $order->getField('ACCOUNT_NUMBER') . '/';
(new PushwooshService())->sendMessageToUser($userId, $content, $title, $url);
});
Статистика и Inbox
Pushwoosh предоставляет API для получения статистики (getStats) и inbox-уведомлений (getInboxMessages) — список последних push, которые пользователь мог пропустить. Inbox отображается в личном кабинете как центр уведомлений:
Pushwoosh.push(function(api) {
api.getInboxMessages().then(function(messages) {
// Рендерим список непрочитанных уведомлений
renderInbox(messages);
});
});
Сроки
| Задача | Срок |
|---|---|
| SDK инициализация, сохранение hwid | 2–3 дня |
| PHP-клиент API, таблица устройств | 2–3 дня |
| Отправка по событиям заказов | 2–3 дня |
| Теги и сегментация | 2–3 дня |
| Inbox, статистика, управление из ЛК | 3–5 дней |
| Полный комплекс (web + mobile) | 3–4 недели |







