---
metadata:
  - name: generator
    content: Diplodoc Platform v5.54.4
alternate:
  - https://yandex.com.tr/dev/games/doc/en/sdk/sdk-purchases.md
  - https://yandex.com.tr/dev/games/doc/hi/sdk/sdk-purchases.md
  - https://yandex.com.tr/dev/games/doc/ko/sdk/sdk-purchases.md
  - https://yandex.com.tr/dev/games/doc/ru/sdk/sdk-purchases.md
  - https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-purchases.md
  - https://yandex.com.tr/dev/games/doc/vi/sdk/sdk-purchases.md
  - https://yandex.com.tr/dev/games/doc/zh/sdk/sdk-purchases.md
  - href: tr/sdk/sdk-purchases.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com.tr/dev/games/doc/tr/llms.txt

# Uygulama içi satın alımlar

<!-- source: tr/_includes/script-common.md -->
<!-- source: tr/_includes/script/index-js.md -->

<!-- endsource: tr/_includes/script/index-js.md -->

<!-- source: tr/_includes/script/requirements-js.md -->

<!-- endsource: tr/_includes/script/requirements-js.md -->

<!-- source: tr/_includes/script/image-modal-js.md -->

<!-- endsource: tr/_includes/script/image-modal-js.md -->
<!-- endsource: tr/_includes/script-common.md -->

Kullanıcıların oyun içi satın alma yapmasına izin vererek gelir elde edebilirsiniz. Örneğin, bir seviyeyi tamamlamak için ekstra süre veya oyun karakteri için aksesuarlar. Bunun için:

