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

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

चेतावनी

पर्चेज़ का परीक्षण केवल उनके कंस्यूम्प्शन को जोड़ने के बाद ही किया जा सकता है। अन्यथा, अप्रोसेस्ड पेमेंट्स उत्पन्न हो सकती हैं, जो मोडरेशन की प्रक्रिया को असंभव बना सकती हैं।

शर्तें

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

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

आरंभ करना

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

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

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

प्रतिबंध

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

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

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

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

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

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

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

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

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

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

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

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

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

 

खरीदारी प्रक्रिया को सक्रिय करना

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

  • id: string — डेवलपर डैशबोर्ड में उत्पाद ID सेट।
  • developerPayload: string — वैकल्पिक पैरामीटर। अतिरिक्त खरीदारी डेटा जिसे आप अपने सर्वर पर भेजना चाहते हैं (signature पैरामीटर में स्थानांतरित)।

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

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

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

Purchase: object — खरीदारी के बारे में ऑब्जेक्ट, जानकारी। इसमें निम्नलिखित प्रॉपर्टी होती हैं:

  • productID: string — उत्पाद ID।
  • purchaseToken: string — उपयोगकर्ता को खरीदारी का उपयोग करने का अधिकार देने वाला एक टोकन।
  • developerPayload: string — अतिरिक्त खरीदारी डेटा।

आरंभीकरण पैरामीटर के साथ signed: true.

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

signature: string — प्लेयर सत्यापन के लिए स्ट्रिंग, खरीदारी डेटा और हस्ताक्षर।

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

चेतावनी

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

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

उपयोगकर्ता प्रमाणीकरण के बिना खरीदारी कर सकता है, लेकिन हम उसे पहले से या खरीदारी के समय प्रमाणित होने की पेशकश करने की सलाह देते हैं।

उदाहरण

सामान्य:

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

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

payments.purchase({ id: 'gold500', developerPayload: '{serverId:42}' })
    .then(purchase => {
        // purchase.developerPayload === '{serverId:42}'
    });

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

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

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

  • अप्रसंस्कृत खरीदारी की उपस्थिति की जांच करें;

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

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

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

Purchase[]: array — खिलाड़ी द्वारा किए गए खरीदारी की सूची। प्रत्येक खरीदारी Purchase में निम्नलिखित गुण होते हैं:

  • productID: string — उत्पाद ID।
  • purchaseToken: string — उपयोगकर्ता को खरीदारी का उपयोग करने का अधिकार देने वाला एक टोकन।
  • developerPayload: string — अतिरिक्त खरीदारी डेटा।

उदाहरण

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

आरंभीकरण पैरामीटर के साथ signed: true.

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

signature: string — प्लेयर सत्यापन के लिए स्ट्रिंग, खरीदारी डेटा और हस्ताक्षर।

उदाहरण

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

 

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

उपलब्ध खरीदारियों और उनकी लागत की सूची पाने के लिए, 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.

उदाहरण

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

पोर्टल मुद्रा की पहचान

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

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

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

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

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

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

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

payments.consumePurchase()

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

चेतावनी

payments.consumePurchase() विधि का आग्रह करने के बाद, संसाधित खरीदारी को स्थायी रूप से डिलीट कर दिया जाता है। इसलिए, पहले player.setStats() या player.incrementStats() विधि का उपयोग करके प्लेयर का डेटा संपादित करें और फिर खरीदारी संसाधित करें।

उदाहरण

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

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

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

असंसाधित खरीदारियों की जाँच करना

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

चेतावनी

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

यह जांच मॉडरेशन की प्रक्रिया को पास करने के लिए अनिवार्य है, इसलिए इसे टेस्ट खरीदारी के लिए भी सेटअप करना महत्वपूर्ण है। अगर खेल में खरीदारी जोड़ी जाती है और उन्हें कन्ज्यूमेशन सेटअप करने से पहले परीक्षण किया जाता है, तो टेस्ट के बाद अनट्रीटेड पेमेंट्स बच सकते हैं, जो मॉडरेशन की प्रक्रिया को पास करना असंभव बना देगा।

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

उदाहरण

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

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

आरंभीकरण पैरामीटर के साथ signed: true.

उदाहरण

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

 

धोखाधड़ी रोकथाम

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

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

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>

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

hQ8adIRJWD29Nep+0P36Z6edI5uzj6F3tddz6Dqgclk=.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZEF0IjoxNTcxMjMzMzcxLCJyZXF1ZXN0UGF5bG9hZCI6InF3ZSIsImRhdGEiOnsidG9rZW4iOiJkODVhZTBiMS05MTY2LTRmYmItYmIzOC02ZDJhNGNhNDQxNmQiLCJzdGF0dXMiOiJ3YWl0aW5nIiwiZXJyb3JDb2RlIjoiIiwiZXJyb3JEZXNjcmlwdGlvbiI6IiIsInVybCI6Imh0dHBzOi8veWFuZGV4LnJ1L2dhbWVzL3Nkay9wYXltZW50cy90cnVzdC1mYWtlLmh0bWwiLCJwcm9kdWN0Ijp7ImlkIjoibm9hZHMiLCJ0aXRsZSI6ItCR0LXQtyDRgNC10LrQu9Cw0LzRiyIsImRlc2NyaXB0aW9uIjoi0J7RgtC60LvRjtGH0LjRgtGMINGA0LXQutC70LDQvNGDINCyINC40LPRgNC1IiwicHJpY2UiOnsiY29kZSI6IlJVUiIsInZhbHVlIjoiNDkifSwiaW1hZ2VQcmVmaXgiOiJodHRwczovL2F2YXRhcnMubWRzLnlhbmRleC5uZXQvZ2V0LWdhbWVzLzE4OTI5OTUvMmEwMDAwMDE2ZDFjMTcxN2JkN2EwMTQ5Y2NhZGM4NjA3OGExLyJ9fX0=

ट्रांसमिट किए गए खरीदारी डेटा (JSONफ़ॉर्मेट में) का उदाहरण

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

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

{
  "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

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

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

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'])
    # आप खरीदारियों को यहाँ सुरक्षित रूप से लागू कर सकते हैं।
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);
    // आप खरीदारियों को यहाँ सुरक्षित रूप से लागू कर सकते हैं।
  }
}

नोट

टीम सपोर्ट के कर्मचारी यंडेक्स गेम्स प्लेटफॉर्म पर तैयार खेल को डालने में मदद करते हैं। डेवलपमेंट और परीक्षण के संबंध में आवेदनिक प्रश्नों का उत्तर अन्य डेवलपर्स देंगे Discord चैनल

यदि आप किसी समस्या का सामना कर रहे हैं या Yandex Games SDK के इस्तेमाल के बारे में आपका कोई प्रश्न है, तो कृपया समर्थन से संपर्क करें:

चैट करने के लिए लिखें

id: string — डेवलपर डैशबोर्ड में उत्पाद ID सेट।

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

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

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

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