PHPフォームからTeamsへ通知を送る:Webhook × Power Automate完全ガイド

Webアプリで発生した出来事(ユーザーからの問い合わせや、エラー発生など)をMicrosoft Teamsに通知したいとき、もっとも柔軟で安全な方法のひとつが「Webhook × Power Automate」の組み合わせです。

この記事では、PHPで作ったフォームから入力内容をTeamsに通知する方法を、技術的背景からコード、Power Automate側の設定まで一気通貫でわかりやすく解説します。

目次

Webhookを使った自動通知とは?

Webhook(ウェブフック)とは、ある出来事(イベント)が起きたときに、自動で別のサービスに通知を送る仕組みのことです。
「Webの世界でフック(引っかけ)る」イメージから、その名がついています。

メール通知のようなものと思われがちですが、Webhookはもっと直接的でリアルタイムな通信が可能です。

以下のようなイメージです。

  • フォームに送信がある(イベント発生)
  • Webhookが設定されているURLに、自動的にデータをPOST送信する
  • 受け取ったサービス(例:Slack、LINE、自作アプリなど)が即座に反応する

つまり、**「あるWeb上の動きが、他のシステムを即座にトリガーする仕組み」**です。

図でイメージをつかむ

[ イベント発生(例:注文完了) ]
             ↓
[ Webhookで通知(HTTPリクエスト) ]
             ↓
[ 通知先サーバー(例:Slack、API、アプリ) ]
このように、「待ち構えていた」外部サーバーが、データを受け取るのがWebhookです。

Webhookは何を送ってくるの?

Webhookは、HTTPリクエスト(主にPOST)で、JSON形式のデータを送信します。

例(JSON形式):

  "user": "田中太郎",
  "email": "taro@example.com",
  "message": "問い合わせを受け付けました"
}
これをあらかじめ登録されたURLに自動でPOSTするのが、Webhookのしくみです。

Webhookの構成要素

項目内容
発信元(送信側)Webhookを送ってくるサービス(例:Stripe、GitHub、フォームなど)
受信先(受け側)受け取る側のURL。自分のサーバー、LINE Bot、Slack、Google Apps Scriptなど
通信形式HTTPリクエスト(多くはPOST)。中身はJSONまたはURLエンコード形式

WebhookとAPIの違い

よく混同されがちですが、WebhookとAPIは役割が正反対です。

項目WebhookAPI
主体向こうから「送ってくる」こちらから「取りにいく」
タイミングイベントが発生したとき「すぐ」必要なときに自分で「手動または定期的に取得」
使用例支払い完了通知、自動LINE通知など商品一覧取得、在庫確認など

Webhookは「プッシュ通知」、APIは「取りに行く問い合わせ」とイメージすると分かりやすいです。

なぜPower Automateを使うのか?

Microsoft Teamsでは、従来「Incoming Webhook」という仕組みを使って外部から通知を受け取っていました。しかし現在、この方式は2025年末までに廃止が予定されており、代わりにWorkflows(Power Automate)によるWebhook通知に一本化されつつあります。

これにより、通知元(PHPなどのアプリケーション)からはPower Automateが提供するURLにHTTPS POSTを送る形となります。

全体の流れを理解する

この仕組みは、大きく以下の3つのステップで構成されます。

  1. ユーザーがフォームに文字を入力して送信
  2. PHPがその内容をJSON形式に整形し、Power AutomateのWebhook URLへ送信(POST)
  3. Power Automateがそのデータを受け取り、Teamsに整形済みメッセージとして投稿

これにより、任意のWebアプリケーションからTeamsへの即時通知が実現します。

Adaptive Cardとは何か?

Teamsで通知を送る際は、単なる文字列ではなく**「Adaptive Card(アダプティブカード)」という構造化メッセージ形式**を使う必要があります。これは、JSONで定義されたレイアウト情報で、次のような表現が可能です:

  • タイトルや段落をマークダウンで整形
  • ボタンやリンクの配置
  • 画像の埋め込み

公式のカード設計ツールはこちらです:
Adaptive Card Designer

GUI上で設計して、コピーしたJSONをそのまま使えるので非常に便利です。

PHPでフォームを作成して通知する(実装)

ここでは、1ファイルで完結するPHPのフォーム通知スクリプトを紹介します。以下のコードはそのまま動作可能です。

