Вау! Создайте интеграцию с WhatsApp. Начните бесплатно. Регистрация
WhatsApp API

Оплата прошла — отправьте приглашение в группу

Дайте оплатившим прямой путь от checkout к вашей закрытой группе WhatsApp. После подтверждения оплаты backend может получить приглашение и автоматически доставить его плательщику через Whapi.Cloud. Этот сценарий показывает интеграторам, как собрать такой поток через WhatsApp API.

Запускается вашим webhook оплаты Приглашение приходит в WhatsApp плательщика
Подтверждение checkout рядом с приглашением в группу WhatsApp, которое плательщик может открыть.
Декоративный пузырь
Сценарий

Когда использовать этот поток

Вы продаёте доступ в закрытую группу WhatsApp

Платный продукт — место в закрытой группе WhatsApp, а вход — ссылка-приглашение этой группы.

Нужная группа определяется динамически

Backend выбирает, какая группа WhatsApp соответствует купленному продукту или тарифу.

Приглашение должно уходить само

Плательщик должен получить приглашение без того, чтобы кто-то копировал ссылку.

Чат WhatsApp на телефоне с сообщением-приглашением в группу, которое плательщик может открыть и вступить.
Опыт клиента

Плательщик получает приглашение без ожидания

До автоматизации кто-то копирует ссылку на группу или догоняет плательщика после checkout, и оплативший человек ждёт, не понимая, есть ли доступ.

После подтверждения оплаты приглашение в группу появляется в чате WhatsApp плательщика: его можно открыть и вступить, когда удобно. Интеграторы собирают этот результат через WhatsApp API.

Поток

От подтверждённой оплаты к приглашению в группу

1

Оплата подтверждена

Webhook оплаты передаёт в backend номер WhatsApp плательщика и купленный продукт или тариф.

2

Найдите платную группу

GET /groups

Сопоставьте покупку с нужной группой WhatsApp. Если её id ещё не сохранён, getGroups возвращает список, по которому вы ищете совпадение.

3

Получите код приглашения

GET /groups/{GroupID}/invite

getGroupInvite читает код приглашения только что найденной группы.

4

Отправьте приглашение плательщику

POST /groups/link/{InviteCode}

sendGroupInvite доставляет это приглашение на номер WhatsApp плательщика из события оплаты. Плательщик вступает, когда открывает ссылку.

Нужно следить за доставкой? Следите за тем, что происходит после отправки, через webhook статусов. Ответ на отправку только подтверждает, что запрос принят. Про статусы доставки →

Подготовка

Перед запуском потока

Подключите номер WhatsApp, который отправит приглашение, и подписывайте каждый запрос API-токеном этого номера. Webhook оплаты остаётся в вашем стеке. Whapi.Cloud выполняет вызовы приглашения в группу.

Дополнительно: глубже по этому потоку

Реализация API

Три вызова по порядку

Найдите платную группу, получите код приглашения и доставьте приглашение плательщику. Перенесите телефон плательщика из payload оплаты в поле to тела отправки.

Получите API-токен бесплатно после регистрации на whapi.cloud и подставьте его в код вместо Your_Token из примеров.

Найдите платную группу

Найдите группу WhatsApp, которая соответствует купленному продукту, если id группы ещё не сохранён.

curl --request GET \
     --url https://gate.whapi.cloud/groups \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/groups",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/groups"

headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
}

