EC-CUBE Lab
produced by Cajiya
EC-CUBEに関するカスタマイズ方法やトラブルへの対処方法を発信

EC-CUBE4で購入通知をSlackで送信するカスタマイズ方法

公開日: 2025年09月23日 | 更新日: 2025年11月01日
購入フロー 通知/コミュニケーション EC-CUBE 4系全般 イベント購読 Slack

要望や症状

EC-CUBE 4系において、注文が発生した際に運用チームへSlackで自動通知を送りたいという要望があります。

注文完了時に自動でSlack通知を送信し、注文番号、購入者情報、支払方法、金額などの基本情報をSlackに送信したい場合のカスタマイズが必要です。

理由や原因

EC-CUBE 4系では注文完了時のSlack通知機能が標準では提供されていません。そのため、Slack通知機能を利用するには別途実装が必要となります。

解決策

注文完了時にSlack通知を送信するため、イベントリスナーを使用して実装します。注文ステータスが変更されたタイミングでSlack通知を送信する方法が最も確実で拡張性に優れています。

1. Slack Webhook URLの設定

SlackワークスペースでIncoming Webhookを設定し、EC-CUBEの設定ファイルにWebhook URLを記述します。

# app/config/eccube/packages/slack.yaml
parameters:
    slack_webhook_url: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
    slack_channel: '#orders'

2. Slack通知サービスクラスの作成

注文情報をSlackに送信するためのサービスクラスを作成します。

<?php
// app/Customize/Service/SlackNotificationService.php

namespace Customize\Service;

use Eccube\Entity\Order;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Psr\Log\LoggerInterface;

class SlackNotificationService
{
    private $parameterBag;
    private $logger;

    public function __construct(ParameterBagInterface $parameterBag, LoggerInterface $logger)
    {
        $this->parameterBag = $parameterBag;
        $this->logger = $logger;
    }

    public function sendOrderNotification(Order $order)
    {
        try {
            $webhookUrl = $this->parameterBag->get('slack_webhook_url');
            $channel = $this->parameterBag->get('slack_channel');

            if (empty($webhookUrl)) {
                return false;
            }

            $message = $this->buildOrderMessage($order, $channel);
            return $this->sendToSlack($webhookUrl, $message);

        } catch (\Exception $e) {
            $this->logger->error('Slack通知送信エラー: ' . $e->getMessage());
            return false;
        }
    }

    private function buildOrderMessage(Order $order, string $channel): array
    {
        $customerName = $order->getName01() . ' ' . $order->getName02();
        $paymentMethod = $order->getPayment() ? $order->getPayment()->getMethod() : '未設定';
        
        return [
            'channel' => $channel,
            'username' => 'EC-CUBE注文通知',
            'icon_emoji' => ':shopping_cart:',
            'text' => sprintf(
                "🛒 新しい注文が入りました\n\n" .
                "📋 注文番号: %s\n" .
                "👤 お客様名: %s\n" .
                "💳 支払方法: %s\n" .
                "💰 合計金額: %s円\n" .
                "📅 注文日時: %s",
                $order->getOrderNo(),
                $customerName,
                $paymentMethod,
                number_format($order->getPaymentTotal()),
                $order->getCreateDate()->format('Y-m-d H:i:s')
            )
        ];
    }

    private function sendToSlack(string $webhookUrl, array $message): bool
    {
        $postData = json_encode($message);
        
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $webhookUrl,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postData,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_SSL_VERIFYPEER => true
        ]);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        return $httpCode === 200;
    }
}

3. イベントリスナーの作成

注文完了時のイベントを監視してSlack通知を送信するリスナーを作成します。

<?php
// app/Customize/EventListener/OrderSlackNotificationListener.php

namespace Customize\EventListener;

use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Customize\Service\SlackNotificationService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class OrderSlackNotificationListener implements EventSubscriberInterface
{
    private $slackService;

    public function __construct(SlackNotificationService $slackService)
    {
        $this->slackService = $slackService;
    }

    public static function getSubscribedEvents()
    {
        return [
            EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => 'onShoppingComplete',
        ];
    }

    public function onShoppingComplete(EventArgs $event)
    {
        $order = $event->getArgument('Order');
        
        if ($order) {
            $this->slackService->sendOrderNotification($order);
        }
    }
}

4. サービス定義の登録

作成したサービスクラスとイベントリスナーをDIコンテナに登録します。

