सर्वर-साइड सत्यापन (एसएसवी) कॉलबैक मान्य करें

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

सर्वर-साइड पर की जाने वाली पुष्टि के कॉलबैक, यूआरएल अनुरोध होते हैं. इनमें Google, बड़े किए गए क्वेरी पैरामीटर शामिल होता है. Google इन्हें किसी बाहरी सिस्टम को भेजता है. Google यह सूचना देता है कि उपयोगकर्ता को इनाम वाले या इनाम वाले इंटरस्टीशियल विज्ञापन से इंटरैक्ट करने के लिए इनाम मिलना चाहिए. इनाम वाले SSV (सर्वर साइड क्लाइंट) कॉलबैक उपयोगकर्ताओं को इनाम देने के लिए, क्लाइंट-साइड कॉलबैक के झूठे नाम से मेल खाने की सुविधा से सुरक्षा की एक और लेयर देता है.

इस गाइड में बताया गया है कि इनाम वाले SSV कॉलबैक का पता कैसे लगाया जा सकता है. इसके लिए, Tink तीसरे पक्ष की क्रिप्टोग्राफ़िक लाइब्रेरी का इस्तेमाल करें, ताकि यह पक्का हो सके कि कॉलबैक में मौजूद क्वेरी पैरामीटर की वैल्यू सही हैं. हालांकि, टिंक का इस्तेमाल इस गाइड के लिए किया जाएगा, लेकिन फिर भी आपके पास ECDSA के साथ काम करने वाली किसी तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करने का विकल्प होगा. आप AdMob यूज़र इंटरफ़ेस (यूआई) में टेस्टिंग टूल की मदद से, अपने सर्वर की जांच भी कर सकते हैं.

Java स्प्रिंग-बूट का इस्तेमाल करके यह पूरी तरह से काम करने वाला उदाहरण देखें.

ज़रूरी शर्तें

टिंक के इनाम वाले AdsVerifier का इस्तेमाल करना

Tink GitHub की डेटा स्टोर करने की जगह में RewardedAdsVerifier हेल्पर क्लास शामिल होती है. यह कोड, एसएसवी कॉलबैक की पुष्टि करने के लिए ज़रूरी कोड को कम करता है. Tink तीसरे पक्ष की क्रिप्टोग्राफ़िक लाइब्रेरी के साथ-साथ इस क्लास का इस्तेमाल करके, नीचे दिए गए कोड के साथ कॉलबैक यूआरएल की पुष्टि की जा सकती है.

RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder()
    .fetchVerifyingPublicKeysWith(
        RewardedAdsVerifier.KEYS_DOWNLOADER_INSTANCE_PROD)
    .build();
String rewardUrl = ...;
verifier.verify(rewardUrl);

अगर verify() का तरीका, अपवाद के बिना काम करता है, तो कॉलबैक के यूआरएल की पुष्टि हो गई है. उपयोगकर्ता को इनाम देना सेक्शन में, उपयोगकर्ताओं को इनाम मिलने के सबसे सही तरीके बताए गए हैं. इनाम वाले SSV कॉलबैक की पुष्टि करने के लिए, इस क्लास में किए गए चरणों का ब्रेकडाउन देखने के लिए, इनाम वाले SSV कॉलबैक के मैन्युअल मैन्युअल ऐक्शन सेक्शन को पढ़ें.

SSV कॉलबैक पैरामीटर

सर्वर-साइड पर की जाने वाली पुष्टि के कॉलबैक में, ऐसे क्वेरी पैरामीटर शामिल होते हैं जो इनाम वाले विज्ञापन के इंटरैक्शन की जानकारी देते हैं. पैरामीटर के नाम, ब्यौरे, और उदाहरण की वैल्यू नीचे दी गई हैं. पैरामीटर, वर्णमाला के क्रम में भेजे जाते हैं.