<?php
$webhook_url = 'https://prod-xx.logic.azure.com/...'; // Power Automate発行URL

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $message = $_POST['message'] ?? '(メッセージ未入力)';

    // Adaptive Card形式で組み立てる
    $payload = [
        "attachments" => [
            [
                "contentType" => "application/vnd.microsoft.card.adaptive",
                "content" => [
                    "\$schema" => "http://adaptivecards.io/schemas/adaptive-card.json",
                    "type" => "AdaptiveCard",
                    "version" => "1.2",
                    "body" => [
                        [
                            "type" => "TextBlock",
                            "text" => htmlspecialchars($message),
                            "wrap" => true,
                            "markdown" => true
                        ]
                    ]
                ]
            ]
        ]
    ];

    $json = json_encode($payload, JSON_UNESCAPED_UNICODE);
    $ch = curl_init($webhook_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    $response = curl_exec($ch);
    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    $success = in_array($http_status, [200, 202]);
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Teams通知フォーム</title>
</head>
<body>
    <h2>Teams通知フォーム</h2>
    <form method="POST">
        <textarea name="message" rows="6" cols="60" placeholder="メッセージを入力してください"></textarea><br>
        <button type="submit">送信</button>
    </form>

    <?php if (isset($success)): ?>
        <p><?= $success ? '✅ 通知を送信しました' : '❌ 通知に失敗しました' ?></p>
    <?php endif; ?>
</body>
</html>

ポイント:

  • htmlspecialchars() でHTMLタグを無効化(XSS対策)
  • JSON_UNESCAPED_UNICODE で日本語が文字化けしないように

送信のみコード


<?php

$webhook_url = 'https://prod-xx.logic.azure.com/...'; // Workflowsで発行されたURL

$payload = [
    "attachments" => [
        [
            "contentType" => "application/vnd.microsoft.card.adaptive",
            "content" => [
                "\$schema" => "http://adaptivecards.io/schemas/adaptive-card.json",
                "type" => "AdaptiveCard",
                "version" => "1.2",
                "body" => [
                    [
                        "type" => "TextBlock",
                        "text" => "## PHPからの通知テスト\n\n- 通知の項目A\n- 通知の項目B",
                        "wrap" => true,
                        "markdown" => true
                    ]
                ]
            ]
        ]
    ]
];

$json = json_encode($payload, JSON_UNESCAPED_UNICODE);

$ch = curl_init($webhook_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Content-Length: ' . strlen($json)
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

$response = curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($http_status === 200 || $http_status === 202) {
    echo "通知が送信されました。\n";
} else {
    echo "エラーが発生しました(HTTPステータス: $http_status)\n";
    echo "レスポンス: $response\n";
}

実行方法

このPHPコードをファイルとして保存し、次のように実行します。

php notify_teams.php

成功すれば、Teamsの指定チャネルに即時で通知が表示されます。

応用:画像やボタンの埋め込み

Adaptive Cardは画像表示やボタンアクションにも対応しています。たとえば画像を表示したい場合は以下の要素を body に追加します。

[
    "type" => "Image",
    "url" => "https://example.com/image.png",
    "size" => "Medium"
]

Power Automate(Workflows)の設定方法

フォームからのPOSTを正しく処理するには、Teams内の「Workflows」で以下のように設定します。

  1. テンプレート選択:「Webhook要求を受信するとチャネルに投稿する」
  2. 受信URLが発行される:これをPHP側の送信先に使う
  3. 受信データをTeamsに送信:「Adaptive Cardの本文」には triggerBody()?['attachments'] を指定
  4. チャネルを選択:投稿先のチームとチャネルを明示

この設定により、PHPから送信されたアダプティブカードJSONが、そのままTeamsチャネルに表示されます。

テスト方法とトラブル対処

  1. フォームから送信
  2. Teamsに通知が表示されるか確認
  3. 表示されない場合は、Power Automateの「実行履歴」を確認し、JSON形式やチャネル設定を見直す

代表的なエラー:

  • 400エラー → JSON構造の誤り(特に attachments 構造)
  • 401エラー → Webhook URLが期限切れ or 無効
  • Teams側で表示されない → Adaptive Card構造は正しいが、チャネル設定が間違っている

まとめ

項目内容
送信方法PHP(cURL)でHTTPS POST
通信形式JSON形式、Content-Type: application/json
受信形式Adaptive Card構造の attachments
セキュリティhtmlspecialcharsによる入力無害化、SSLでの送信
拡張性カードに画像・リンク・ボタンも追加可能(Designerで生成)

この仕組みは、SlackやLINEとは違い、Teamsに公式に対応した現在推奨される方法です。
システム通知、問い合わせ受付、アラート配信など、あらゆる業務で活用できます。

Comment

コメントする

目次