---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://yandex.com/dev/games/doc/en/sdk/sdk-purchases.md
  - https://yandex.com/dev/games/doc/hi/sdk/sdk-purchases.md
  - https://yandex.com/dev/games/doc/ko/sdk/sdk-purchases.md
  - https://yandex.com/dev/games/doc/ru/sdk/sdk-purchases.md
  - https://yandex.com/dev/games/doc/tr/sdk/sdk-purchases.md
  - https://yandex.com/dev/games/doc/vi/sdk/sdk-purchases.md
  - https://yandex.com/dev/games/doc/zh/sdk/sdk-purchases.md
  - href: hi/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/dev/games/doc/hi/llms.txt

# इन-गेम खरीदारियाँ

आप उपयोगकर्ताओं को इन-गेम खरीदारी करने का विकल्प देकर राजस्व कमा सकते हैं। उदाहरण के लिए, वे लेवल पूरा करने के लिए अतिरिक्त समय या किसी पात्र के लिए एक्सेसरी खरीद सकते हैं। ऐसा करने के लिए:

- Yandex Games डेवलपर डैशबोर्ड में [इन-गेम खरीदारियाँ सक्षम करें](https://yandex.com/dev/games/doc/hi/console/purchases.md#connect)।
- खरीदारियों के साथ काम करने के लिए SDK कॉन्फ़िगर करें।
- [अप्रोसेस्ड पर्चेज़ की जाँच करें](#check-purchases) जोड़ें।
- [पर्चेज़ का परीक्षण करें](https://yandex.com/dev/games/doc/hi/console/purchases.md#test)।

{% note alert "चेतावनी" %}

पर्चेज़ का परीक्षण केवल उनके [कंस्यूम्प्शन](#check-purchases) को जोड़ने के बाद ही किया जा सकता है। अन्यथा, अप्रोसेस्ड पेमेंट्स उत्पन्न हो सकती हैं, जो मोडरेशन की प्रक्रिया को [असंभव](../concepts/requirements#1-13-1) बना सकती हैं।

{% endnote %}

## शर्तें {#conditions}

खेल में खरीदारियों को जोड़ने और गेम के ड्राफ्ट को प्रकाशित करने के बाद, खरीदों को कनेक्ट करने के लिए एक ईमेल भेजें [games-partners@yandex-team.com](mailto:games-partners@yandex-team.com). ईमेल में खेल का नाम और पहचानकर्ता (ID) अवश्य उल्लेख करें।

[games-partners@yandex-team.com](mailto:games-partners@yandex-team.com) से उत्तरी ईमेल प्राप्त करने के बाद, जिसमें खरीदों की अनुमति है, उन्हें सेटअप और परीक्षण के लिए तैयार किया जा सकेगा।

## आरंभ करना {#install}

खिलाड़ियों को इन-ऐप खरीदारी करने देने के लिए, `payments` ऑब्जेक्ट का उपयोग करें। आप यह कर सकते हैं:

- सीधे `ysdk.payments` को एक्सेस करें। खरीदारी के तरीकों को पहली बार कॉल करने पर इनिशियलाइज़ किया जाता है, जिसके कारण पहली कॉल थोड़ी धीमी हो सकती है।

- `ysdk.getPayments()` मेथड का उपयोग करके ऑब्जेक्ट को इनिशियलाइज़ करें। यह `payments` के तरीकों के लिए आवश्यक डेटा को प्रीलोड करता है। इस तरह उनकी पहली कॉल धीमी नहीं होगी।

{% note alert "प्रतिबंध" %}

`YaGames.init()` और `ysdk.getPayments()` में आप वैकल्पिक पैरामीटर `signed: boolean` पास कर सकते हैं, जो [फ़्रॉड से सुरक्षा](#signature) के लिए है। मान का चुनाव इस बात पर निर्भर करता है कि भुगतान कहाँ प्रोसेस किए जाते हैं:

- अगर क्लाइंट साइड पर — तो मेथड्स को बिना पैरामीटर के या `signed: false` पास करके कॉल करें। खरीदारी के तरीके डेटा को खुले रूप में रिटर्न करेंगे।

- अगर सर्वर साइड पर — `signed: true` पास करें। ऐसे में [payments.getPurchases()](#getpurchases) और [payments.purchase()](#payments-purchase) मेथड्स के जवाब में सारा डेटा सिर्फ एन्क्रिप्टेड फॉर्म में `_signature` पैरामीटर में रिटर्न किया जाएगा।

{% endnote %}

{% list tabs group=purchases %}

- क्लाइंट साइड प्रोसेसिंग

  डिफ़ॉल्ट पैरामीटर (`signed: false`) के साथ इनिशियलाइज़ेशन।

  **तरीका 1: सरलीकृत**

  ```javascript
  YaGames.init() // या YaGames.init({ signed: false }).
      .then(ysdk => {
          // खरीदारी के तरीके ysdk.payments में उपलब्ध हैं।
          console.log(ysdk.payments);
      }).catch(err => {
          // [खरीदारी उपलब्ध नहीं](*key_explanation)।
      });
  ```

  **तरीका 2: getPayments() के जरिए प्रीलोडिंग**

  ```javascript
  var payments = null;
  YaGames.init()
      .then(ysdk => {
          ysdk.getPayments()
              .then(_payments => {
                  // खरीदारी के तरीके payments में उपलब्ध हैं।
                  payments = _payments;
                  console.log(payments);
              }).catch(err => {
                  // [खरीदारी उपलब्ध नहीं](*key_explanation)।
              });
      });
  ```

- सर्वर साइड प्रोसेसिंग

  `signed: true` पैरामीटर के साथ इनिशियलाइज़ेशन।

  **तरीका 1: SDK इनिशियलाइज़ेशन के दौरान**

  ```javascript
  YaGames.init({ signed: true }) // खरीदारी के लिए सिग्नेचर वर्किंग को एनेबल करें।
      .then(ysdk => {
          // खरीदारी के तरीके ysdk.payments में उपलब्ध हैं।
          console.log(ysdk.payments);
      }).catch(err => {
          // [खरीदारी उपलब्ध नहीं](*key_explanation)।
      });
  ```

  **तरीका 2: getPayments() के जरिए बेहतर कॉन्फ़िगरेशन**

  ```javascript
  var payments = null;
  YaGames.init()
      .then(ysdk => {
          ysdk.getPayments({ signed: true })
              .then(_payments => {
                  // खरीदारी के तरीके payments में उपलब्ध हैं।
                  payments = _payments;
                  console.log(payments);
              }).catch(err => {
                  // [खरीदारी उपलब्ध नहीं](*key_explanation)।
              });
      });
  ```

{% endlist %}

&nbsp; {.empty}

## खरीदारी प्रक्रिया को सक्रिय करना {#payments-purchase}

इंगेम खरीदारी को सक्रिय करने के लिए, `payments.purchase({ id, developerPayload })` मेथड का उपयोग करें।

- `id: string` — [डेवलपर डैशबोर्ड](https://yandex.com/dev/games/doc/hi/console/purchases.md#connect) में उत्पाद ID सेट।
- `developerPayload: string` — वैकल्पिक पैरामीटर। अतिरिक्त खरीदारी डेटा जिसे आप अपने सर्वर पर भेजना चाहते हैं ([signature](*key_sign) पैरामीटर में स्थानांतरित)।


यह विधि भुगतान गेटवे के साथ एक फ़्रेम खोलती है।

{% list tabs group=purchases %}

- क्लाइंट साइड प्रसंस्करण

  [इनिशिएशन](#install) डिफ़ॉल्ट पैरामीटर (`signed: false`) के साथ।

  `Promise<Purchase>` को लौटाता है।

  `Purchase: object` — खरीदारी के बारे में ऑब्जेक्ट, जानकारी। इसमें निम्नलिखित प्रॉपर्टी होती हैं:
  - `productID: string` — उत्पाद ID।
  - `purchaseToken: string` — उपयोगकर्ता को [खरीदारी का उपयोग करने](#consumepurchase) का अधिकार देने वाला एक टोकन।
  - `developerPayload: string` — अतिरिक्त खरीदारी डेटा।

- सर्वर पर प्रोसेसिंग

  [आरंभीकरण](#install) पैरामीटर के साथ `signed: true`.

  `Promise<{ signature }>` को लौटाता है।

  `signature: string` — [प्लेयर सत्यापन](#purchase-data-example) के लिए स्ट्रिंग, खरीदारी डेटा और हस्ताक्षर।

{% endlist %}

प्लेयर द्वारा सफलतापूर्वक खरीदारी कर लेने के बाद, `Promise` "समाधित" स्थिति पर स्विच हो जाता है। यदि प्लेयर ने खरीदारी नहीं की थी और विंडो बंद कर दी थी, तो `Promise` स्थिति "अस्वीकृत" बन जाती है।


{% note alert "चेतावनी" %}

अस्थिर इंटरनेट कनेक्शन के कारण, ऐसी परिस्थिति बन सकती है जब प्लेयर कोई खरीदारी करता है लेकिन वह गेम में पंजीकृत नहीं होती। इससे बचने के लिए, [असंसाधित खरीदारियों के लिए जाँच करना](#check-purchases) और [खरीदारियों को संसाधित करना और इन-गेम मुद्रा को जमा करना](#consumepurchase) में वर्णित विधियों का उपयोग करके खरीदारियों को संसाधित करें।

इन निर्देशों का पालन करने में विफल रहने पर ऐप की इन-गेम खरीदारियाँ अक्षम हो सकती हैं या सूची से हटाई जा सकती हैं।

{% endnote %}

उपयोगकर्ता प्रमाणीकरण के बिना खरीदारी कर सकता है, लेकिन हम उसे पहले से या खरीदारी के समय [प्रमाणित होने](https://yandex.com/dev/games/doc/hi/sdk/sdk-player.md#open-auth-dialog) की पेशकश करने की सलाह देते हैं।

#### उदाहरण

सामान्य:

```javascript
[payments](*key_payments).purchase({ [id](*key_id): 'gold500' })
    .then(purchase => {
        // खरीदारी सफल हुई!
    }).catch(err => {
        // खरीदारी विफल रही: इस id के साथ कोई भी उत्पाद डेवलपर डैशबोर्ड में मौजूद नहीं है,
        // उपयोगकर्ता ने लॉग इन नहीं किया था, मन बदल लिया था, और भुगतान विंडो बंद कर दी थी,
        // खरीदारी का समय समाप्त हो गया, अपर्याप्त धनराशि थी, या किसी अन्य कारण से।
    });
```

किसी वैकल्पिक `developerPayload` पैरामीटर का उपयोग करना:

```javascript
[payments](*key_payments).purchase({ [id](*key_id): 'gold500', [developerPayload](*key_developerPayload): '{serverId:42}' })
    .then(purchase => {
        // purchase.developerPayload === '{serverId:42}'
    });
```

## खरीदे गए आइटम की सूची प्राप्त करना {#getpurchases}


इस्तेमाल करें `payments.getPurchases()` मेथड को, ताकि:

- पता चले कि खिलाड़ी ने कौन-कौन सी खरीदारी की हैं;

- अप्रसंस्कृत [खरीदारी](#check-purchases) की उपस्थिति की जांच करें;

- स्थायी खरीदारी का समाधान करें।

{% list tabs group=purchases %}

- क्लाइंट साइड प्रसंस्करण

  [इनिशिएशन](#install) डिफ़ॉल्ट पैरामीटर (`signed: false`) के साथ।

  `Promise<Purchase[]>` को लौटाता है।

  `Purchase[]: array` — खिलाड़ी द्वारा किए गए खरीदारी की सूची। प्रत्येक खरीदारी `Purchase` में निम्नलिखित गुण होते हैं:
  - `productID: string` — उत्पाद ID।
  - `purchaseToken: string` — उपयोगकर्ता को [खरीदारी का उपयोग करने](#consumepurchase) का अधिकार देने वाला एक टोकन।
  - `developerPayload: string` — अतिरिक्त खरीदारी डेटा।

  **उदाहरण**

  ```javascript
  var SHOW_ADS = true;
  [payments](*key_payments).getPurchases()
      .then(purchases => {
          if (purchases.some(purchase => purchase.productID === 'disable_ads')) {
            SHOW_ADS = false;
          }
      }).catch(err => {
          // लॉग ऑफ़ उपयोगकर्ताओं के लिए USER_NOT_AUTHORIZED अपवाद देता है।
      });
  ```

- सर्वर पर प्रोसेसिंग

  [आरंभीकरण](#install) पैरामीटर के साथ `signed: true`.

  `Promise<{ signature }>` को लौटाता है।

  `signature: string` — [प्लेयर सत्यापन](#purchase-data-example) के लिए स्ट्रिंग, खरीदारी डेटा और हस्ताक्षर।

  **उदाहरण**

  ```javascript
  [payments](*key_payments).getPurchases()
    .then(purchases => {
        fetch('https://your.game.server?purchase', {
            method: 'POST',
            headers: { 'Content-Type': 'text/plain' },
            body: purchases.signature
        });
    });
  ```

{% endlist %}

&nbsp; {.empty}

## सभी उत्पादों का कैटलॉग प्राप्त करना {#getcatalog}

उपलब्ध खरीदारियों और उनकी लागत की सूची पाने के लिए, `payments.getCatalog()` विधि का उपयोग करें।

विधि `Promise<Product[]>` लौटाती है।

`Product[]: array` — ऑब्जेक्ट, उपयोगकर्ता के लिए उपलब्ध उत्पादों की सूची। इसे डेवलपर डैशबोर्ड के **In-app purchases** टैब में तालिका के आधार पर जनरेट किया जाता है। प्रत्येक `Product` में प्रॉपर्टी होती हैं:
- `id: string` — उत्पाद ID।
- `title: string` — उत्पाद का नाम।
- `description: string` — उत्पाद का वर्णन।
- `imageURI: string` — उत्पाद की छवि का URL।
- `price: string` — उत्पाद की कीमत `<price> <currency code>` प्रारूप में
- `priceValue: string` — उत्पाद की कीमत `<price>` प्रारूप में।
- `priceCurrencyCode: string` — मुद्रा कोड

`Product.getPriceCurrencyImage(size)` — मार्कडाउन प्रोग्रामिंग भाषा में आवश्यक सिक्का का पता प्राप्त करने का विधान।

- `size: string` — ऐच्छिक पैरामीटर। संभावित मान:

    - `small` (डिफ़ॉल्ट) — छोटे आइकन को प्राप्त करना।

    - `medium` — मध्यम आकार के आइकन को प्राप्त करना।

    - `svg` — वेक्टर में आइकन प्राप्त करना।

विधि `string` लौटाती है — आइकन का पता, उदाहरण के लिए `//yastatic.net/s3/games-static/static-data/images/payments/sdk/currency-icon-s@2x.png`.

#### उदाहरण

```javascript
var gameShop = []
[payments](*key_payments).getCatalog()
    .then(products => {
        gameShop = products;
    });
```

## पोर्टल मुद्रा की पहचान {#currency-designation}

गेम में पोर्टल मुद्रा का नाम और आइकन दिखाने के लिए, SDK की सुविधाओं का उपयोग करें:

- `Product.price: string` - मुद्रा कोड के साथ कीमत।
- `Product.priceCurrencyCode: string` — मुद्रा का कोड।
- `Product.getPriceCurrencyImage()` एक `string` लौटाता है — मुद्रा के आइकन का पता।

`Product` ऑब्जेक्ट के बारे में अधिक जानकारी के लिए, [सभी उत्पादों की सूची प्राप्त करने](#getcatalog) अनुभाग देखें।

## खरीदारियों को संसाधित करना और इन-गेम मुद्रा को जमा करना {#consumepurchase}

दो प्रकार की खरीदारियाँ होती हैं: स्थायी (जैसे विज्ञापन को बंद करने के लिए) और उपभोग्य (जैसे गेम में मुद्रा)।

लगातार खरीदारियों को संसाधित करने के लिए, [payments.getPurchases()](#getpurchases) विधि का उपयोग करें।

उपभोग खरीदारियाँ करने के लिए, `payments.consumePurchase()` विधि का उपयोग करें।

#### payments.consumePurchase()

यह विधि "समाधित" स्थिति में `Promise` (यदि सफलता पूर्वक संसाधित हो) या "अस्वीकृत" स्थिति (यदि कोई त्रुटि होती है) दिखाती है।


{% note alert "चेतावनी" %}

`payments.consumePurchase()` विधि का आग्रह करने के बाद, संसाधित खरीदारी को स्थायी रूप से डिलीट कर दिया जाता है। इसलिए, पहले [player.setStats()](https://yandex.com/dev/games/doc/hi/sdk/sdk-player.md#ingame-data) या [player.incrementStats()](https://yandex.com/dev/games/doc/hi/sdk/sdk-player.md#ingame-data) विधि का उपयोग करके प्लेयर का डेटा संपादित करें और फिर खरीदारी संसाधित करें।

{% endnote %}

#### उदाहरण


```javascript
[payments](*key_payments).purchase({ id: 'gold500' }).then(purchase => {
        // खरीदारी सफल हुई!
        // खाते में 500 गोल्ड जोड़ें और खरीदारी का उपयोग करें।
        addGold(500).then(() => payments.consumePurchase(purchase.[purchaseToken](*key_purchaseToken)));
    });

function addGold(value) {
    return player.incrementStats({ gold: value });
    // अधिक जानने के लिए, प्लेयर डेटा देखें।
}
```

`purchaseToken: string` — [payments.purchase()](#payments-purchase) और [payments.getPurchases()](#getpurchases) विधियों द्वारा लौटाया गया टोकन।

## असंसाधित खरीदारियों की जाँच करना {#check-purchases}

यदि किसी इन-गेम खरीदारी के दौरान उपयोगकर्ता का इंटरनेट कनेक्शन खराब हो जाता है या आपका सर्वर ऑफ़लाइन हो जाता है, तो हो सकता है खरीदारी असंसाधित रह जाए। इससे बचने के लिए, विधि [payments.getPurchases()](#getpurchases) का उपयोग करके असंसाधित खरीदारियों के लिए जाँच करें (उदाहरण के लिए, हर बार जब गेम लॉन्च किया जाता है)।

{% note alert "चेतावनी" %}

खरीदारी जोड़ने से पहले, कृपया अनट्रीटेड पेमेंट्स की जांच सेटअप करें।

यह जांच मॉडरेशन की प्रक्रिया को पास करने के लिए [अनिवार्य](../concepts/requirements#1-13-1) है, इसलिए इसे टेस्ट खरीदारी के लिए भी सेटअप करना महत्वपूर्ण है। अगर खेल में खरीदारी जोड़ी जाती है और उन्हें कन्ज्यूमेशन सेटअप करने से पहले परीक्षण किया जाता है, तो टेस्ट के बाद अनट्रीटेड पेमेंट्स बच सकते हैं, जो मॉडरेशन की प्रक्रिया को पास करना असंभव बना देगा।

{% endnote %}

{% list tabs group=purchases %}

- क्लाइंट साइड प्रसंस्करण

  [इनिशिएशन](#install) डिफ़ॉल्ट पैरामीटर (`signed: false`) के साथ।

  **उदाहरण**

  ```javascript
  [payments](*key_payments).getPurchases().then(purchases => purchases.forEach(consumePurchase));

  function consumePurchase(purchase) {
      if (purchase.productID === 'gold500') {
          player.incrementStats({ gold: 500 })
              .then(() => {
                  payments.consumePurchase(purchase.purchaseToken)
              });
      }
  }
  ```

- सर्वर पर प्रोसेसिंग

  [आरंभीकरण](#install) पैरामीटर के साथ `signed: true`.

  **उदाहरण**

  ```javascript
  [payments](*key_payments).getPurchases()
      .then(purchases => {
          fetch('https://your.game.server?purchase', {
              method: 'POST',
              headers: { 'Content-Type': 'text/plain' },
              body: purchases.signature
          });
      });
  ```

{% endlist %}

&nbsp; {.empty}

## धोखाधड़ी रोकथाम {#signature}


गेम में संभावित फर्जीवाड़ा से खुद को सुरक्षित रखने के लिए, सर्वर की ओर से खरीदारी को संसाधित करें:

1. `YaGames.init()` या `ysdk.getPayments()` को `{ signed: true }` पैरामीटर के साथ इनिशियलाइज़ करें।
2. [payments.purchase()](#payments-purchase) और [payments.getPurchases()](#getpurchases) प्रतिक्रियाओं में प्राप्त हस्ताक्षर को अपने सर्वर पर भेजें, और इसे गुप्त कुंजी का उपयोग करके डिकोड करें।
3. अपने सर्वर पर खिलाड़ी को गेम में प्राप्त वस्तुओं को क्रेडिट करें।

```javascript
// सुनिश्चित करें कि खरीदारियाँ { signed: true } पैरामीटर के साथ आरंभ की जाती हैं

[payments](*key_payments).purchase({ id: 'gold500' })
    .then(purchase => {
        // खरीदारी सफल हुई!
        // सर्वर पर 500 गोल्ड जोड़ें...
        serverPurchase(purchase.signature); // हम हस्ताक्षर की जाँच करते हैं और खिलाड़ी को डेटा देते हैं।
    });

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

सर्वर को भेजे गए अनुरोध में `signature` पैरामीटर में खरीदारी डेटा और हस्ताक्षर होते हैं। यह `base64` एन्कोडिंग में दो स्ट्रिंग हैं: `<signature>.<JSON with the purchase data>`।

#### हस्ताक्षर उदाहरण

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

#### ट्रांसमिट किए गए खरीदारी डेटा (`JSON` फ़ॉर्मेट में) का उदाहरण {#purchase-data-example}

ध्यान दें कि `serverPurchase(signature)` प्रकार्य में उपयोग किया जाने वाला `signature` पैरामीटर का डेटा फ़ॉर्मेट [payments.getPurchases()](#getpurchases) विधि में उपयोग किए जाने वाले फ़ॉर्मेट से अलग होता है।

`payments.getPurchases()` विधि में, `signature` पैरामीटर में `data` फ़ील्ड में खरीदारी वस्तुओं की एक श्रृंखला शामिल है। `serverPurchase(signature)` प्रकार्य में, यह खरीदारी ऑब्जेक्ट होता है।

```json
{
  "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": "No ads",
      "description": "Disable ads in the game",
      "price": {
        "code": "YAN",
        "value": "49"
      },
      "imagePrefix": "https://avatars.mds.yandex.net/get-games/1892995/2a0000016d1c1717bd7a0149ccadc86078a1/"
    },
    "developerPayload": "TEST DEVELOPER PAYLOAD"
  }
}
```

#### गुप्त कुंजी का उदाहरण

`t0p$ecret`

हस्ताक्षर सत्यापित करने के लिए उपयोग की जाने वाली गुप्त कुंजी गेम के लिए अनन्य होती है। इसे डेवलपर डैशबोर्ड में खरीदारी करने पर अपने आप जनरेट किया जाता है। इसे आप खरीदारी तालिका के अंतर्गत ढूँढ सकते हैं।

#### सर्वर पर हस्ताक्षर सत्यापन का उदाहरण

{% list tabs %}

* Python 3

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

   usedTokens = {}

   key = 't0p$ecret' # कुंजी को गुप्त रखें।
   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; # डेटाबेस का उपयोग करें।
       print('Double spend check ok!')

       print('Apply purchase:', purchaseData['data']['product'])
       # आप खरीदारियों को यहाँ सुरक्षित रूप से लागू कर सकते हैं।
   ```

* Node.js

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

   const usedTokens = {};

   const key = 't0p$ecret'; // कुंजी को गुप्त रखें।
   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; // डेटाबेस का उपयोग करें।
       console.log('Double spend check ok!');

       console.log('Apply purchase:', purchaseData.data.product);
       // आप खरीदारियों को यहाँ सुरक्षित रूप से लागू कर सकते हैं।
     }
   }
   ```

{% endlist %}

---

<!-- source: hi/_includes/concepts/troubleshooting/id-troubleshooting/support.md -->
{% note info "नोट" %}

टीम सपोर्ट के कर्मचारी यंडेक्स गेम्स प्लेटफॉर्म पर तैयार खेल को डालने में मदद करते हैं। डेवलपमेंट और परीक्षण के संबंध में आवेदनिक प्रश्नों का उत्तर अन्य डेवलपर्स देंगे [Discord चैनल](https://discord.com/invite/wU4p3whr4T)।

{% endnote %}
<!-- endsource: hi/_includes/concepts/troubleshooting/id-troubleshooting/support.md -->

<!-- source: hi/_includes/button-fos.md -->
यदि आप किसी समस्या का सामना कर रहे हैं या Yandex Games SDK के इस्तेमाल के बारे में आपका कोई प्रश्न है, तो कृपया समर्थन से संपर्क करें:


<a href="https://yandex.com/chat/#/user/a4fa5c06-75db-9b38-6eea-b1673785f7d5">
  <span class="button">चैट करने के लिए लिखें</span>
</a>
<!-- endsource: hi/_includes/button-fos.md -->

[*key_id]: `id: string` — [डेवलपर डैशबोर्ड](https://yandex.com/dev/games/doc/hi/console/purchases.md#connect) में उत्पाद ID सेट।

[*key_developerPayload]: `developerPayload: string` — वैकल्पिक पैरामीटर। अतिरिक्त खरीदारी डेटा जिसे आप अपने सर्वर पर भेजना चाहते हैं (`signature` पैरामीटर में स्थानांतरित)।

[*key_sign]: सर्वर को भेजे गए अनुरोध में `signature` पैरामीटर में खरीदारी डेटा और हस्ताक्षर होते हैं। यह `base64` एन्कोडिंग में दो स्ट्रिंग हैं: `<signature>.<JSON with the purchase data>`।

[*key_purchaseToken]: `purchaseToken: string` — [payments.purchase()](#payments-purchase) और [payments.getPurchases()](#getpurchases) विधियों द्वारा लौटाया गया टोकन।

[*key_payments]: यदि आपने `ysdk.getPayments()` का उपयोग करके खरीदारी को इनिशियलाइज़ नहीं किया है, तो सीधे `ysdk.payments` का उपयोग करें।

[*key_explanation]: - [मुद्रीकरण सक्षम करें](https://yandex.com/dev/games/doc/hi/console/purchases.md#connect).
- [डेवलपर का कंसोल](https://games.yandex.com/console) में **In-app purchases** टैब पर जाएं और सुनिश्चित करें कि:
    - कम से कम एक इन-ऐप आइटम के साथ टेबल उपलब्ध है।
    - **Purchases are enabled** लेबल दिखाई दे रहा है।