पैरामीटर का नाम जानकारी उदाहरण के तौर पर दी गई वैल्यू
ad_network इस विज्ञापन को पूरा करने वाले विज्ञापन स्रोत के लिए, विज्ञापन स्रोत पहचानकर्ता. आईडी की वैल्यू से जुड़े विज्ञापन स्रोत के नाम, विज्ञापन स्रोत आइडेंटिफ़ायर सेक्शन में दिए गए हैं. 1953547073528090325
ad_unit AdMob विज्ञापन यूनिट का वह आईडी जिसका इस्तेमाल इनाम वाले विज्ञापन का अनुरोध करने के लिए किया गया था. 2747237135
कस्टम डेटा कस्टम डेटा स्ट्रिंग, जो setCustomData से मिली है.

अगर ऐप्लिकेशन से कोई कस्टम डेटा स्ट्रिंग नहीं मिलती है, तो यह क्वेरी पैरामीटर वैल्यू SSV कॉलबैक में उपलब्ध नहीं होगा.

SAMPLE_CUSTOM_DATA_ दिखाता है
कुंजी का आईडी SSV कॉलबैक की पुष्टि करने के लिए इस्तेमाल की जाने वाली कुंजी. यह वैल्यू AdMob कुंजी के सर्वर से मिली सार्वजनिक कुंजी से मैप होती है. 1234567890
इनाम_की रकम विज्ञापन यूनिट सेटिंग में बताई गई इनाम की रकम. 5
इनाम_आइटम विज्ञापन यूनिट की सेटिंग में दिए गए इनाम आइटम. सिक्के
signature AdMob से जनरेट किए गए एसएसवी कॉलबैक के लिए हस्ताक्षर. MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY
timestamp वह टाइमस्टैंप जब उपयोगकर्ता को Epoch के समय को मिलीसेकंड में इनाम दिया गया था. 1507770365237823
transaction_id AdMob से जनरेट किए गए हर इनाम देने के इवेंट के लिए, यूनीक हेक्स कोड आइडेंटिफ़ायर. 18fa792de1bca816048293fc71035638
user_id उपयोगकर्ता आइडेंटिफ़ायर, जो setUserId ने दिया है.

अगर ऐप्लिकेशन ने कोई उपयोगकर्ता आइडेंटिफ़ायर नहीं दिया है, तो यह क्वेरी पैरामीटर एसएसवी कॉलबैक में मौजूद नहीं होगा.

1234567

विज्ञापन स्रोत के आइडेंटिफ़ायर

विज्ञापन स्रोत के नाम और आईडी

विज्ञापन स्रोत का नाम विज्ञापन स्रोत का आईडी
आरकी (बिडिंग)5240798063227064260
विज्ञापन जनरेशन (बिडिंग)1477265452970951479
AdColony 15586990674969969776
AdColony (बिना SDK वाला) (बोली लगाना)4600416542059544716
AdColony (बोली-प्रक्रिया)6895345910719072481
AdFalcon3528208921554210682
AdMob नेटवर्क5450213213286189855
एडी-रिज़ल्ट10593873382626181482
एएमओडी17253994435944008978
ऐप्लोविन1063618907739174004
एपलोवीन (बिडिंग)1328079684332308356
चार्टबूस्ट2873236629771172317
Chocolate Platform (बोली-प्रक्रिया)6432849193975106527
क्रॉस चैनल (एमडॉटएम)9372067028804390441
कस्टम इवेंट18351550913290782395
डीटी एक्सचेंज
21 सितंबर, 2022 से पहले, इस नेटवर्क का नाम "फ़ाइबर" था.
4839637394546996422
फ़्लैक्ट (बोली लगाना)8419777862490735710
आंधी3376427960656545613
i-mobile5208827440166355534
डिजिटल प्लैटफ़ॉर्म (बिडिंग) को बेहतर बनाएं159382223051638006
इंडेक्स एक्सचेंज (बिडिंग)4100650709078789802
InMobi7681903010231960328
InMobi (बिडिंग)6325663098072678541
आयरनसोर्स6925240245545091930
Leadbolt2899150749497968595
LG U+AD18298738678491729107
Maio7505118203095108657
maio (बिडिंग)1343336733822567166
Media.net (बिडिंग)2127936450554446159
मीडिएशन वाले हाउस विज्ञापन6060308706800320801
Meta Audience Network
6 जून, 2022 से पहले, इस नेटवर्क को "Facebook ऑडियंस नेटवर्क" कहा जाता था.
10568273599589928883
Meta Audience Network (बिडिंग)
6 जून, 2022 से पहले, इस नेटवर्क को "Facebook ऑडियंस नेटवर्क (बिडिंग)" कहा जाता था.
11198165126854996598
MobFox8079529624516381459
MoPub (अब इस्तेमाल में नहीं है)10872986198578383917
मेरा टारगेट8450873672465271579
Nend9383070032774777750
ONE by AOL (मिलेनियम मीडिया)6101072188699264581
ONE by AOL (Nexage)3224789793037044399
OpenX (बिडिंग)4918705482605678398
Pangle (बिडिंग)3525379893916449117
PubMatic (बिडिंग)3841544486172445473
आरक्षण अभियान7068401028668408324
RhythmOne (बिडिंग)2831998725945605450
रूबिकन (बिडिंग)3993193775968767067
SK ग्रह734341340207269415
शेयर-थ्रू (बिडिंग)5247944089976324188
Smaato (बोली लगाना)3362360112145450544
Equativ (बिडिंग)*

