Інтеграція 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 тижні |







