---
metadata:
  - name: generator
    content: Diplodoc Platform v5.66.0
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: https://yandex.com.tr/dev/games/doc/tr/sdk/sdk-purchases.md
    type: text/markdown
    title: Markdown version
  - href: https://yandex.com.tr/dev/games/doc/tr/llms.txt?revision=r21993288
    rel: describedby
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com.tr/dev/games/doc/tr/llms.txt?revision=r21993288

# 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 -->

<!-- source: tr/_includes/sdk/common-with-plugins.md -->
Oyuna satın alımlar ekleyin (örneğin, bir seviyeyi tamamlamak için ek süre veya oyun karakteri için aksesuarlar) ve gelir elde edin. Bunun için:
<!-- endsource: tr/_includes/sdk/common-with-plugins.md -->

- [Satın alımları etkinleştirin](#conditions) — moderasyonu açmak için bunu önceden yapın.
- Geliştirici Konsolunda [satın alımları ekleyin](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#add-purchases).
- Oyunun kaynak dosyalarını [güncelleyin](https://yandex.com.tr/dev/games/doc/tr/console/purchases.md#update-files): SDK ile [başlatmayı](#install) ve [işlenmemiş satın alımları kontrol etmeyi](#check-purchases) yapılandırın.
- [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 hale getirebilir ([1.13.1 numaralı madde](https://yandex.com.tr/dev/games/doc/tr/concepts/requirements.md#1-13-1)).

    {% endnote %}

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

Satın alımları etkinleştirme talebini mümkün olduğunca erken gönderin — bu olmadan oyun moderasyondan geçemez. Talep işlenirken Konsolda ve oyun kodunda ayarlamalara devam edebilir, sonucu aldığınızda oyunu incelemeye gönderebilirsiniz.

Satın alımları nasıl etkinleştireceğiniz işbirliği biçiminize bağlıdır:

1. [Geliştirici Konsolu'nu](https://games.yandex.com/console){.external} açın.
1. **Account** bölümüne gidin.
1. **Unified licensing model** alanının değerini kontrol edin:

    - **<span class="green">Active</span>** — tüm oyunlarınızdaki satın alımlar otomatik olarak etkinleştirilmiştir.
    - **<span class="blue">Under review</span>** veya **<span class="blue">Prepared</span>** — sözleşme hazırlanıyor, sözleşme yürürlüğe girdiğinde satın alımlar otomatik olarak etkinleştirilecektir.
    - **<span class="gray">Not connected</span>**:

        - Rusya, tüzel kişi veya bireysel girişimci — sözleşmeyi kendiniz [imzalamak](https://yandex.com.tr/dev/games/doc/tr/console/manage-account.md#cooperation-form) için **Go to ULM**'a tıklayın.
        - Diğer ülkeler, tüzel kişi — sözleşmeyi kendiniz [imzalamak](https://yandex.com.tr/dev/games/doc/tr/console/manage-account.md#cooperation-form) için **Go to ULM**'a tıklayın.
        - Diğer durumlar — satın alımları ayrıca etkinleştirin:

            {% cut "**ULM olmadan satın alımlar nasıl etkinleştirilir**" %}

            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.
            1. 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:

                - oyunun adı;
                - oyunun kimliği (ID).

                [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.

            {% endcut %}

    - **<span class="yellow">Disabled</span>** — bir sözleşme vardı, ancak artık yürürlükte değil. Kayıt yalnızca yeni bir [geliştirici hesabı](https://yandex.com.tr/dev/games/doc/tr/console/manage-account.md) oluşturularak yapılabilir.

## 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/sdk-support.md -->
{% note info %}

Destek ekibi, hazır bir oyunun Yandex Oyunlar platformunda yayınlanmasına yardımcı olur. Geliştirme ve test etmeyle ilgili uygulamalı sorulara [Discord topluluğunda](https://discord.com/invite/wU4p3whr4T){.external} diğer geliştiriciler yanıt verir.

{% endnote %}

Yandex Oyun SDK'sını kullanırken bir sorunla karşılaşırsanız veya bir sorunuz olursa 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/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.