* 12 जनवरी, 2023 से पहले, इस नेटवर्क का नाम "स्मार्ट Adserver" था.

5970199210771591442
Sonobi (बिडिंग)3270984106996027150
Tapjoy7295217276740746030
टैपजॉय (बिडिंग)4692500501762622178
टेनेंट जीडीटी7007906637038700218
TripleLift (बिडिंग)8332676245392738510
Unity विज्ञापन4970775877303683148
UnrulyX (बिडिंग)2831998725945605450
Verizon Media7360851262951344112
वीपॉन1940957084538325905
Vungle1953547073528090325
Vungle (बोली-प्रक्रिया)4692500501762622185
Yieldmo (बोली लगाना)4193081836471107579
YieldOne (बिडिंग)3154533971590234104
ज़क्स5506531810221735863

उपयोगकर्ता को इनाम देना

यह ज़रूरी है कि उपयोगकर्ता को इनाम देने के समय का आकलन करते समय, उपयोगकर्ता के अनुभव और इनाम की पुष्टि की प्रक्रिया का संतुलन बनाया जाए. बाहरी साइड पर पहुंचने से पहले ही, सर्वर साइड कॉलबैक में देरी हो सकती है. इसलिए, सबसे अच्छा तरीका यह है कि क्लाइंट-साइड कॉलबैक का इस्तेमाल करके, उपयोगकर्ता को तुरंत इनाम दिया जाए. साथ ही, सर्वर साइड कॉलबैक मिलने पर सभी इनामों की पुष्टि करना भी एक अच्छा तरीका है. इससे, आपको उपयोगकर्ताओं को अच्छा अनुभव देने के साथ-साथ, इनाम की वैधता भी पक्का होती है.

हालांकि, जिन ऐप्लिकेशन के लिए इनाम की वैधता ज़रूरी है (उदाहरण के लिए, इनाम से आपके ऐप्लिकेशन की इन-गेम इकॉनमी पर असर पड़ता है) और इनाम मिलने में देरी स्वीकार की जा सकती है उनमें पुष्टि किए गए सर्वर साइड कॉलबैक का इंतज़ार करना सबसे बेहतर तरीका हो सकता है.

कस्टम डेटा

जिन ऐप्लिकेशन को सर्वर-साइड पर की जाने वाली पुष्टि के कॉलबैक में अतिरिक्त डेटा की ज़रूरत होती है उन्हें इनाम वाले विज्ञापनों की कस्टम डेटा सुविधा का इस्तेमाल करना चाहिए. इनाम वाले विज्ञापन के ऑब्जेक्ट पर सेट कोई भी स्ट्रिंग वैल्यू, SSV कॉलबैक के custom_data क्वेरी पैरामीटर में पास की जाती है. अगर कोई कस्टम डेटा वैल्यू सेट नहीं किया गया है, तो custom_data क्वेरी पैरामीटर की वैल्यू, SSV कॉलबैक में नहीं दिखेगी.

