---
title: "Передача уведомлений сервера App Store в Adapty через ваш бэкенд"
description: "Если ваш бэкенд должен сохранять URL в App Store Connect, передавайте уведомления сервера Apple в Adapty без изменений, чтобы Adapty получал события подписки."
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skills: `npx adapty skills install --yes`

Если ваш бэкенд должен сохранить свой URL в App Store Connect, передавайте серверные уведомления App Store из вашего бэкенда в Adapty без изменений. Если бэкенду не нужен собственный URL в App Store Connect, [настройте пересылку на ваш бэкенд в Adapty](enable-app-store-server-notifications#raw-events-forwarding) — этот вариант не требует кода.

Adapty обрабатывает уведомления, поступающие с вашего бэкенда, так же, как если бы их отправила Apple напрямую. С [Refund Saver](refund-saver) Adapty по-прежнему отвечает на запросы возврата средств среди этих уведомлений.

Если ваш бэкенд получает уведомления о реальном времени от Google Play через собственный топик Pub/Sub, никаких доработок для передачи их в Adapty не требуется. [Добавьте push-подписку для Adapty к этому топику](enable-real-time-developer-notifications-rtdn#send-notifications-to-two-adapty-apps).

Чтобы передавать серверные уведомления App Store в Adapty:

1. В Adapty откройте приложение, которое подключаете: у каждого приложения Adapty есть собственный URL для уведомлений. Перейдите в [**App settings** > **iOS SDK**](https://app.adapty.io/settings/ios-sdk). В разделе **App Store server notifications** скопируйте URL из поля **URL for App Store server notifications**.
2. В вашем бэкенде отправляйте каждое уведомление от Apple на скопированный URL. В каждом запросе:

   - Оставьте тело запроса от Apple без изменений: `{"signedPayload": "…"}`.
   - Укажите заголовок `Content-Type: application/json`.
   - Не добавляйте заголовок `Authorization`.

   Если Adapty также пересылает уведомления на ваш бэкенд, не отправляйте их обратно в Adapty.

Вот примеры для разных языков программирования:

<Tabs groupId="current-os" queryString>
<TabItem value="python" label="Python" default>

```python showLineNumbers

url = "https://api.adapty.io/api/v1/sdk/apple/webhook/123a258e62fad41bfa734f4b0dbcad45/" # не забудьте заменить этот URL

payload = '{"signedPayload":"eyJhbGciOiJFUzI1NiIs..."}' # тело запроса от Apple, без изменений

headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)
```

</TabItem>
<TabItem value="javascript" label="Javascript" default>

```javascript  showLineNumbers
const axios = require('axios');

const url = 'https://api.adapty.io/api/v1/sdk/apple/webhook/123a258e62fad41bfa734f4b0dbcad45/'; // don't forget to replace this URL

const payload = '{"signedPayload":"eyJhbGciOiJFUzI1NiIs..."}'; // Apple's request body, unchanged

const config = {
  method: 'post',
  url: url,
  headers: {
    'Content-Type': 'application/json'
  },
  data: payload,
};

const response = await axios(config);
```

</TabItem>
<TabItem value="php" label="PHP" default>

```php  showLineNumbers
<?php
require_once 'HTTP/Request2.php';

$url = 'https://api.adapty.io/api/v1/sdk/apple/webhook/123a258e62fad41bfa734f4b0dbcad45/'; // don't forget to replace this URL

$payload = '{"signedPayload":"eyJhbGciOiJFUzI1NiIs..."}'; // Apple's request body, unchanged

$request = new HTTP_Request2();
$request->setUrl($url);
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json'
));
$request->setBody($payload);
$response = $request->send();
```

</TabItem>
<TabItem value="ruby" label="Ruby" default>

```ruby  showLineNumbers
require "uri"
require "net/http"

url = URI("https://api.adapty.io/api/v1/sdk/apple/webhook/123a258e62fad41bfa734f4b0dbcad45/") # don't forget to replace this URL

payload = '{"signedPayload":"eyJhbGciOiJFUzI1NiIs..."}' # Apple's request body, unchanged

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request.body = payload

response = https.request(request)
```

</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers
String url = "https://api.adapty.io/api/v1/sdk/apple/webhook/123a258e62fad41bfa734f4b0dbcad45/"; // don't forget to replace this URL

String payload = "{\"signedPayload\":\"eyJhbGciOiJFUzI1NiIs...\"}"; // Apple's request body, unchanged

OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, payload);
Request request = new Request.Builder()
  .url(url)
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .build();
Response response = client.newCall(request).execute();
```

</TabItem>
<TabItem value="go" label="Go" default>

  ```go showLineNumbers
package main

	"fmt"
	"strings"
	"net/http"
)

func main() {
	url := "https://api.adapty.io/api/v1/sdk/apple/webhook/123a258e62fad41bfa734f4b0dbcad45/" // Replace this with the actual URL

	payload := strings.NewReader(`{"signedPayload":"eyJhbGciOiJFUzI1NiIs..."}`) // Apple's request body, unchanged

	method := "POST"

	client := &http.Client{}
	req, err := http.NewRequest(method, url, payload)
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}
	req.Header.Add("Content-Type", "application/json")

	res, err := client.Do(req)
	if err != nil {
		fmt.Println("Error sending request:", err)
		return
	}
	defer res.Body.Close()
}
  ```

</TabItem>  </Tabs>

Ответ `200` не подтверждает, что Adapty смог использовать уведомление. Adapty отвечает до того, как декодирует подписанный payload. Чтобы убедиться, что уведомления доходят до Adapty, совершите [покупку в песочнице](test-purchases-in-sandbox). Затем проверьте, что [статус уведомлений](enable-app-store-server-notifications#check-that-notifications-reach-adapty) в разделе **App Store server notifications** отображается как **Active**.