# Qual o problema com minha requisição cURL?

**URL:** https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708
**Category:** Development
**Tags:** rest-api
**Created:** [Abril 13, 2024, 10:38pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708 "2024-04-13T22:38:21Z")
**Posts on this page:** 12
**Page:** 1

<div class="post-metadata">

### Author: ![Ben\_Sutton](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ben_sutton/32/313156_2.png) [@Ben\_Sutton](https://meta.discourse.org/u/Ben_Sutton)
#### Post date: [Abril 13, 2024, 10:38pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/1 "2024-04-13T22:38:21Z")

</div>

Olá! Estou tentando escrever uma solicitação cURL para o meu site Wordpress para integrar o Discourse com assinaturas do woo. Aqui está minha função, que não parece funcionar. Estou perdendo alguma coisa?

```plaintext
function execute_discourse_curl_request($subscription) {

    $subscription_status = $subscription->get_status();

    $user_id = $subscription->get_user_id();
    $user = get_user_by('ID', $user_id);
    $username = $user->user_login;

    $request = "";

    if ($subscription_status == 'active') {
        $request = "PUT";
    }

    if ($subscription_status == 'cancelled' || $subscription_status == 'on-hold') {
        $request = "DELETE";
    }

    $api_key = get_option( 'discourse_custom_api_key' );

    $group_id = 41;
    $api_url = 'https://forum.example.com/groups/' . $group_id . '/members.json';
    
    $data = [
        'usernames' => [$username],
    ];
    
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $request,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => [
            "Api-Key: " . $api_key,
            "Api-Username: system",
            "Content-Type: application/json"
        ],
    ]);
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);

    if ($err) {
        $to = 'hello@example.com';
        $subject = 'Erro na solicitação cURL de atualização do usuário Discourse';
        $message = 'Houve um erro';
        wp_mail($to, $subject, $message);
    }
}

```

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [Abril 13, 2024, 10:48pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/2 "2024-04-13T22:48:03Z")

</div>

Olá,

Que erro você está recebendo? O que a resposta retorna?  
Isso deve ajudar a entender o problema.

---

<div class="post-metadata">

### Author: ![Ben\_Sutton](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ben_sutton/32/313156_2.png) [@Ben\_Sutton](https://meta.discourse.org/u/Ben_Sutton)
#### Post date: [Abril 13, 2024, 10:51pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/3 "2024-04-13T22:51:38Z")

</div>

O problema é que não recebo nenhum erro ou confirmação. Parece que o cURL simplesmente não funciona. Posso ver que a chave da API do Discourse foi usada quando o cURL é executado, então há algum sucesso, mas o usuário não é adicionado ou removido do grupo como pretendido. Posso confirmar que todas as variáveis estão corretas.

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [Abril 13, 2024, 11:05pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/4 "2024-04-13T23:05:54Z")

</div>

