सर्वर साइड वेरिफ़िकेशन कॉलबैक, क्वेरी पैरामीटर वाले यूआरएल अनुरोध होते हैं जिसे Google विस्तृत करता है, जिसे Google किसी बाहरी सिस्टम को भेजता है उसे यह सूचना देनी चाहिए कि उपयोगकर्ता को इनाम वाले विज्ञापन से इंटरैक्ट करने पर इनाम मिलना चाहिए या इनाम वाला इंटरस्टीशियल विज्ञापन. इनाम वाले एसएसवी (सर्वर-साइड वेरिफ़िकेशन) कॉलबैक इससे क्लाइंट-साइड कॉलबैक के झूठे नाम से मेल भेजे जाने से बचा जा सकता है लोगों को इनाम देने के लिए डिज़ाइन किया गया है.
इस गाइड में, इनाम वाले SSV कॉलबैक की पुष्टि करने का तरीका बताया गया है Tink Java ऐप्लिकेशन तीसरे पक्ष क्रिप्टोग्राफ़िक लाइब्रेरी की मदद से यह पक्का किया जाता है कि कॉलबैक में क्वेरी पैरामीटर वैध मानों का. हालांकि, इस गाइड के लिए Tink इस्तेमाल किया जाता है, लेकिन आपके पास तीसरे पक्ष की ऐसी लाइब्रेरी का इस्तेमाल करना होगा जिसमें ECDSA. टेस्टिंग टेस्ट में, आपके सर्वर को टेस्ट किया जा सकता है. टूल की मदद से सबमिट किया जा सकता है.
पूरी तरह से काम करने वाले टूल के बारे में जानें उदाहरण के लिए पर जाकर देखें.
ज़रूरी शर्तें
इनाम वाले विज्ञापन को अपने मोबाइल ऐप्लिकेशन, जिसमें अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है Google मोबाइल विज्ञापन Unity प्लगिन का v3.12.0 या इसके बाद का वर्शन.
इनाम वाला सर्वर-साइड चालू करें पुष्टि करने की प्रोसेस को भी सेटअप किया है.
Tink Java ऐप्लिकेशन लाइब्रेरी से RewardedAdsVerifier का इस्तेमाल करें
Tink Java ऐप्लिकेशन GitHub रिपॉज़िटरी
इसमें शामिल है
RewardedAdsVerifier
हेल्पर क्लास का इस्तेमाल करके, इनाम वाले SSV कॉलबैक की पुष्टि करने के लिए ज़रूरी कोड को कम करें.
इस क्लास का इस्तेमाल करने पर, आपको इस कोड के साथ कॉलबैक यूआरएल की पुष्टि करने में मदद मिलती है.
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 |
key_id | एसएसवी कॉलबैक की पुष्टि करने के लिए इस्तेमाल की जाने वाली कुंजी. यह वैल्यू एक सार्वजनिक पासकोड पर मैप होती है यह जानकारी, AdMob के मुख्य सर्वर से मिलती है. | 1234567890 |
reward_amount | विज्ञापन यूनिट की सेटिंग में बताई गई इनाम की रकम. | 5 |
reward_item | विज्ञापन यूनिट की सेटिंग में बताया गया इनाम आइटम. | कॉइन |
signature | एसएसवी कॉलबैक के लिए हस्ताक्षर, AdMob से जनरेट किया गया. | MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY |
timestamp | उस समय का टाइमस्टैंप जब उपयोगकर्ता को Epoch समय के तौर पर इनाम मिला था. यह मि॰से॰ में दिखेगा. | 1507770365237823 |
transaction_id | AdMob से जनरेट किए गए इनाम के हर इवेंट के लिए, हेक्स कोड में बदला गया यूनीक आइडेंटिफ़ायर. | 18fa792de1bca816048293fc71035638 |
user_id | इन्होंने जो उपयोगकर्ता आइडेंटिफ़ायर दिया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
SetUserId .
अगर ऐप्लिकेशन ने कोई उपयोगकर्ता आइडेंटिफ़ायर नहीं दिया है, तो यह क्वेरी पैरामीटर SSV कॉलबैक में मौजूद हों. |
1234567 |
विज्ञापन स्रोत के आइडेंटिफ़ायर
विज्ञापन सोर्स के नाम और आईडी
广告来源名称 | 广告来源 ID |
---|---|
Aarki(出价) | 5240798063227064260 |
Ad Generation(出价) | 1477265452970951479 |
AdColony | 15586990674969969776 |
AdColony(非 SDK)(出价) | 4600416542059544716 |
AdColony(出价) | 6895345910719072481 |
AdFalcon | 3528208921554210682 |
AdMob 广告联盟 | 5450213213286189855 |
AdMob 广告联盟广告瀑布流 | 1215381445328257950 |
ADResult | 10593873382626181482 |
AMoAd | 17253994435944008978 |
AppLovin | 1063618907739174004 |
AppLovin(出价) | 1328079684332308356 |
Chartboost | 2873236629771172317 |
Chocolate Platform(出价) | 6432849193975106527 |
跨渠道 (MdotM) | 9372067028804390441 |
自定义事件 | 18351550913290782395 |
DT Exchange* * 在 2022 年 9 月 21 日之前,该广告联盟称为“Fyber Marketplace”。 | 2179455223494392917 |
EMX(出价) | 8497809869790333482 |
Fluct(出价) | 8419777862490735710 |
小风 | 3376427960656545613 |
Fyber* * 此广告来源用于生成历史报告。 | 4839637394546996422 |
i-mobile | 5208827440166355534 |
优化数字化(出价) | 159382223051638006 |
Index Exchange(出价) | 4100650709078789802 |
InMobi | 7681903010231960328 |
InMobi(出价) | 6325663098072678541 |
InMobi Exchange(出价) | 5264320421916134407 |
IronSource | 6925240245545091930 |
ironSource Ads(出价) | 1643326773739866623 |
Leadbolt | 2899150749497968595 |
LG U+AD | 18298738678491729107 |
LINE 广告联盟 | 3025503711505004547 |
maio | 7505118203095108657 |
maio(出价) | 1343336733822567166 |
Media.net(出价) | 2127936450554446159 |
参与中介的自家广告 | 6060308706800320801 |
Meta Audience Network* * 在 2022 年 6 月 6 日之前,该广告联盟称为“Facebook Audience Network”。 | 10568273599589928883 |
Meta Audience Network(出价)* * 在 2022 年 6 月 6 日之前,该广告联盟称为“Facebook Audience Network(出价)”。 | 11198165126854996598 |
Mintegral | 1357746574408896200 |
Mintegral(出价) | 6250601289653372374 |
MobFox | 8079529624516381459 |
MobFox(出价) | 3086513548163922365 |
MoPub(已弃用) | 10872986198578383917 |
myTarget | 8450873672465271579 |
Nend | 9383070032774777750 |
Nexxen(出价)* * 在 2024 年 5 月 1 日之前,该广告联盟称为“UnrulyX”。 | 2831998725945605450 |
ONE by AOL (Millennial Media) | 6101072188699264581 |
ONE by AOL (Nexage) | 3224789793037044399 |
OneTag Exchange(出价) | 4873891452523427499 |
OpenX(出价) | 4918705482605678398 |
邦格尔 | 4069896914521993236 |
Pangle(出价) | 3525379893916449117 |
PubMatic(出价) | 3841544486172445473 |
预订型广告系列 | 7068401028668408324 |
RhythmOne(出价) | 2831998725945605450 |
Rubicon(出价) | 3993193775968767067 |
SK 星球 | 734341340207269415 |
Sharethrough(出价) | 5247944089976324188 |
Smaato(出价) | 3362360112145450544 |
Equativ(出价)* * 在 2023 年 1 月 12 日之前,该广告联盟称为“Smart Adserver”。 | 5970199210771591442 |
Sonobi(出价) | 3270984106996027150 |
Tapjoy | 7295217276740746030 |
Tapjoy(出价) | 4692500501762622178 |
Tencent GDT | 7007906637038700218 |
TripleLift(出价) | 8332676245392738510 |
Unity 广告 | 4970775877303683148 |
Unity Ads(出价) | 7069338991535737586 |
Verizon Media | 7360851262951344112 |
Verve Group(出价) | 5013176581647059185 |
Vpon | 1940957084538325905 |
Liftoff Monetize* * 在 2023 年 1 月 30 日之前,该广告联盟称为“Vungle”。 | 1953547073528090325 |
Liftoff Monetize(出价)* * 在 2023 年 1 月 30 日之前,该广告联盟称为“Vungle(出价)”。 | 4692500501762622185 |
Yieldmo(出价) | 4193081836471107579 |
YieldOne(出价) | 3154533971590234104 |
Zucks | 5506531810221735863 |
उपयोगकर्ता को इनाम देना
तय करते समय, उपयोगकर्ता के अनुभव और इनाम की पुष्टि के बीच संतुलन बनाना ज़रूरी है उपयोगकर्ता को इनाम कब दें. सर्वर-साइड कॉलबैक में देरी हो सकती है बाहरी सिस्टम तक पहुंच सकता है. इसलिए, हमारा सुझाव है कि आप Google पर परफ़ॉर्म करते समय, उपयोगकर्ता को तुरंत इनाम देने के लिए क्लाइंट-साइड कॉलबैक सर्वर-साइड कॉलबैक मिलने पर, सभी इनामों की पुष्टि करना. यह यह तरीका अपनाकर, उपयोगकर्ता के अनुभव को बेहतर बनाया जा सकता है. साथ ही, यह भी पक्का किया जा सकता है कि इनाम.
हालांकि, जिन ऐप्लिकेशन में इनाम की वैधता ज़रूरी होती है (उदाहरण के लिए, इनाम से आपके ऐप्लिकेशन की इन-गेम इकॉनमी पर असर पड़ता है) और इनाम देने में देरी मान्य है, तो पुष्टि किए गए सर्वर-साइड कॉलबैक का इंतज़ार करना सबसे सही रहेगा अप्रोच का इस्तेमाल करें.
कस्टम डेटा
ऐसे ऐप्लिकेशन जिन्हें सर्वर-साइड पर की गई पुष्टि के कॉलबैक में अतिरिक्त डेटा की ज़रूरत होती है, उन्हें इन चीज़ों का इस्तेमाल करना चाहिए
इनाम वाले विज्ञापनों की कस्टम डेटा सुविधा. इनाम वाले विज्ञापन पर सेट की गई स्ट्रिंग की कोई भी वैल्यू
ऑब्जेक्ट को SSV कॉलबैक के custom_data
क्वेरी पैरामीटर को पास किया जाता है. अगर नहीं
कस्टम डेटा मान सेट है, custom_data
क्वेरी पैरामीटर मान
SSV कॉलबैक में मौजूद होता है.
नीचे दिया गया कोड सैंपल, SSV विकल्पों को सेट करने का तरीका बताता है. इनाम वाला विज्ञापन लोड हो गया.
private void LoadRewardedAd(string adUnitId)
{
// Send the request to load the ad.
AdRequest adRequest = new AdRequest();
RewardedAd.Load(adUnitId, adRequest, (RewardedAd rewardedAd, LoadAdError error) =>
{
// If the operation failed with a reason.
if (error != null)
{
Debug.LogError("Rewarded ad failed to load an ad with error : " + error);
return;
}
var options = new ServerSideVerificationOptions
.Builder()
.SetCustomData("SAMPLE_CUSTOM_DATA_STRING")
.Build()
rewardedAd.SetServerSideVerificationOptions(options);
});
}
अगर आपको कस्टम इनाम स्ट्रिंग सेट करनी है, तो क्लिक करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैइनाम वाले एसएसवी की मैन्युअल तरीके से पुष्टि करना
इनाम की पुष्टि करने के लिए, RewardedAdsVerifier
क्लास ने यह तरीका अपनाया
एसएसवी के बारे में यहां बताया गया है. हालांकि, शामिल किए गए कोड स्निपेट, Java और
Tink इस्तेमाल करने के लिए तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करें. इन चरणों को
अपनी पसंद की भाषा चुनें. इसके लिए, तीसरे पक्ष की किसी ऐसी लाइब्रेरी का इस्तेमाल करें जो
ECDSA.
सार्वजनिक पासकोड फ़ेच करें
इनाम वाले SSV कॉलबैक की पुष्टि करने के लिए, आपको 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;
}
पुष्टि के लिए कॉन्टेंट पाएं
इनाम वाले एसएसवी कॉलबैक के आखिरी दो क्वेरी पैरामीटर हमेशा 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 ×tamp=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"));
कॉलबैक यूआरएल से हस्ताक्षर और key_id पाएं
पिछले चरण के 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 के पासकोड के सर्वर से मिली सार्वजनिक पासकोड को कैश मेमोरी में सेव किया जा सकता है?
- हमारा सुझाव है कि आप AdMob कुंजी से मिली सार्वजनिक कुंजी को कैश मेमोरी में सेव कर लें SSV की पुष्टि करने के लिए ज़रूरी कार्रवाइयों को कम करने के लिए सर्वर कॉलबैक. हालांकि, ध्यान रखें कि सार्वजनिक पासकोड नियमित रूप से रोटेट होते हैं और उन्हें कैश मेमोरी में सेव रखने का विकल्प, 24 घंटे से ज़्यादा समय तक सेव रखा जाता है.
- AdMob के मुख्य सर्वर से मिलने वाली सार्वजनिक कुंजियों को कितनी बार बदला जाता है?
- AdMob कुंजी सर्वर से मिलने वाली सार्वजनिक कुंजियां, वैरिएबल पर रोटेट की जाती हैं शेड्यूल करें. यह पक्का करने के लिए कि SSV कॉलबैक की पुष्टि इस तरह काम करती रहे सार्वजनिक पासकोड 24 घंटे से ज़्यादा समय के लिए कैश मेमोरी में सेव नहीं किए जाने चाहिए.
- अगर मेरे सर्वर से कनेक्ट न हो पाए, तो क्या होगा?
- Google को एसएसवी के लिए
HTTP 200 OK
सक्सेस स्टेटस रिस्पॉन्स कोड की उम्मीद है कॉलबैक. अगर आपके सर्वर से कनेक्ट नहीं हो पा रहा है या वह उम्मीद के मुताबिक नहीं है जवाब मिलने पर, Google ज़्यादा से ज़्यादा पांच बार एसएसवी कॉलबैक भेजने की फिर से कोशिश करेगा एक सेकंड का इंटरवल होना चाहिए. - मैं यह कैसे पुष्टि करूं कि एसएसवी कॉलबैक Google से आ रहे हैं?
- रिवर्स डीएनएस लुकअप का इस्तेमाल करके पुष्टि करें कि एसएसवी कॉलबैक Google से आते हैं.