response = requests.get(url, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/groups';

const response = await fetch(url, {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/groups")
  .get()
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/groups");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/groups", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}

Получите код приглашения

Прочитайте код приглашения найденной группы.

curl --request GET \
     --url https://gate.whapi.cloud/groups/{GroupID}/invite \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/groups/{GroupID}/invite",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/groups/{GroupID}/invite"

headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
}

response = requests.get(url, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/groups/{GroupID}/invite';

const response = await fetch(url, {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/groups/{GroupID}/invite")
  .get()
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/groups/{GroupID}/invite");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/groups/{GroupID}/invite", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}

Отправьте приглашение плательщику

Доставьте это приглашение на номер телефона из события оплаты.

curl --request POST \
     --url https://gate.whapi.cloud/groups/link/{InviteCode} \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "447123456789"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/groups/link/{InviteCode}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/groups/link/{InviteCode}"

payload = {
  "to": "447123456789"
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/groups/link/{InviteCode}';

const response = await fetch(url, {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
  "to": "447123456789"
}),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/groups/link/{InviteCode}")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/groups/link/{InviteCode}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "447123456789" });
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to":"447123456789"}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/groups/link/{InviteCode}", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Доставка

Статус после ответа на отправку

Успешный ответ на отправку не значит, что плательщик уже получил приглашение. Первый статус до webhook — pending. Дальнейшие изменения приходят только в statuses.post и statuses.put. Если статус остаётся pending и не переходит в sent, delivered или более поздний ack, сообщение не доставлено. Проверьте payload и может ли аккаунт отправлять этот тип сообщения.

  • Вызов отправки принят, когда в ответе есть sent.

  • Дальнейшие ack приходят в statuses.post и statuses.put, а не дополнительными полями ответа на отправку.

Что читать про доставку и webhook

Напишите в поддержку, если что-то пошло не так
Когда что-то ломается

Обрабатывайте сбои на каждом шаге

Оплата может пройти, а цепочка приглашения всё равно оборваться: группы нет в списке, код приглашения не читается или падает sendGroupInvite. Обработайте обрыв на этом шаге, чтобы плательщик всё же получил ссылку.

Оплата прошла, а приглашение нет?

Держите состояние оплаты отдельно от доставки приглашения. Повторите упавший шаг или предупредите команду, чтобы плательщик получил ссылку. Не отправляйте клиента на checkout снова. Клиенты часто говорят, что поддержка отвечает быстро. Не стесняйтесь спросить.

Напишите в поддержку, если что-то пошло не так

Разбор по шагу API

Status What it means What to do
400 Wrong request parameters
500 Internal Error
Status What it means What to do
400 Wrong request parameters
401 Need channel authorization for create invite link
403 You do not have permissions for this action
404 Specified group not found
429 Too many requests
500 Internal Error
Status What it means What to do
400 Wrong request parameters
401 Need channel authorization for this action
402 Trial version limit exceeded
404 Specified group not found
429 Too many requests
500 Internal Error
FAQ

Вопросы, которые задают операторы

Если GroupID платной группы уже сохранён, getGroups можно пропустить и начать с getGroupInvite. Код приглашения всё равно нужен до sendGroupInvite.
Перенесите телефон плательщика из payload вашего webhook оплаты в поле to у sendGroupInvite. Whapi.Cloud не читает вашу биллинговую систему.
Отправка доставляет ссылку-приглашение в чат. Плательщик вступает, когда открывает ссылку.
Повторите упавший шаг приглашения или предупредите команду. Не оставляйте плательщика ждать и не просите оплатить ещё раз.
Найти группу, получить приглашение и отправить эту ссылку — основная причина выбирать шлюз с полным набором функций, когда продукт — доступ в сообщество.
Поддерживаемые функции WhatsApp

Всё, что нужно для создания автоматизации WhatsApp

Whapi.Cloud предоставляет доступ к полному набору функций WhatsApp — сообщениям, медиа, группам, каналам, вебхукам и не только. Создавайте ботов, автоматизации и интеграции без функциональных ограничений.

Выбор разработчиков

Нам доверяют 3 300+ разработчиков и SaaS-команд

Разработчики по всему миру используют Whapi.Cloud для создания автоматизаций, ботов, CRM-интеграций, массовых рассылок и продвинутых WhatsApp-воркфлоу. Наша инфраструктура обрабатывает миллионы API-запросов с высокой стабильностью — и этот показатель растёт каждый месяц.

Иконка функции

5,5K+

активных API-каналов

Иконка функции

21M+

API-запросов в месяц

«Всё просто, интуитивно и легко. Документация понятная, и вся нужная информация всегда под рукой. Отличная работа.»

Roberto K. / Web-разработчик

«Мы подключили WhatsApp к нашим процессам через n8n всего за несколько минут. Без кода, без сложностей — всё заработало с первого раза.»

Martin P. / Разработчик

«Whapi.Cloud стал важной частью нашей коммуникации с клиентами. Мы автоматизировали обновления по продуктам, уведомления о заказах и поддержку — без шаблонов и модерации.»

Oscar T. / CTO

Декоративный пузырь