- Yandex Oyun Konsolu'nda [uygulama içi satın alımları etkinleştirin](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#connect).
- SDK'da satın alma işlevselliğini yapılandırın.
- [İşlenmemiş satın alımları kontrol etme](#check-purchases) ekleyin.
- [Satın alımları test edin](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#test).

{% note alert %}

Satın alımları yalnızca [tüketimlerini](#check-purchases) etkinleştirdikten sonra test edebilirsiniz. Aksi takdirde işlenmemiş ödemeler ortaya çıkabilir ve bu da moderasyondan geçmeyi [imkansız](https://yandex.com.tr/dev/games/doc/tr/concepts/requirements.md#1-13-1) hale getirebilir.

{% endnote %}

## Etkinleştirme koşulları {#conditions}

SDK ile çalışmadan önce işbirliği şemasını kontrol edin. Bunun için [Geliştirici Konsolu'nda](https://games.yandex.com/console){.external} **Account** bölümüne gidin ve **Unified licensing model** alanının değerini kontrol edin:

{% list tabs %}

- Not connected

  Para kazanma ve satın alımları etkinleştirin:

  1. [Reklam para kazanmayı](https://yandex.com.tr/dev/games/doc/tr/console/adv-monetization.md#enable-int-monetization) etkinleştirin. [Yandex Reklam Ağı ortak arayüzünde](https://partner.yandex.com/){.external} reklam ve satın alımlar için ödeme bilgilerini belirtin. Veriler doğrulandıktan sonra Yandex Reklam Ağı arayüzünde **Extras → Documents** bölümündeki sözleşme durumu **Offer accepted** olarak değişecektir.
  2. Etkinleştirme talebi ile [games-partners@yandex-team.com](mailto:games-partners@yandex-team.com){.external} adresine e-posta gönderin. E-postada şunları belirtin:

      - oyun adı
      - oyun kimliği (ID)

      {% note tip %}

      Talebi mümkün olduğunca erken gönderin, bunu oyun arşivini yüklemeden veya satın alımları eklemeden önce yapabilirsiniz.

      {% endnote %}

      [games-partners@yandex-team.com](mailto:games-partners@yandex-team.com){.external} adresinden satın alımların onaylandığını belirten bir yanıt e-postası alacaksınız.

  Talimatın sonraki adımları için [Satın almayı bağlayın](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#connect) bölümüne bakın.

- Connected

  Tüm oyunlarınızda satın alımlar otomatik olarak etkinleştirilmiştir. [Başlatmaya](#install) geçin.

{% endlist %}

## Başlatma {#install}

Oyuncuların uygulama içi satın alımlar yapabilmesi için `payments` nesnesini kullanın. Şunları yapabilirsiniz:

- Doğrudan `ysdk.payments`'a erişin. Satın alımlar, nesnenin herhangi bir metoduna ilk çağrı yapıldığında başlatılır, bu nedenle ilk çağrı biraz daha yavaş olabilir.

- `ysdk.getPayments()` metodu ile nesneyi başlatın. Bu metod, `payments` metodları için gerekli verileri önceden yükler. Böylece ilk çağrıda yavaşlama olmaz.

{% note alert %}

`YaGames.init()` ve `ysdk.getPayments()` metodlarına, [sahtekarlığa karşı koruma](#signature) için tasarlanmış isteğe bağlı `signed: boolean` parametresi iletilebilir. Değer seçimi, ödemelerin nerede işlendiğine bağlıdır:

- İstemci tarafında işleniyorsa — metodları parametresiz çağırın veya `signed: false` iletin. Satın alma metodları verileri açık biçimde döndürür.

- Sunucu tarafında işleniyorsa — `signed: true` iletin. Bu durumda [payments.getPurchases()](#getpurchases) ve [payments.purchase()](#payments-purchase) metodlarının yanıtlarında tüm veriler yalnızca şifrelenmiş biçimde `signature` parametresinde döndürülür.

{% endnote %}

{% list tabs group=purchases %}

- İstemci tarafında işleme

  Varsayılan parametre ile başlatma (`signed: false`).

  **Yöntem 1: Basitleştirilmiş**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init();

  const payments = ysdk.payments;
  ```

  **Yöntem 2: getPayments() ile ön yükleme**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init();

  try {
      const payments = await ysdk.getPayments();
  } catch (err) {
      // [Satın alımlar kullanılamıyor](*key_explanation).
  }
  ```

- Sunucu tarafında işleme

  `signed: true` parametresi ile başlatma.

  **Yöntem 1: SDK başlatılırken**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init({ signed: true });

  const payments = ysdk.payments;
  ```

  **Yöntem 2: getPayments() ile daha ayrıntılı yapılandırma**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init();

  try {
      const payments = await ysdk.getPayments({ signed: true });
  } catch (err) {
      // [Satın alımlar kullanılamıyor](*key_explanation).
  }
  ```

{% endlist %}

&nbsp; {.empty}

## Satın alma sürecinin etkinleştirilmesi {#payments-purchase}

Uygulama içi satın almayı etkinleştirmek için `payments.purchase()` metodunu kullanın. Bu metod, ödeme ağ geçidini içeren bir çerçeve açar.

**Metodun imzası**

```typescript showLineNumbers
function purchase(data: {
    id: string;
    developerPayload?: string;
}) => Promise<IPurchase | ISign> {}
```

Parametreler alınır:

<div class="full-width-table table-25 table-2c25">

#|
|| **Parametre** | **Tür** | **Açıklama** ||
|| `id` | `string` | [Geliştirici Konsolu'nda ayarlanan](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#add-purchases) ürün tanımlayıcısı. ||
|| `developerPayload` | `string` | İsteğe bağlı parametre. Sunucunuza iletmek istediğiniz satın alma hakkında ek bilgiler içerir ([signature](*key_sign) parametresinde iletilir). ||
|#

</div>

{% list tabs group=purchases %}

- İstemci tarafında işleme

  Varsayılan parametre ile [Başlatma](#install) (`signed: false`).

  Satın alma bilgilerini içeren `Promise<IPurchase>` döndürür.

  ```typescript showLineNumbers
  interface IPurchase {
      productID: string;
      purchaseToken: string;
      developerPayload: string;
  }
  ```

  İçerir:

  <div class="table-25 table-2c25">

  #|
  || **Parametre** | **Tür** | **Açıklama** ||
  || `productID` | `string` | Ürün tanımlayıcısı. ||
  || `purchaseToken` | `string` | Satın almayı [kullanmak](#consumepurchase) için token. ||
  || `developerPayload` | `string` | Satın alma hakkında ek bilgiler. ||
  |#

  </div>

- Sunucu tarafında işleme

  `signed: true` parametresi ile [Başlatma](#install).

  `Promise<ISign>` döndürür.

  ```typescript showLineNumbers
  interface ISign {
      signature: string;
  }
  ```

  İçerir:

  <div class="full-width-table table-25 table-2c25">

  #|
  || **Parametre** | **Tür** | **Açıklama** ||
  || `signature` | `string` | [Oyuncu kimliğini doğrulamak](#purchase-data-example) için şifrelenmiş satın alma verileri ve imza. ||
  |#

  </div>

{% endlist %}

Satın alma başarıyla tamamlandıktan sonra `Promise`, `fulfilled` durumuyla çözümlenir. Oyuncu satın alma yapmadıysa ve pencereyi kapattıysa, `Promise`, `rejected` durumuyla reddedilir.

{% note alert %}

İstikrarsız internet bağlantısı, oyuncunun satın alma yaptığı ancak bunun oyunda işlenmediği durumlara yol açabilir. Bunu önlemek için, satın alımları işlemek üzere [İşlenmemiş satın alımların kontrolü](#check-purchases) ve [payments.consumePurchase()](#consumepurchase) bölümlerinde açıklanan metodları uygulayın.

Bu talimatlara uyulmaması, uygulamada uygulama içi satın alımların devre dışı bırakılmasına veya uygulamanın yayından kaldırılmasına neden olabilir.

{% endnote %}

Kullanıcı oturum açmadan satın alma yapabilir, ancak önceden veya satın alma sırasında [hesabına giriş yapmasını](https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-player.md#open-auth-dialog) önermek önerilir.

#### Örnek {#purchase-example}

Genel durumda:

```javascript showLineNumbers
const ysdk = await YaGames.init();

try {
    const purchase = await ysdk.payments.purchase({ id: 'gold500' });
} catch (err) {
    // Satın alma başarısız oldu: Geliştirici Konsolu'nda bu id'ye sahip ürün eklenmemiş,
    // kullanıcı oturum açmadı, fikrini değiştirdi ve ödeme penceresini kapattı,
    // satın alma için ayrılan süre doldu, yeterli para yok vb.
}
```

İsteğe bağlı `developerPayload` parametresini kullanarak:

```javascript showLineNumbers
const ysdk = await YaGames.init();

try {
    const purchase = await ysdk.payments.purchase({ id: 'gold500', developerPayload: '{serverId:42}' });
} catch (err) {
    // Satın alma hatasının işlenmesi.
}
```

## Satın alınan ürünlerin listesini alma {#getpurchases}

`payments.getPurchases()` metodunu kullanarak:

- Oyuncunun daha önce hangi satın alımları yaptığını öğrenin.

- [İşlenmemiş satın alımların](#check-purchases) varlığını kontrol edin.

- Kalıcı satın alımları işleyin.

**Metodun imzası**

```typescript
function getPurchases(): Promise<IPurchase[] | ISign> {}
```

{% list tabs group=purchases %}

- İstemci tarafında işleme

  Varsayılan parametre ile [Başlatma](#install) (`signed: false`).

  Satın alımlar dizisini içeren `Promise<IPurchase[]>` döndürür. Dizinin her öğesi, [payments.purchase()](#payments-purchase) metodu tarafından döndürülen satın almayla aynı formata sahiptir.

  **Örnek**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init();

  let SHOW_ADS = true;

  try {
      const purchases = await ysdk.payments.getPurchases();

      if (purchases.some(purchase => purchase.productID === 'disable_ads')) {
          SHOW_ADS = false;
      }
  } catch (err) {
      // Satın alma listesini alırken hata oluştu. PAYMENT_FAILURE istisnası fırlatır.
  }
  ```

- Sunucu tarafında işleme

  `signed: true` parametresi ile [Başlatma](#install).

  `Promise<ISign>` döndürür.

  İçerir:

  <div class="full-width-table table-25 table-2c25">

  #|
  || **Parametre** | **Tür** | **Açıklama** ||
  || `signature` | `string` | [Oyuncu kimliğini doğrulamak](#purchase-data-example) için şifrelenmiş satın alma verileri ve imza. ||
  |#

  </div>

  **Örnek**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init({ signed: true });

  try {
      const purchases = await ysdk.payments.getPurchases();
      // Satın alma listesini sunucuya gönderiyoruz.
      const response = await fetch('https://your.game.server/handlePurchases', {
          method: 'POST',
          headers: { 'Content-Type': 'text/plain' },
          body: purchases.signature
      });
  } catch (err) {
      // Satın alma listesini alma veya işleme hatası.
  }
  ```

{% endlist %}

&nbsp; {.empty}

## Tüm ürünlerin kataloğunu alma {#getcatalog}

Mevcut satın almaların ve fiyatlarının listesini almak için `payments.getCatalog()` metodunu kullanın.

**Metodun imzası**

```typescript showLineNumbers
interface IProduct {
    id: string;
    title: string;
    description: string;
    imageURI: string;
    price: string;
    priceValue: string;
    priceCurrencyCode: string;
    getPriceCurrencyImage(size: 'small' | 'medium' | 'svg'): string;
}

function getCatalog(): Promise<IProduct[]> {}
```

Metod, kullanıcı için mevcut ürünlerin listesini döndürür. [Geliştirici Konsolu'nun](https://games.yandex.com/console){.external} **In-app purchases** sekmesindeki tablodan oluşturulur. Her `IProduct` şu özellikleri içerir: {#product-characteristics}

<div class="table-25 table-2c25">

#|
|| **Özellik** | **Tür** | **Açıklama** ||
|| `id` | `string` | Ürün tanımlayıcısı. ||
|| `title` | `string` | Ürün adı. ||
|| `description` | `string` | Ürün açıklaması. ||
|| `imageURI` | `string` | Ürün görselinin URL'si. ||
|| `price` | `string` | Ürün fiyatı `<fiyat> <para birimi kodu>` formatında. ||
|| `priceValue` | `string` | Ürün fiyatı `<fiyat>` formatında. ||
|| `priceCurrencyCode` | `string` | Para birimi kodu. ||
|| `getPriceCurrencyImage(size)` | `string` | Simge boyutu parametresine bağlı olarak para birimi simgesinin adresini alma yöntemi. Olası değerler:

- `small` (varsayılan) — küçük simge alma.

- `medium` — orta boyutlu simge alma.

- `svg` — vektör formatında simge alma. ||
|#

</div>

{% note warning %}

Portal para birimi otomatik olarak belirlenmeli ([madde 1.13.2](https://yandex.com.tr/dev/games/doc/tr/concepts/requirements.md#1-13-2))Bunun için adını ve simgesini `IProduct` özelliklerinden alın. Daha fazla bilgi için [Portal Para Birimi Otomatik Tespiti](https://yandex.com.tr/dev/games/doc/tr/requirements/1/13.md#currency-detection) bölümüne bakın.

{% endnote %}

#### Örnek {#getcatalog-example}

```javascript showLineNumbers
const ysdk = await YaGames.init();

let gameShop = [];

try {
    const purchases = await ysdk.payments.getPurchases();

    gameShop = purchases;
} catch (err) {
    // Satın alma listesini alma hatası.
}
```

## Satın almanın işlenmesi ve oyun içi para biriminin yüklenmesi {#processing-crediting}

İki tür satın alma vardır:

- Kalıcı (örneğin, reklamları devre dışı bırakma). Bunları işlemek için [payments.getPurchases()](#getpurchases) metodunu uygulayın.
- Tüketilebilir (örneğin, oyun içi para birimi). Bunları işlemek için `payments.consumePurchase()` metodunu uygulayın.

#### payments.consumePurchase() {#consumepurchase}

{% note alert %}

`payments.consumePurchase()` metodu çağrıldıktan sonra, işlenen satın alma geri alınamayacak şekilde silinir. Bu nedenle önce oyuncu verilerini [player.setData()](https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-player.md#ingame-data), [player.setStats()](https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-player.md#ingame-data) veya [player.incrementStats()](https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-player.md#ingame-data) metodlarıyla değiştirin, ardından satın almayı işleyin.

{% endnote %}

**Metodun imzası**

```typescript
function consumePurchase(purchaseToken: string): Promise<void> {}
```

[payments.purchase()](#payments-purchase) ve [payments.getPurchases()](#getpurchases) metodları tarafından döndürülen `purchaseToken`'ı kabul eder. İşlem başarılı olduysa, `Promise` `fulfilled` durumuyla çözümlenir, hata oluştuysa `rejected` durumuyla reddedilir.

#### Örnek {#consumepurchase-example}

```javascript showLineNumbers
const ysdk = await YaGames.init();

function addGold(value) {
    return ysdk.player.incrementStats({ gold: value });
}

try {
    const purchase = await ysdk.payments.purchase({ id: 'gold500' });

    await addGold(500);

    await ysdk.payments.consumePurchase(purchase.purchaseToken);
} catch (err) {
    // Tüketilebilir satın alma işleme hatasının işlenmesi.
}
```

## İşlenmemiş satın alımların kontrolü {#check-purchases}

{% note alert %}

Bu kontrol, moderasyondan geçmek için zorunludur ([madde 1.13.1](https://yandex.com.tr/dev/games/doc/tr/concepts/requirements.md#1-13-1)), bu nedenle test satın alımları için bile yapılandırmak önemlidir. Oyuna satın alımlar eklenip tüketim yapılandırılmadan önce test edilirse, testlerden sonra işlenmemiş ödemeler kalabilir ve bu da moderasyondan geçmeyi imkansız hale getirebilir.

{% endnote %}

Uygulama içi satın alma sırasında kullanıcının interneti kesilirse veya sunucunuz kullanılamazsa, satın alma işlenmemiş kalabilir. Bunu önlemek için, örneğin oyunu her başlattığınızda [payments.getPurchases()](#getpurchases) metodunu kullanarak işlenmemiş satın alımların varlığını kontrol edin.

{% list tabs group=purchases %}

- İstemci tarafında işleme

  Varsayılan parametre ile [Başlatma](#install) (`signed: false`).

  **Örnek**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init();

  async function handlePurchase(purchase) {
      if (purchase.productID === 'gold500') {
          await ysdk.player.incrementStats({ gold: 500 });

          await ysdk.payments.consumePurchase(purchase.purchaseToken);
      }
  }

  const purchases = await ysdk.payments.getPurchases().then(purchases => purchases.forEach(consumePurchase));

  for (let purchase of purchases) {
      await handlePurchase(purchase);
  }
  ```

- Sunucu tarafında işleme

  `signed: true` parametresi ile [Başlatma](#install).

  **Örnek**

  ```javascript showLineNumbers
  const ysdk = await YaGames.init({ signed: true });

  try {
      const purchases = await ysdk.payments.getPurchases();
      // Satın alma listesini sunucuya gönderiyoruz.
      const response = await fetch('https://your.game.server/handlePurchases', {
          method: 'POST',
          headers: { 'Content-Type': 'text/plain' },
          body: purchases.signature
      });
  } catch (err) {
      // Satın alma listesini alma veya işleme hatası.
  }
  ```

{% endlist %}

&nbsp; {.empty}

## Sahtekarlığa karşı koruma {#signature}

Oyunda olası istatistik manipülasyonlarından korunmak için, satın alımları sunucu tarafında işleyin:

1. `YaGames.init()` veya `ysdk.getPayments()` metodlarını `{ signed: true }` parametresiyle başlatın.
2. [payments.purchase()](#payments-purchase) ve [payments.getPurchases()](#getpurchases) yanıtlarında alınan imzayı kendi sunucunuza iletin ve [gizli anahtar](#key-example) kullanarak şifresini çözün.
3. Kendi sunucunuzda, oyuncuya oyunda kazandığı öğeleri tahsis edin.

```javascript showLineNumbers
function serverPurchase(signature) {
    return fetch('https://your.game.server/handlePurchase', {
        method: 'POST',
        headers: { 'Content-Type': 'text/plain' },
        body: signature
    });
}

// Satın alımların { signed: true } parametresiyle başlatıldığından emin olun.
const ysdk = await YaGames.init({ signed: true });

try {
    const purchase = await ysdk.payments.purchase({ id: 'gold500' });

    // Sunucuda 500 altın yüklüyoruz...
    await serverPurchase(purchase.signature);
} catch (err) {
    // Satın alma hatası.
}
```

Sunucuya iletilen isteğin `signature` parametresi, satın alma verilerini ve imzayı içerir. `base64` kodlamasında iki dizeyi temsil eder: `<imza>.<satın alma verileriyle JSON>`.

#### Signature örneği {#signature-example}

```text
hQ8adIRJWD29Nep+0P36Z6edI5uzj6F3tddz6Dqgclk=.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZEF0IjoxNTcxMjMzMzcxLCJyZXF1ZXN0UGF5bG9hZCI6InF3ZSIsImRhdGEiOnsidG9rZW4iOiJkODVhZTBiMS05MTY2LTRmYmItYmIzOC02ZDJhNGNhNDQxNmQiLCJzdGF0dXMiOiJ3YWl0aW5nIiwiZXJyb3JDb2RlIjoiIiwiZXJyb3JEZXNjcmlwdGlvbiI6IiIsInVybCI6Imh0dHBzOi8veWFuZGV4LnJ1L2dhbWVzL3Nkay9wYXltZW50cy90cnVzdC1mYWtlLmh0bWwiLCJwcm9kdWN0Ijp7ImlkIjoibm9hZHMiLCJ0aXRsZSI6ItCR0LXQtyDRgNC10LrQu9Cw0LzRiyIsImRlc2NyaXB0aW9uIjoi0J7RgtC60LvRjtGH0LjRgtGMINGA0LXQutC70LDQvNGDINCyINC40LPRgNC1IiwicHJpY2UiOnsiY29kZSI6IlJVUiIsInZhbHVlIjoiNDkifSwiaW1hZ2VQcmVmaXgiOiJodHRwczovL2F2YXRhcnMubWRzLnlhbmRleC5uZXQvZ2V0LWdhbWVzLzE4OTI5OTUvMmEwMDAwMDE2ZDFjMTcxN2JkN2EwMTQ5Y2NhZGM4NjA3OGExLyJ9fX0=
```

#### İletilen satın alma verileri örneği (`JSON` formatında) {#purchase-data-example}

{% note warning %}

`serverPurchase(signature)` fonksiyonundaki signature parametresinin veri formatı, [payments.getPurchases()](#getpurchases) metodunda kullanılandan farklıdır.

`payments.getPurchases()` metodunda, `signature` parametresi `data` alanında bir satın alma nesneleri dizisi içerir. `serverPurchase(signature)` fonksiyonunda ise bir satın alma nesnesi içerir.

{% endnote %}

```json showLineNumbers
{
  "algorithm": "HMAC-SHA256",
  "issuedAt": 1571233371,
  "requestPayload": "qwe",
  "data": {
    "token": "d85ae0b1-9166-4fbb-bb38-6d2a4ca4416d",
    "status": "waiting",
    "errorCode": "",
    "errorDescription": "",
    "url": "https://yandex.ru/games/sdk/payments/trust-fake.html",
    "product": {
      "id": "noads",
      "title": "Reklamsız",
      "description": "Oyunda reklamı devre dışı bırak",
      "price": {
        "code": "YAN",
        "value": "49"
      },
      "imagePrefix": "https://avatars.mds.yandex.net/get-games/1892995/2a0000016d1c1717bd7a0149ccadc86078a1/"
    },
    "developerPayload": "TEST DEVELOPER PAYLOAD"
  }
}
```

#### Gizli anahtar örneği {#key-example}

`t0p$ecret`

İmza doğrulama için gizli anahtar oyuna özgüdür. [Geliştirici Konsolu'nda ](https://games.yandex.com/console){.external} satın alımlar oluşturulurken otomatik olarak oluşturulur. Anahtar, **In-app purchases** → **Settings** sekmesinde görüntülenir.

#### Sunucuda imza doğrulama örneği {#server-check-example}

{% list tabs %}

* Python 3

    ```python showLineNumbers
    import hashlib
    import hmac
    import base64
    import json

    usedTokens = {}

    key = 't0p$ecret' # Anahtarı gizli tutun.
    secret = bytes(key, 'utf-8')
    signature = 'hQ8adIRJWD29Nep+0P36Z6edI5uzj6F3tddz6Dqgclk=.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZEF0IjoxNTcxMjMzMzcxLCJyZXF1ZXN0UGF5bG9hZCI6InF3ZSIsImRhdGEiOnsidG9rZW4iOiJkODVhZTBiMS05MTY2LTRmYmItYmIzOC02ZDJhNGNhNDQxNmQiLCJzdGF0dXMiOiJ3YWl0aW5nIiwiZXJyb3JDb2RlIjoiIiwiZXJyb3JEZXNjcmlwdGlvbiI6IiIsInVybCI6Imh0dHBzOi8veWFuZGV4LnJ1L2dhbWVzL3Nkay9wYXltZW50cy90cnVzdC1mYWtlLmh0bWwiLCJwcm9kdWN0Ijp7ImlkIjoibm9hZHMiLCJ0aXRsZSI6ItCR0LXQtyDRgNC10LrQu9Cw0LzRiyIsImRlc2NyaXB0aW9uIjoi0J7RgtC60LvRjtGH0LjRgtGMINGA0LXQutC70LDQvNGDINCyINC40LPRgNC1IiwicHJpY2UiOnsiY29kZSI6IlJVUiIsInZhbHVlIjoiNDkifSwiaW1hZ2VQcmVmaXgiOiJodHRwczovL2F2YXRhcnMubWRzLnlhbmRleC5uZXQvZ2V0LWdhbWVzLzE4OTI5OTUvMmEwMDAwMDE2ZDFjMTcxN2JkN2EwMTQ5Y2NhZGM4NjA3OGExLyJ9fX0='

    sign, data = signature.split('.')
    message = base64.b64decode(data)

    purchaseData = json.loads(message)
    result = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())
    if result.decode('utf-8') == sign:
      print('Signature check ok!')

      if not purchaseData['data']['token'] in usedTokens:
        usedTokens[purchaseData['data']['token']] = True # Veritabanını kullanın.
        print('Double spend check ok!')

        print('Apply purchase:', purchaseData['data']['product'])
        # Burada satın alınanları güvenle tahsis edebilirsiniz.
    ```

* Node.js

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

    const usedTokens = {};

    const key = 't0p$ecret'; // Anahtarı gizli tutun.
    const signature = 'hQ8adIRJWD29Nep+0P36Z6edI5uzj6F3tddz6Dqgclk=.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZEF0IjoxNTcxMjMzMzcxLCJyZXF1ZXN0UGF5bG9hZCI6InF3ZSIsImRhdGEiOnsidG9rZW4iOiJkODVhZTBiMS05MTY2LTRmYmItYmIzOC02ZDJhNGNhNDQxNmQiLCJzdGF0dXMiOiJ3YWl0aW5nIiwiZXJyb3JDb2RlIjoiIiwiZXJyb3JEZXNjcmlwdGlvbiI6IiIsInVybCI6Imh0dHBzOi8veWFuZGV4LnJ1L2dhbWVzL3Nkay9wYXltZW50cy90cnVzdC1mYWtlLmh0bWwiLCJwcm9kdWN0Ijp7ImlkIjoibm9hZHMiLCJ0aXRsZSI6ItCR0LXQtyDRgNC10LrQu9Cw0LzRiyIsImRlc2NyaXB0aW9uIjoi0J7RgtC60LvRjtGH0LjRgtGMINGA0LXQutC70LDQvNGDINCyINC40LPRgNC1IiwicHJpY2UiOnsiY29kZSI6IlJVUiIsInZhbHVlIjoiNDkifSwiaW1hZ2VQcmVmaXgiOiJodHRwczovL2F2YXRhcnMubWRzLnlhbmRleC5uZXQvZ2V0LWdhbWVzLzE4OTI5OTUvMmEwMDAwMDE2ZDFjMTcxN2JkN2EwMTQ5Y2NhZGM4NjA3OGExLyJ9fX0=';

    const [sign, data] = signature.split('.');
    const purchaseDataString = Buffer.from(data, 'base64').toString('utf8');
    const hmac = crypto.createHmac('sha256', key);

    hmac.update(purchaseDataString);

    const purchaseData = JSON.parse(purchaseDataString);

    if (sign === hmac.digest('base64')) {
      console.log('Signature check ok!');

      if (!usedTokens[purchaseData.data.token]) {
        usedTokens[purchaseData.data.token] = true; // Veritabanını kullanın.
        console.log('Double spend check ok!');

        console.log('Apply purchase:', purchaseData.data.product);
        // Burada satın alınanları güvenle tahsis edebilirsiniz.
      }
    }
    ```

{% endlist %}

---

<!-- source: tr/_includes/sdk-support.md -->
{% note info %}

Destek ekibi, hazır oyunu Yandex Oyun platformuna yerleştirmenize yardımcı olur. Geliştirme ve test etme konularındaki uygulamalı sorulara ise diğer geliştiriciler [Discord Topluluğu](https://discord.com/invite/wU4p3whr4T){.external} yanıt verir.

{% endnote %}

Yandex Games SDK kullanırken sorunla karşılaşırsanız veya sorunuz varsa, lütfen destek ekibiyle iletişime geçin:

<!-- source: tr/_includes/button-chat.md -->
<a href="https://yandex.com/chat/#/user/a4fa5c06-75db-9b38-6eea-b1673785f7d5">
  <span class="button">Sohbete yaz</span>
</a>
<!-- endsource: tr/_includes/button-chat.md -->
<!-- endsource: tr/_includes/sdk-support.md -->

[*key_id]: `id: string` — [Geliştirici Konsolu'nda](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#connect) belirlenen ürün tanımlayıcısı.

[*key_developerPayload]: `developerPayload: string` — isteğe bağlı parametre. Sunucunuza iletmek istediğiniz satın alma hakkında ek bilgi (`signature` parametresinde iletilecektir).

[*key_sign]: Sunucuya gönderilen isteğin `signature` parametresi, satın alma hakkındaki verileri ve imzayı içerir. `base64` kodlamasında iki dizeden oluşur: `<imza>.<Satın alma hakkında JSON verileri>`.

[*key_purchaseToken]: `purchaseToken: string` — [payments.purchase()](#payments-purchase) ve [payments.getPurchases()](#getpurchases) metodları tarafından döndürülen token.

[*key_payments]: Satın almaları `ysdk.getPayments()` ile başlatmadıysanız, doğrudan `ysdk.payments`'a başvurun.

[*key_explanation]: - [Monetizasyonu etkinleştirin](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#connect).
- [Geliştirici Konsolu'nda](https://games.yandex.com/console){.external} **In-app purchases** sekmesine gidin ve şunları kontrol edin:
    - En az bir oyun içi ürün içeren bir tablo mevcut.
    - **Purchases are enabled** yazısı görüntüleniyor.