> [@Ben\_Sutton](#):
>
> O problema é que não recebo nenhum erro ou confirmação

Deveria retornar um payload em caso de sucesso ou falha.

Você verificou o conteúdo de `$response`?

Além disso, acredito que o formato do parâmetro `usernames` deveria ser uma string “`username1,username2,...`” em vez disso.

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [Abril 14, 2024, 12:36am UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/5 "2024-04-14T00:36:20Z")

</div>

> [@Ben\_Sutton](#):
>
> Estou perdendo alguma coisa?

A menos que eu esteja fazendo algo errado, a solicitação para `\"/groups/${group_id}/members.json\"` é um tanto contraintuitiva. Ela também não parece estar documentada _e_ não pode ser visualizada na aba de rede do navegador ao enviar o formulário “Adicionar Usuário” do Discourse na página de um grupo. Novamente, posso estar fazendo algo errado.

De qualquer forma, o caminho para a solicitação é `/groups/${group_id}/members.json`, com o ID numérico do grupo substituído por `group_id`. ~~O corpo da solicitação requer um parâmetro `group_id`, mas esse parâmetro precisa ser definido como o `name` do grupo. Assim, os argumentos ficam assim:~~

```php
$group_id = 45;
$group_name = 'publishers';
$args = array(
    'method' => 'DELETE', // ou 'PUT'
	'body' => array(
		// 'group_id' => $group_name, editar: este parâmetro não é necessário, não tenho certeza do que estava acontecendo quando o testei.
		'usernames' => 'sally,Ben',
	)
);

// caminho:
/groups/${group_id}/members.json

```

Se você tiver o plugin [WP Discourse](https://github.com/discourse/wp-discourse) configurado em seu site WordPress, pode usar sua função auxiliar estática [`discourse_request`](https://github.com/discourse/wp-discourse/blob/main/lib/plugin-utilities.php#L469) para evitar ter que usar curl. Note que eu linkei para a função estática que está no arquivo `plugin-utilities`, mas o namespace que você precisa usar para solicitações externas é de [https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php](https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php).

```php
use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

function zalg_add_users_to_group() {
	$group_id = 45;
    $group_name = 'publishers';
    $method = 'PUT'; // 'PUT' para adicionar usuários; 'DELETE' para remover usuários
	$args = array(
		'method' => $method,
		'body' => array(
			// 'group_id' => $group_name, editar: este parâmetro não é necessário
			'usernames' => 'sally,Ben',
		)
	);
	$response = DiscourseUtilities::discourse_request( "/groups/${group_id}/members.json", $args );
    // retornar, registrar ou lidar com a resposta
}

```

Se você estiver usando o WordPress como provedor de SSO para o Discourse, há uma função auxiliar que permite adicionar _um_ usuário a um ou mais grupos:

```php
function zalg_sso_add_users_to_group() {
    $user_id = 1; // o ID do usuário do WordPress
    $group_names = 'foo,bar,baz'; // um ou mais nomes de grupo separados por vírgula, sem espaços após as vírgulas!
    DiscourseUtilities::add_user_to_discourse_group($user_id, $group_names);
}

```

Para adicionar vários usuários a um único grupo, você ainda precisará usar o método `discourse_request` que está no primeiro exemplo de código.

---

<div class="post-metadata">

### Author: ![Ben\_Sutton](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ben_sutton/32/313156_2.png) [@Ben\_Sutton](https://meta.discourse.org/u/Ben_Sutton)
#### Post date: [Abril 14, 2024, 2:10pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/6 "2024-04-14T14:10:30Z")

</div>

A resposta é apenas um erro 500 ☹

---

<div class="post-metadata">

### Author: ![Ben\_Sutton](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ben_sutton/32/313156_2.png) [@Ben\_Sutton](https://meta.discourse.org/u/Ben_Sutton)
#### Post date: [Abril 14, 2024, 2:13pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/7 "2024-04-14T14:13:03Z")

</div>

Esta é uma ajuda heroica, obrigado Simon! Seria muito mais fácil se eu pudesse utilizar as funções auxiliares existentes no plugin [WP Discourse](https://github.com/discourse/wp-discourse). Estou usando meu site Wordpress para SSO.

No entanto, ainda recebo um erro crítico no meu caso quando a função é acionada. Não tenho certeza do porquê. O que você está dizendo está um pouco acima do meu entendimento, mas aqui está o que estou usando no meu functions.php:

```plaintext
<?php

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

add_action('woocommerce_subscription_status_cancelled', 'zalg_sso_add_users_to_group', 10, 3);

function zalg_sso_add_users_to_group($subscription) {
    $user_id = $subscription->get_user_id();
    $group_names = 'premium';
    DiscourseUtilities::remove_user_to_discourse_group($user_id, $group_names);
}

```

Não tenho certeza do que estou perdendo?

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [Abril 14, 2024, 2:51pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/8 "2024-04-14T14:51:22Z")

</div>

A função para remover um usuário de um ou mais grupos é chamada `remove_user_from_discourse_group`, você a chamou de `remove_user_to_discourse_group`.

As funções para adicionar e remover um usuário de um ou mais grupos estão aqui: [wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub](https://github.com/discourse/wp-discourse/blob/99325e15190f3a705284dbf582f1c4b2c0b21492/lib/utilities.php#L278-L325).

---

<div class="post-metadata">

### Author: ![Ben\_Sutton](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ben_sutton/32/313156_2.png) [@Ben\_Sutton](https://meta.discourse.org/u/Ben_Sutton)
#### Post date: [Abril 14, 2024, 3:07pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/9 "2024-04-14T15:07:41Z")

</div>

Você está certo! Erro bobo. Obrigado pela sua ajuda, Simon. Quem me dera haver uma caixa de gorjetas. Me avise se houver algo que eu possa fazer por você. Saúde!

---

<div class="post-metadata">

### Author: ![Ben\_Sutton](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ben_sutton/32/313156_2.png) [@Ben\_Sutton](https://meta.discourse.org/u/Ben_Sutton)
#### Post date: [Abril 14, 2024, 3:10pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/10 "2024-04-14T15:10:23Z")

</div>

Para expandir sobre isso, você sabe onde posso encontrar funções auxiliares para editar mais o perfil do usuário? Seria ótimo se eu pudesse definir a imagem de perfil e a biografia do usuário, se possível.

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [Abril 14, 2024, 3:34pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/11 "2024-04-14T15:34:43Z")

</div>

> [@Ben\_Sutton](#):
>
> Seria ótimo se eu pudesse definir a Imagem de Perfil e a Bio do usuário, se possível.

Existe uma função auxiliar no arquivo `Utilities` para isso:

`DiscourseUtilities::sync_sso_record( $sso_params );`

Ontem postei um exemplo de como usá-la: [I cannot add user to the discouse forum from a wordpress website when user added in a membership - #10 by simon](https://meta.discourse.org/t/i-cannot-add-user-to-the-discouse-forum-from-a-wordpress-website-when-user-added-in-a-membership/300025/10?u=simon). A parte complicada é criar o array para o argumento `sso_params`. Esse array deve conter o campo `external_id`. Ele é definido como o ID do WordPress do usuário:

```php
	$sso_params = array(
		'external_id' => $user_id,
	);

```

Você pode incluir quaisquer campos desta lista na carga útil: [discourse/lib/discourse\_connect\_base.rb at 8f52fd1051e20fdff41321c5cff99fda05af86c1 · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/8f52fd1051e20fdff41321c5cff99fda05af86c1/lib/discourse_connect_base.rb#L13-L43). Observe o array `BOOLS` que é mostrado logo abaixo da lista `ACCESSORS` que eu linkei. Ele indica quais das opções possíveis são `booleans` (true/false). Ao fazer requisições do WordPress, quaisquer campos booleanos devem ser definidos com as strings `'true'` ou `'false'`, e não com os valores PHP `true` ou `false`.

Para atualizar o avatar, defina o campo `avatar_url` no array `$sso_params` e também defina o campo `avatar_force_update` como `'true'`.

Existe um campo `bio` que pode ser usado para definir a bio.

O plugin [WP Discourse](https://github.com/discourse/wp-discourse) já está definindo os campos `bio` e `avatar_url`. Ele também tem uma configuração “Force Avatar Update” em suas configurações de SSO. O problema pode ser que essas configurações só são atualizadas quando um usuário faz login no Discourse através do site WordPress. A função `sync_sso_record` atualiza os campos imediatamente, sem exigir que o usuário faça login no Discourse.

Além disso, se você está descobrindo que as bios dos usuários não estão sendo definidas no Discourse, pode ser que elas não estejam sendo definidas em seu site WordPress onde o plugin as espera: [wp-discourse/lib/plugin-utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub](https://github.com/discourse/wp-discourse/blob/99325e15190f3a705284dbf582f1c4b2c0b21492/lib/plugin-utilities.php#L631). Se o Woocommerce tiver um campo diferente para bios, você pode acessar esse campo e usá-lo em uma chamada para `sync_sso_record`.

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [Maio 14, 2024, 3:35pm UTC](https://meta.discourse.org/t/whats-the-issue-with-my-curl-request/303708/12 "2024-05-14T15:35:11Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
