接收网络钩子数据并将其保存在数据库中


Receiving webhook data and save them in db

我想处理由 trello webhook 发送的数据。那里有网络钩子发布到像 site.com/tracker.php 这样的网址

在跟踪器中.php我想将数据保存在数据库中。为此,我需要得到一些参数。

这是我收到的代码示例 (https://trello.com/docs/gettingstarted/webhooks.html):

{
   "action": {
      "id":"51f9424bcd6e040f3c002412",
      "idMemberCreator":"4fc78a59a885233f4b349bd9",
      "data": {
         "board": {
            "name":"Trello Development",
            "id":"4d5ea62fd76aa1136000000c"
         },
         "card": {
            "idShort":1458,
            "name":"Webhooks",
            "id":"51a79e72dbb7e23c7c003778"
         },
         "voted":true
      },
      "type":"voteOnCard",
      "date":"2013-07-31T16:58:51.949Z",
      "memberCreator": {
         "id":"4fc78a59a885233f4b349bd9",
         "avatarHash":"2da34d23b5f1ac1a20e2a01157bfa9fe",
         "fullName":"Doug Patti",
         "initials":"DP",
         "username":"doug"
      }
   },
   "model": {
      "id":"4d5ea62fd76aa1136000000c",
      "name":"Trello Development",
      "desc":"Trello board used by the Trello team to track work on Trello.  How meta!'n'nThe development of the Trello API is being tracked at https://trello.com/api'n'nThe development of Trello Mobile applications is being tracked at https://trello.com/mobile",
      "closed":false,
      "idOrganization":"4e1452614e4b8698470000e0",
      "pinned":true,
      "url":"https://trello.com/b/nC8QJJoZ/trello-development",
      "prefs": {
         "permissionLevel":"public",
         "voting":"public",
         "comments":"public",
         "invitations":"members",
         "selfJoin":false,
         "cardCovers":true,
         "canBePublic":false,
         "canBeOrg":false,
         "canBePrivate":false,
         "canInvite":true
      },
      "labelNames": {
         "yellow":"Infrastructure",
         "red":"Bug",
         "purple":"Repro'd",
         "orange":"Feature",
         "green":"Mobile",
         "blue":"Verified"
      }
   }
}

这是我当前的跟踪器.php文件:

<?php
$json = $_POST["actions"];
$action = json_decode($json);
$action_id = $action->id;
$card_id = $action->data->card->id;
var_dump($array);

我的问题:

  • $_POST["操作"]是否正确?或者我需要在 [] 内做什么
  • 我想获取$action->数据->卡-> ID 的方式是否正确?
  • 有什么方法可以查看var_dump的结果吗?不知道如何查看网络钩子帖子的结果。

我不得不使用这个:

$json = file_get_contents('php://input');
$action = json_decode($json, true);

据我了解,json 请求不会自动拆分为 $_POST。因此,您必须使用输入本身。

json_decode 中的 true 参数是获取关联数组所必需的。没有它,我只有一个空数组。

您可以使用它来检查接收的数据是否为 JSON 格式。

if($json = json_decode(file_get_contents("php://input"), true)) {
    print_r($json);
    $data = $json;
} else {
    print_r($_POST);
    $data = $_POST;
}

在 laravel 中使用 php8>

在路由/API 中.php:

            Route::middleware(['checkPublicServiceTokens'])
                ->group(function () {
                    Route::post('/webhook', [
                        WhatsAppController::class,
                        'webhook'
                    ])->name('whatsapp.webhook');
                });

在 app/http/kernel 中.php在 routeMiddleware 部分:

protected $routeMiddleware = [

添加这个:

    'checkPublicServiceTokens' => 'App'Http'Middleware'CheckPublicServiceTokens::class,

在 app/http/Middleware 中:

public function handle(Request $request, Closure $next)
{
    if (!$request->input('public-webhook-token') || $this->isTokenValid($request)) {
        return apiResponse()->errors(__('exception.access_denied_public'))
            ->status(Response::HTTP_UNAUTHORIZED)
            ->get();
    }
    return $next($request);
}

在 lang/en/exception 中.php

'access_denied_public' => 'authorized token as webhook token',

在控制器中:public function webhook(WhatsAppWebhookRequest $request): JsonResponse{$item = app()->make(WhatsAppWebhookRepository::class)->store($request->all());返回 apiResponse()->data($item)->status(Response::HTTP_CREATED)->get();}

实现中的存储方法:

public function store(array $data): WhatsAppWebhook
{
    $payload = array("payload"=>json_encode($data));
    $item = new WhatsAppWebhook($payload);
    $item->save();
    return $item;
}