कोड के इस नमूने में, इनाम वाले विज्ञापन के लोड होने के बाद, एसएसवी के विकल्पों को सेट करने का तरीका बताया गया है.

Java

RewardedAd.load(MainActivity.this, "ca-app-pub-3940256099942544/5354046379",
    new AdRequest.Builder().build(),  new RewardedAdLoadCallback() {
  @Override
  public void onAdLoaded(RewardedAd ad) {
    Log.d(TAG, "Ad was loaded.");
    rewardedAd = ad;
    ServerSideVerificationOptions options = new ServerSideVerificationOptions
        .Builder()
        .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
        .build();
    rewardedAd.setServerSideVerificationOptions(options);
  }
  @Override
  public void onAdFailedToLoad(LoadAdError loadAdError) {
    Log.d(TAG, loadAdError.toString());
    rewardedAd = null;
  }
});

Kotlin

RewardedAd.load(this, "ca-app-pub-3940256099942544/5354046379",
    AdRequest.Builder().build(), object : RewardedAdLoadCallback() {
  override fun onAdLoaded(ad: RewardedAd) {
    Log.d(TAG, "Ad was loaded.")
    rewardedInterstitialAd = ad
    val options = ServerSideVerificationOptions.Builder()
        .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
        .build()
    rewardedAd.setServerSideVerificationOptions(options)
  }

  override fun onAdFailedToLoad(adError: LoadAdError) {
    Log.d(TAG, adError?.toString())
    rewardedAd = null
  }
})

अगर आप कस्टम इनाम स्ट्रिंग सेट करना चाहते हैं, तो आपको विज्ञापन दिखाने से पहले ऐसा करना होगा.

इनाम वाले SSV की मैन्युअल पुष्टि

इनाम वाले एसएसवी की पुष्टि करने के लिए, RewardedAdsVerifier क्लास यह तरीका अपनाती है. हालांकि, शामिल किए गए कोड स्निपेट Java में होते हैं और Tink तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करते हैं. आप इन तरीकों को ECDSA के साथ काम करने वाली तीसरे पक्ष की किसी भी लाइब्रेरी का इस्तेमाल करके, अपनी पसंद की भाषा में लागू कर सकते हैं.

सार्वजनिक कुंजियां पाएं

इनाम वाले एसएसवी कॉलबैक की पुष्टि करने के लिए, आपको AdMob से मिली सार्वजनिक कुंजी की ज़रूरत होगी.

इनाम वाले SSV कॉलबैक की पुष्टि करने के लिए इस्तेमाल की जाने वाली सार्वजनिक कुंजियों की सूची, AdMob कुंजी सर्वर से फ़ेच की जा सकती है. सार्वजनिक कुंजियों की सूची JSON फ़ॉर्मैट में दी जाती है. इसका फ़ॉर्मैट नीचे दिए गए फ़ॉर्मैट जैसा होता है:

{
 "keys": [
    {
      keyId: 1916455855,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...YTPcw==\n-----END PUBLIC KEY-----"
      base64: "MFkwEwYHKoZIzj0CAQYI...ltS4nzc9yjmhgVQOlmSS6unqvN9t8sqajRTPcw=="
    },
    {
      keyId: 3901585526,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...aDUsw==\n-----END PUBLIC KEY-----"
      base64: "MFYwEAYHKoZIzj0CAQYF...4akdWbWDCUrMMGIV27/3/e7UuKSEonjGvaDUsw=="
    },
  ],
}

सार्वजनिक कुंजियां फिर से पाने के लिए, AdMob कुंजी सर्वर से कनेक्ट करके कुंजियां डाउनलोड करें. यह कोड इस टास्क को पूरा करता है और कुंजियों का JSON प्रज़ेंटेशन, data वैरिएबल में सेव करता है.

String url = ...;
NetHttpTransport httpTransport = new NetHttpTransport.Builder().build();
HttpRequest httpRequest =
    httpTransport.createRequestFactory().buildGetRequest(new GenericUrl(url));
