Search code examples
phpslackslack-api

Message formatting, send buttons via Slack API with PHP


I'm using webhooks to send messages via Slack API

I need to send a button with a link to a report

I did it with Python successfully

But with PHP i'm having trouble with the arrays of actions in the attachments

code 1

$data = array(
        "text" => $message
    );

    $actions =
        [
            'type' => "button",
            'text' => "Report1",
            'url' => "https://url.report1"
        ];

    $data += [
        "attachments" =>
            [
                "fallback" => "More details...", //I only get the message and this text in the slack
                'actions' => [$actions] // or array($actions) 

            ]
    ];

    $payload = json_encode($data);

print_r($data) output:

Array
(
    [text] => teste
    [attachments] => Array
        (
            [fallback] => More details... 
            [actions] => Array
                (
                    [0] => Array
                        (
                            [type] => button
                            [text] => Report1
                            [url] => https://url.report1
                        )

                )

        )

)

The paylod is shown, but the button doesn't

code 2

$data = array(
        "text" => $message
    );

    $actions =
        [
            'type' => "button",
            'text' => "Report1",
            'url' => "https://url.report1"
        ];

    $data += [
        "attachments" =>
            [
                "fallback" => "More details...",
                'actions' => $actions

            ]
    ];

    $payload = json_encode($data);

print_r($data) output:

Array
(
    [text] => teste
    [attachments] => Array
        (
            [fallback] => More details...
            [actions] => Array
                (
                    [type] => button
                    [text] => Report1
                    [url] => https://url.report1
                )

        )

)

Neither payload or button are showed

Here's the documentation example, it's very easy to send this with python

{
    "text": "<@W1A2BC3DD> approved your travel request. Book any airline you like by continuing below.",
    "attachments": [
        {
            "fallback": "Book your flights at https://flights.example.com/book/r123456",
            "actions": [
                {
                    "type": "button",
                    "text": "Book flights 🛫",
                    "url": "https://flights.example.com/book/r123456"
                }
            ]
        }
    ]
}

How I can create this kind of structure in PHP?


Solution

  • Here is your "code 1" with the correction. Your attachments property needs to be an array of attachment arrays. You only had a simple array.

    $message = "Hello Stackoverflow";
    
    $data = array(
            "text" => $message
        );
    
        $actions =
            [
                'type' => "button",
                'text' => "Report1",
                'url' => "https://url.report1"
            ];
    
        $data += [
            "attachments" =>
                [
                    [
                        "fallback" => "More details...", //I only get the message and this text in the slack
                        'actions' => [$actions] // or array($actions) 
    
                    ]
                ]
        ];
    
        $payload = json_encode($data);
    
        print_r($payload);
    

    The resulting payload works in the message builder.