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は役割が正反対です。
項目 | Webhook | API |
---|---|---|
主体 | 向こうから「送ってくる」 | こちらから「取りにいく」 |
タイミング | イベントが発生したとき「すぐ」 | 必要なときに自分で「手動または定期的に取得」 |
使用例 | 支払い完了通知、自動LINE通知など | 商品一覧取得、在庫確認など |
Webhookは「プッシュ通知」、APIは「取りに行く問い合わせ」とイメージすると分かりやすいです。
なぜPower Automateを使うのか?
Microsoft Teamsでは、従来「Incoming Webhook」という仕組みを使って外部から通知を受け取っていました。しかし現在、この方式は2025年末までに廃止が予定されており、代わりにWorkflows(Power Automate)によるWebhook通知に一本化されつつあります。
これにより、通知元(PHPなどのアプリケーション)からはPower Automateが提供するURLにHTTPS POSTを送る形となります。
全体の流れを理解する
この仕組みは、大きく以下の3つのステップで構成されます。
- ユーザーがフォームに文字を入力して送信
- PHPがその内容をJSON形式に整形し、Power AutomateのWebhook URLへ送信(POST)
- 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」で以下のように設定します。
- テンプレート選択:「Webhook要求を受信するとチャネルに投稿する」
- 受信URLが発行される:これをPHP側の送信先に使う
- 受信データをTeamsに送信:「Adaptive Cardの本文」には
triggerBody()?['attachments']
を指定 - チャネルを選択:投稿先のチームとチャネルを明示
この設定により、PHPから送信されたアダプティブカードJSONが、そのままTeamsチャネルに表示されます。
テスト方法とトラブル対処
- フォームから送信
- Teamsに通知が表示されるか確認
- 表示されない場合は、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