HttpResponse httpResponse = httpRequest.execute();
if (httpResponse.getStatusCode() != HttpStatusCodes.STATUS_CODE_OK) {
  throw new IOException("Unexpected status code = " + httpResponse.getStatusCode());
}
String data;
InputStream contentStream = httpResponse.getContent();
try {
  InputStreamReader reader = new InputStreamReader(contentStream, UTF_8);
  data = readerToString(reader);
} finally {
  contentStream.close();
}

ध्यान रखें कि सार्वजनिक कुंजियों को समय-समय पर घुमाया जाता है. आगे होने वाले किसी रोटेशन के बारे में आपको एक ईमेल मिलेगा. अगर आप सार्वजनिक कुंजियों को कैश मेमोरी में सेव कर रहे हैं, तो आपको यह ईमेल मिलने पर कुंजियों को अपडेट करना चाहिए.

सार्वजनिक कुंजियां फ़ेच हो जाने के बाद, उन्हें पार्स किया जाना चाहिए. नीचे दिए गए parsePublicKeysJson तरीके में, JSON स्ट्रिंग ली जाती है, जैसे कि ऊपर दिया गया उदाहरण इनपुट के तौर पर इस्तेमाल किया जाता है. साथ ही, key_id वैल्यू से सार्वजनिक कुंजियों के लिए मैपिंग की जाती है. इन्हें Tink लाइब्रेरी से ECPublicKey ऑब्जेक्ट के तौर पर इकट्ठा किया जाता है.

private static Map<Integer, ECPublicKey> parsePublicKeysJson(String publicKeysJson)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = new HashMap<>();
  try {
    JSONArray keys = new JSONObject(publicKeysJson).getJSONArray("keys");
    for (int i = 0; i < keys.length(); i++) {
      JSONObject key = keys.getJSONObject(i);
      publicKeys.put(
          key.getInt("keyId"),
          EllipticCurves.getEcPublicKey(Base64.decode(key.getString("base64"))));
    }
  } catch (JSONException e) {
    throw new GeneralSecurityException("failed to extract trusted signing public keys", e);
  }
  if (publicKeys.isEmpty()) {
    throw new GeneralSecurityException("No trusted keys are available.");
  }
  return publicKeys;
}

पुष्टि के लिए कॉन्टेंट पाना

इनाम वाले SSV कॉलबैक के आखिरी दो क्वेरी पैरामीटर, हमेशा signature और key_id, इसी क्रम में होते हैं. बाकी क्वेरी पैरामीटर की मदद से, उस कॉन्टेंट की जानकारी दी जाती है जिसकी पुष्टि की जानी है. मान लें कि आपने AdMob को https://www.myserver.com/mypath पर इनाम के कॉलबैक भेजने के लिए कॉन्फ़िगर किया है. नीचे दिए गए स्निपेट में, इनाम वाले एसएसवी कॉलबैक का एक उदाहरण दिया गया है. इस कॉन्टेंट को हाइलाइट करना है.

https://www.myserver.com/path?ad_network=54...55&ad_unit=12345678&reward_amount=10&reward_item=coins
&timestamp=150777823&transaction_id=12...DEF&user_id=1234567&signature=ME...Z1c&key_id=1268887

नीचे दिया गया कोड बताता है कि कॉलबैक के यूआरएल से UTF-8 बाइट श्रेणी के तौर पर कॉन्टेंट की पुष्टि कैसे करें.

public static final String SIGNATURE_PARAM_NAME = "signature=";
...
URI uri;
try {
  uri = new URI(rewardUrl);
} catch (URISyntaxException ex) {
  throw new GeneralSecurityException(ex);
}
String queryString = uri.getQuery();
int i = queryString.indexOf(SIGNATURE_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a signature query parameter");
}
byte[] queryParamContentData =
    queryString
        .substring(0, i - 1)
        // i - 1 instead of i because of & in the query string
        .getBytes(Charset.forName("UTF-8"));

कॉलबैक यूआरएल से हस्ताक्षर और कुंजी_आईडी पाएं