# app/config/eccube/services.yaml
services:
    Customize\Service\SlackNotificationService:
        arguments:
            - '@parameter_bag'
            - '@logger'
    
    Customize\EventListener\OrderSlackNotificationListener:
        arguments:
            - '@Customize\Service\SlackNotificationService'
        tags:
            - { name: kernel.event_subscriber }

5. キャッシュクリアと動作確認

設定ファイルとサービス定義を変更した後は、必ずキャッシュをクリアします。

php bin/console cache:clear --no-warmup
php bin/console cache:warmup

実際に注文を行い、Slackチャンネルに通知が送信されることを確認してください。

セキュリティと運用上の注意事項

Slack Webhook URLは機密情報です。本番環境では環境変数として管理し、設定ファイルには直接記述しないことを強く推奨します。また、通知の送信失敗が注文処理に影響を与えないよう、エラーハンドリングを適切に実装しています。

通知メッセージの内容は個人情報を含むため、Slackのアクセス権限管理も適切に行ってください。

免責事項

本記事に掲載しているコードや手順は、執筆時点での情報および特定の環境下での動作確認に基づいています。 EC-CUBEのバージョン、サーバー環境、導入済みプラグインとの競合などにより、予期せぬ不具合が発生する可能性があります。

本記事の内容を実行した結果、生じた損害(データの消失、サイトの停止、機会損失など)について、当サイトおよび管理者は一切の責任を負いかねます。 実装にあたっては、必ずバックアップを取得し、検証環境(テスト環境)での動作確認を行った上で、ご自身の責任において実施してください。

この記事は参考になりましたか?

著者プロフィール: 株式会社カジヤ

当社はWeb業界の専門家として、培った経験や技術、自社事業を通して得た知見を土台に、 お客様の事業の成長を後押しすることを提供価値として活動する、Web事業の成長支援会社です。 EC-CUBE公式のパートナー制度「EC-CUBE インテグレートパートナー」に登録してしており、上位11%にあたる「ゴールドランク」に認定された実績があり、新しい通販サイトの構築から、カスタマイズ、リニューアルまで幅広く対応します。

通知/コミュニケーション の関連記事

メール通知 通知/コミュニケーション EC-CUBE 4系全般
メール件名のショップ名を英語表記に変更する方法

EC-CUBE 4系で、メール件名の先頭に自動挿入される店舗名を英語表記に変更したい場合があります。...

👍 0 / 👎 0 2025年10月12日

EC-CUBE 4系全般 の関連記事

商品 データ不整合 EC-CUBE 4系全般
EC-CUBEで取り扱い終了商品の削除ができない理由と対応方法

EC-CUBEでは、取り扱いを終了した商品を削除したい場合に、削除ができない状態になることがあります...

👍 1 / 👎 0 2025年10月12日
インストール・セットアップ EC-CUBE 4系全般 設定変更
EC-CUBEサイトのドメイン変更時の設定変更方法

EC-CUBEで構築したサイトを新しいドメインで公開する際に、どのような設定変更が必要かわからない場...

👍 0 / 👎 0 2025年10月12日
メール通知 通知/コミュニケーション EC-CUBE 4系全般
メール件名のショップ名を英語表記に変更する方法

EC-CUBE 4系で、メール件名の先頭に自動挿入される店舗名を英語表記に変更したい場合があります。...

👍 0 / 👎 0 2025年10月12日
フロント共通 機能不動作 EC-CUBE 4系全般
CloudFrontを利用時にリンクのドメインがEC2のパブリックDNSになってしまう問題の解決方法

EC-CUBE 4.2をAWS ECS on EC2上で構築し、CloudFrontをCDNとして利...

👍 1 / 👎 0 2025年10月12日
サイト全体 500エラー EC-CUBE 4系全般
EC-CUBEでメモリ不足エラーが発生した場合の対処方法

EC-CUBEの運用中に以下のようなメモリ不足エラーが発生することがあります。 ### エラー...

👍 1 / 👎 0 2025年10月12日

イベント購読 の関連記事

管理画面共通 セキュリティ強化 EC-CUBE 4系全般
ロードバランサー経由でも管理画面IP制限を適用させるカスタマイズ方法

ロードバランサー配下にEC-CUBEサーバを構築している環境で、管理画面IP制限設定を実施しようとす...

👍 0 / 👎 0 2025年10月12日
ログイン・ログアウト 情報構造・ルーティング設計 EC-CUBE 4.1系 / Symfony 4.4
ログアウト時のリダイレクト先をカスタマイズする方法(EventListener)

EC-CUBE 4.1系において、ログアウトボタンを押した際にトップページではなく、特定のページ(u...

👍 0 / 👎 0 2025年09月23日