सर्वर साइड वेरिफ़िकेशन कॉलबैक, क्वेरी पैरामीटर वाले यूआरएल अनुरोध होते हैं जिसे Google विस्तृत करता है, जिसे Google किसी बाहरी सिस्टम को भेजता है उसे यह सूचना देनी चाहिए कि उपयोगकर्ता को इनाम वाले विज्ञापन से इंटरैक्ट करने पर इनाम मिलना चाहिए या इनाम वाला इंटरस्टीशियल विज्ञापन. इनाम वाले एसएसवी (सर्वर-साइड वेरिफ़िकेशन) कॉलबैक इससे क्लाइंट-साइड कॉलबैक के झूठे नाम से मेल भेजे जाने से बचा जा सकता है लोगों को इनाम देने के लिए डिज़ाइन किया गया है.
इस गाइड में, इनाम वाले SSV कॉलबैक की पुष्टि करने का तरीका बताया गया है Tink Java ऐप्लिकेशन तीसरे पक्ष क्रिप्टोग्राफ़िक लाइब्रेरी की मदद से यह पक्का किया जाता है कि कॉलबैक में क्वेरी पैरामीटर वैध मानों का. हालांकि, इस गाइड के लिए Tink इस्तेमाल किया जाता है, लेकिन आपके पास तीसरे पक्ष की ऐसी लाइब्रेरी का इस्तेमाल करना होगा जिसमें ECDSA. टेस्टिंग टेस्ट में, आपके सर्वर को टेस्ट किया जा सकता है. टूल की मदद से सबमिट किया जा सकता है.
पूरी तरह से काम करने वाले टूल के बारे में जानें उदाहरण के लिए पर जाकर देखें.
ज़रूरी शर्तें
इनाम वाले विज्ञापन को अपने मोबाइल ऐप्लिकेशन, जिसमें Google Mobile Ads SDK का v11.6.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 |
custom_data | यहां दी गई कस्टम डेटा स्ट्रिंग
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
setCustomData
.
अगर ऐप्लिकेशन से कोई कस्टम डेटा स्ट्रिंग नहीं मिलती है, तो यह क्वेरी पैरामीटर SSV कॉलबैक में वैल्यू मौजूद नहीं होगी. |
SAMPLE_CUSTOM_DATA_STRING |
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 |
विज्ञापन स्रोत के आइडेंटिफ़ायर
विज्ञापन सोर्स के नाम और आईडी
Ad source name | Ad source ID |
---|---|
Aarki (bidding) | 5240798063227064260 |
Ad Generation (bidding) | 1477265452970951479 |
AdColony | 15586990674969969776 |
AdColony (non-SDK) (bidding) | 4600416542059544716 |
AdColony (bidding) | 6895345910719072481 |
AdFalcon | 3528208921554210682 |
AdMob Network | 5450213213286189855 |
AdMob Network Waterfall | 1215381445328257950 |
ADResult | 10593873382626181482 |
AMoAd | 17253994435944008978 |
Applovin | 1063618907739174004 |
Applovin (bidding) | 1328079684332308356 |
Chartboost | 2873236629771172317 |
Chocolate Platform (bidding) | 6432849193975106527 |
CrossChannel (MdotM) | 9372067028804390441 |
Custom Event | 18351550913290782395 |
DT Exchange* * Prior to September 21, 2022, this network was called "Fyber Marketplace". | 2179455223494392917 |
EMX (bidding) | 8497809869790333482 |
Fluct (bidding) | 8419777862490735710 |
Flurry | 3376427960656545613 |
Fyber* * This ad source is used for historical reporting. | 4839637394546996422 |
i-mobile | 5208827440166355534 |
Improve Digital (bidding) | 159382223051638006 |
Index Exchange (bidding) | 4100650709078789802 |
InMobi | 7681903010231960328 |
InMobi (bidding) | 6325663098072678541 |
InMobi Exchange (bidding) | 5264320421916134407 |
IronSource | 6925240245545091930 |
ironSource Ads (bidding) | 1643326773739866623 |
Leadbolt | 2899150749497968595 |
LG U+AD | 18298738678491729107 |
LINE Ads Network | 3025503711505004547 |
maio | 7505118203095108657 |
maio (bidding) | 1343336733822567166 |
Media.net (bidding) | 2127936450554446159 |
Mediated house ads | 6060308706800320801 |
Meta Audience Network* * Prior to June 6, 2022, this network was called "Facebook Audience Network". | 10568273599589928883 |
Meta Audience Network (bidding)* * Prior to June 6, 2022, this network was called "Facebook Audience Network (bidding)". | 11198165126854996598 |
Mintegral | 1357746574408896200 |
Mintegral (bidding) | 6250601289653372374 |
MobFox | 8079529624516381459 |
MobFox (bidding) | 3086513548163922365 |
MoPub (deprecated) | 10872986198578383917 |
myTarget | 8450873672465271579 |
Nend | 9383070032774777750 |
Nexxen (bidding)* * Prior to May 1, 2024, this network was called "UnrulyX". | 2831998725945605450 |
ONE by AOL (Millennial Media) | 6101072188699264581 |
ONE by AOL (Nexage) | 3224789793037044399 |
OneTag Exchange (bidding) | 4873891452523427499 |
OpenX (bidding) | 4918705482605678398 |
Pangle | 4069896914521993236 |
Pangle (bidding) | 3525379893916449117 |
PubMatic (bidding) | 3841544486172445473 |
Reservation campaign | 7068401028668408324 |
RhythmOne (bidding) | 2831998725945605450 |
Rubicon (bidding) | 3993193775968767067 |
SK planet | 734341340207269415 |
Sharethrough (bidding) | 5247944089976324188 |
Smaato (bidding) | 3362360112145450544 |
Equativ (bidding)* * Prior to January 12, 2023, this network was called "Smart Adserver". | 5970199210771591442 |
Sonobi (bidding) | 3270984106996027150 |
Tapjoy | 7295217276740746030 |
Tapjoy (bidding) | 4692500501762622178 |
Tencent GDT | 7007906637038700218 |
TripleLift (bidding) | 8332676245392738510 |
Unity Ads | 4970775877303683148 |
Unity Ads (bidding) | 7069338991535737586 |
Verizon Media | 7360851262951344112 |
Verve Group (bidding) | 5013176581647059185 |
Vpon | 1940957084538325905 |
Liftoff Monetize* * Prior to January 30, 2023, this network was called "Vungle". | 1953547073528090325 |
Liftoff Monetize (bidding)* * Prior to January 30, 2023, this network was called "Vungle (bidding)". | 4692500501762622185 |
Yieldmo (bidding) | 4193081836471107579 |
YieldOne (bidding) | 3154533971590234104 |
Zucks | 5506531810221735863 |
उपयोगकर्ता को इनाम देना
तय करते समय, उपयोगकर्ता के अनुभव और इनाम की पुष्टि के बीच संतुलन बनाना ज़रूरी है उपयोगकर्ता को इनाम कब दें. सर्वर-साइड कॉलबैक में देरी हो सकती है बाहरी सिस्टम तक पहुंच सकता है. इसलिए, हमारा सुझाव है कि आप Google पर परफ़ॉर्म करते समय, उपयोगकर्ता को तुरंत इनाम देने के लिए क्लाइंट-साइड कॉलबैक सर्वर-साइड कॉलबैक मिलने पर, सभी इनामों की पुष्टि करना. यह यह तरीका अपनाकर, उपयोगकर्ता के अनुभव को बेहतर बनाया जा सकता है. साथ ही, यह भी पक्का किया जा सकता है कि इनाम.
हालांकि, जिन ऐप्लिकेशन में इनाम की वैधता ज़रूरी होती है (उदाहरण के लिए, इनाम से आपके ऐप्लिकेशन की इन-गेम इकॉनमी पर असर पड़ता है) और इनाम देने में देरी मान्य है, तो पुष्टि किए गए सर्वर-साइड कॉलबैक का इंतज़ार करना सबसे सही रहेगा अप्रोच का इस्तेमाल करें.
कस्टम डेटा
ऐसे ऐप्लिकेशन जिन्हें सर्वर-साइड पर की गई पुष्टि के कॉलबैक में अतिरिक्त डेटा की ज़रूरत होती है, उन्हें इन चीज़ों का इस्तेमाल करना चाहिए
इनाम वाले विज्ञापनों की कस्टम डेटा सुविधा. इनाम वाले विज्ञापन पर सेट की गई स्ट्रिंग की कोई भी वैल्यू
ऑब्जेक्ट को SSV कॉलबैक के custom_data
क्वेरी पैरामीटर को पास किया जाता है. अगर नहीं
कस्टम डेटा मान सेट है, custom_data
क्वेरी पैरामीटर मान
SSV कॉलबैक में मौजूद होता है.
नीचे दिया गया कोड सैंपल, 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 } })
अगर आपको कस्टम इनाम स्ट्रिंग सेट करनी है, तो क्लिक करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैइनाम वाले एसएसवी की मैन्युअल तरीके से पुष्टि करना
इनाम की पुष्टि करने के लिए, 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 से आते हैं.