पिछले चरण की queryString वैल्यू का इस्तेमाल करके, नीचे दिए गए कॉलबैक यूआरएल से signature और key_id क्वेरी पैरामीटर को पार्स करें:

public static final String KEY_ID_PARAM_NAME = "key_id=";
...
String sigAndKeyId = queryString.substring(i);
i = sigAndKeyId.indexOf(KEY_ID_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a key_id query parameter");
}
String sig =
    sigAndKeyId.substring(
        SIGNATURE_PARAM_NAME.length(), i - 1 /* i - 1 instead of i because of & */);
int keyId = Integer.valueOf(sigAndKeyId.substring(i + KEY_ID_PARAM_NAME.length()));

पुष्टि करना

आखिरी चरण में, कॉलबैक यूआरएल के कॉन्टेंट की पुष्टि सार्वजनिक कुंजी से करें. parsePublicKeysJson तरीके से रिटर्न किया गया मैप लें और उस मैपिंग से सार्वजनिक कुंजी पाने के लिए कॉलबैक यूआरएल से key_id पैरामीटर का इस्तेमाल करें. फिर उस सार्वजनिक कुंजी से हस्ताक्षर की पुष्टि करें. इन चरणों को verify तरीके में नीचे दिखाया गया है.

private void verify(final byte[] dataToVerify, int keyId, final byte[] signature)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = parsePublicKeysJson();
  if (publicKeys.containsKey(keyId)) {
    foundKeyId = true;
    ECPublicKey publicKey = publicKeys.get(keyId);
    EcdsaVerifyJce verifier = new EcdsaVerifyJce(publicKey, HashType.SHA256, EcdsaEncoding.DER);
    verifier.verify(signature, dataToVerify);
  } else {
    throw new GeneralSecurityException("cannot find verifying key with key ID: " + keyId);
  }
}

अगर यह तरीका, अपवाद का अनुरोध किए बिना पूरा हो जाता है, तो कॉलबैक के यूआरएल की पुष्टि हो जाती है.

अक्सर पूछे जाने वाले सवाल

क्या मेरे पास AdMob कुंजी सर्वर से मिली सार्वजनिक कुंजी को कैश मेमोरी में सेव करने का विकल्प है?
हमारा सुझाव है कि आप SSV कॉलबैक की पुष्टि करने के लिए ज़रूरी कार्रवाई को कम करने के लिए, AdMob कुंजी के सर्वर की सार्वजनिक कुंजी को कैश मेमोरी में सेव करें. हालांकि, ध्यान रखें कि सार्वजनिक कुंजियों को लगातार घुमाया जाता है और उन्हें 24 घंटे से ज़्यादा समय के लिए कैश मेमोरी में नहीं रखा जाना चाहिए.
AdMob के मुख्य सर्वर से उपलब्ध कराई गई सार्वजनिक कुंजियों को कितनी बार घुमाया गया?
AdMob कुंजी सर्वर की ओर से दी जाने वाली सार्वजनिक कुंजियों को वैरिएबल शेड्यूल में बदला जाता है. यह पक्का करने के लिए कि एसएसवी कॉलबैक की पुष्टि, उम्मीद के मुताबिक काम करती रहे, सार्वजनिक कुंजियों को 24 घंटे से ज़्यादा समय के लिए कैश मेमोरी में नहीं रखा जाना चाहिए.
अगर मेरे सर्वर तक पहुंचा न जा सके, तो क्या होता है?
Google, SSV कॉलबैक के लिए HTTP 200 OK के सक्सेस स्टेटस रिस्पॉन्स कोड की उम्मीद करता है. अगर आपके सर्वर तक पहुंचा नहीं जा सकता या वह रिस्पॉन्स नहीं देता है, तो Google एक सेकंड के अंतराल में, SSV कॉलबैक को पांच बार भेजने की फिर से कोशिश करेगा.
मैं कैसे पुष्टि करूं कि SSV कॉलबैक Google से आ रहे हैं?
रिवर्स डीएनएस लुकअप का इस्तेमाल करके पुष्टि करें कि SSV कॉलबैक, Google से ही मिले हैं.