Sunucu tarafı doğrulama geri çağırmaları, sorgu parametrelerine sahip URL istekleridir. gönderilen veriler, Google tarafından harici bir sisteme gönderilir. etkileşimde bulunduğu için bir kullanıcının ödül kazanacağını bildirmeli ödüllü geçiş reklamı. Ödüllü SSV (sunucu tarafı doğrulama) geri çağırmaları istemci taraflı geri çağırmalarda adres sahteciliğine karşı ek bir koruma katmanı sağlar .
Bu kılavuzda, Tink Java Apps üçüncü taraf geri çağırma işlevindeki sorgu parametrelerinin geçerli olmalıdır. Tink, bu kılavuzun amacına uygun şekilde kullanılsa da, destekleyen herhangi bir üçüncü taraf kitaplığını ECDSA'da bulabilirsiniz. Ayrıca, sunucunuzu test etmek için test aracını kullanın.
Bu bağlantılardan tam olarak örnek ile başlayın.
Ön koşullar
Ödüllü reklamları şununla mobil uygulama: Google Mobile Ads SDK'sının v11.6.0 veya sonraki sürümleri.
Ödüllü sunucu tarafını etkinleştir doğrulama işlemini tamamlayın.
Tink Java Uygulamaları kitaplığından RewardAdsVerifier hizmetini kullanın
Tink Java Uygulamaları GitHub deposu
şunları içerir:
RewardedAdsVerifier
yardımcı sınıfı kullanarak ödüllü SSV geri çağırmasını doğrulamak için gereken kodu azaltın.
Bu sınıfı kullanmanız, aşağıdaki kodla geri çağırma URL'sini doğrulamanıza olanak tanır.
RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder()
.fetchVerifyingPublicKeysWith(
RewardedAdsVerifier.KEYS_DOWNLOADER_INSTANCE_PROD)
.build();
String rewardUrl = ...;
verifier.verify(rewardUrl);
verify()
yöntemi bir istisna oluşturmadan yürütülürse geri çağırma
URL başarıyla doğrulandı. Kullanıcıyı ödüllendirme
bölümünde, kullanıcıların ne zaman ödüllendirileceğine ilişkin en iyi uygulamalar ayrıntılı olarak açıklanıyor. Örneğin,
ödüllü SSV geri çağırmalarını doğrulamak için bu sınıfın gerçekleştirdiği adımların dökümü,
Ödüllü reklamların manuel olarak doğrulanması
SSV bölümünü inceleyin.
SSV geri çağırma parametreleri
Sunucu tarafı doğrulama geri çağırmaları, ödüllü reklam etkileşimi Parametre adları, açıklamaları ve örnek değerleri: aşağıda listelenmiştir. Parametreler alfabetik sırada gönderilir.
Parametre Adı | Açıklama | Örnek değer |
---|---|---|
ad_network | Bu reklamı karşılayan reklam kaynağının reklam kaynağı tanımlayıcısı. Reklam kaynağı kimlik değerlerine karşılık gelen adlar, Reklam kaynak tanımlayıcıları bölümünü inceleyin. | 1953547073528090325 |
ad_unit | Ödüllü reklam isteğinde bulunmak için kullanılan AdMob reklam birimi kimliği. | 2747237135 |
custom_data | Sağlandığı şekliyle özel veri dizesi
.
setCustomData
.
Uygulama tarafından herhangi bir özel veri dizesi sağlanmazsa bu sorgu parametresi değeri, SSV geri çağırmasında bulunmayacaktır. |
SAMPLE_CUSTOM_DATA_STRING |
key_id | SSV geri arama isteğini doğrulamak için kullanılacak anahtar. Bu değer bir ortak anahtara eşlenir AdMob anahtar sunucusu tarafından sağlanır. | 1234567890 |
reward_amount | Reklam birimi ayarlarında belirtilen ödül tutarı. | 5 |
reward_item | Reklam birimi ayarlarında belirtildiği şekilde ödül öğesi. | madeni paralar |
signature | AdMob tarafından oluşturulan SSV geri aramasına ilişkin imza. | MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY |
timestamp | Kullanıcının ms cinsinden Epoch zamanı olarak ödüllendirildiği zaman damgası. | 1507770365237823 |
transaction_id | AdMob tarafından oluşturulan her ödül bağışı etkinliği için onaltılık kodlanmış benzersiz tanımlayıcı. | 18fa792de1bca816048293fc71035638 |
user_id | tarafından sağlandığı şekliyle kullanıcı tanımlayıcısı
.
setUserId
Uygulama tarafından hiçbir kullanıcı tanımlayıcısı sağlanmazsa bu sorgu parametresi SSV geri çağırmasında bulunmalıdır. |
1234567 |
Reklam kaynağı tanımlayıcıları
Reklam kaynağı adları ve kimlikleri
Reklam kaynağı adı | Reklam kaynağı kimliği |
---|---|
Aarki (teklifli sistem) | 5240798063227064260 |
Reklam oluşturma (teklifli sistem) | 1477265452970951479 |
AdColony | 15586990674969969776 |
AdColony (SDK dışı) (teklifli sistem) | 4600416542059544716 |
AdColony (teklifli sistem) | 6895345910719072481 |
AdFalcon | 3528208921554210682 |
AdMob Ağı | 5450213213286189855 |
AdMob Ağı şelalesi | 1215381445328257950 |
ADResult | 10593873382626181482 |
AMoAd | 17253994435944008978 |
Applovin | 1063618907739174004 |
Applovin (teklifli sistem) | 1328079684332308356 |
Chartboost | 2873236629771172317 |
Çikolata Platformu (teklifli sistem) | 6432849193975106527 |
Çapraz Kanal (MdotM) | 9372067028804390441 |
Özel Etkinlik | 18351550913290782395 |
DT Exchange* * Bu ağ, 21 Eylül 2022'den önce "Fyber Pazar Yeri" olarak adlandırılıyordu. | 2179455223494392917 |
EMX (teklifli sistem) | 8497809869790333482 |
Dalgalanma (teklifli sistem) | 8419777862490735710 |
Hafif kar yağışı | 3376427960656545613 |
Fyber* * Bu reklam kaynağı, geçmiş raporlar için kullanılır. | 4839637394546996422 |
i-mobile | 5208827440166355534 |
İyileştirme Dijital (teklifli sistem) | 159382223051638006 |
Dizin Borsası (teklifli sistem) | 4100650709078789802 |
InMobi | 7681903010231960328 |
InMobi (teklifli sistem) | 6325663098072678541 |
InMobi Exchange (teklifli sistem) | 5264320421916134407 |
IronSource | 6925240245545091930 |
ironSource Reklamları (teklifli sistem) | 1643326773739866623 |
Leadbolt | 2899150749497968595 |
LG U+REKLAM | 18298738678491729107 |
LINE Reklamlar Ağı | 3025503711505004547 |
Maio | 7505118203095108657 |
maio (teklifli sistem) | 1343336733822567166 |
Media.net (teklifli sistem) | 2127936450554446159 |
Uyumlulaştırılmış kurum reklamları | 6060308706800320801 |
Meta Audience Network* * Bu ağ, 6 Haziran 2022'den önce "Facebook Audience Network" olarak adlandırılıyordu. | 10568273599589928883 |
Meta Audience Network (teklifli sistem)* * Bu ağ, 6 Haziran 2022'den önce "Facebook Audience Network (teklifli sistem)" olarak adlandırılıyordu. | 11198165126854996598 |
Mintegral | 1357746574408896200 |
Mintegral (teklifli sistem) | 6250601289653372374 |
MobFox | 8079529624516381459 |
MobFox (teklifli sistem) | 3086513548163922365 |
MoPub (desteği sonlandırılmış) | 10872986198578383917 |
myTarget | 8450873672465271579 |
Nend | 9383070032774777750 |
Nexxen (teklifli sistem)* * Bu ağ, 1 Mayıs 2024'ten önce "UnrulyX" olarak adlandırılıyordu. | 2831998725945605450 |
AOL'den ONE (Millennial Media) | 6101072188699264581 |
AOL'den ONE (Nexage) | 3224789793037044399 |
OneTag Exchange (teklifli sistem) | 4873891452523427499 |
OpenX (teklifli sistem) | 4918705482605678398 |
Pangle | 4069896914521993236 |
Pangle (teklifli sistem) | 3525379893916449117 |
PubMatic (teklifli sistem) | 3841544486172445473 |
Rezervasyon kampanyası | 7068401028668408324 |
RhythmOne (teklifli sistem) | 2831998725945605450 |
Rubicon (teklifli sistem) | 3993193775968767067 |
SK gezegeni | 734341340207269415 |
Paylaşım (teklifli sistem) | 5247944089976324188 |
Smaato (teklifli sistem) | 3362360112145450544 |
Equativ (teklifli sistem)* * Bu ağ, 12 Ocak 2023'ten önce "Smart Adserver" olarak adlandırılıyordu. | 5970199210771591442 |
Sonobi (teklifli sistem) | 3270984106996027150 |
Tapjoy | 7295217276740746030 |
Tapjoy (teklifli sistem) | 4692500501762622178 |
Tencent GDT | 7007906637038700218 |
TripleLift (teklifli sistem) | 8332676245392738510 |
Unity Reklamları | 4970775877303683148 |
Unity Reklamları (teklifli sistem) | 7069338991535737586 |
Verizon Media | 7360851262951344112 |
Verve Group (teklifli sistem) | 5013176581647059185 |
Vpon | 1940957084538325905 |
Liftoff Para Kazanma* * Bu ağ, 30 Ocak 2023'ten önce "Vungle" olarak adlandırılıyordu. | 1953547073528090325 |
Liftoff Para Kazanma (teklifli sistem)* * Bu ağ, 30 Ocak 2023'ten önce "Vungle (teklifli sistem)" olarak adlandırılıyordu. | 4692500501762622185 |
Yieldmo (teklifli sistem) | 4193081836471107579 |
YieldOne (teklifli sistem) | 3154533971590234104 |
Zucks | 5506531810221735863 |
Kullanıcıyı ödüllendirme
Karar verirken kullanıcı deneyimini dengelemek ve doğrulamayı ödüllendirmek önemlidir ne zaman ödüllendirileceğini belirleyin. Sunucu tarafı geri çağırmalarda gecikmeler yaşanabilir harici sistemlere ulaşmak. Bu nedenle, önerilen en iyi uygulama kullanıcıyı hemen ödüllendirmek için istemci taraflı geri çağırmayı tüm ödüller için doğrulama işlemini tamamladığımızı hatırlatırız. Bu yaklaşımında iyi bir kullanıcı deneyimi sunarken, aynı zamanda ödüller.
Bununla birlikte, ödül geçerliliğinin çok önemli olduğu (örneğin, (uygulamanızın oyun içi ekonomisini etkiler) ve ödül vermede gecikme yaşanması kabul edilebilir, doğrulanmış sunucu tarafı geri çağırmasını beklemek en iyisi bahsedeceğiz.
Özel veriler
Sunucu tarafı doğrulama geri çağırmalarında ek veri gerektiren uygulamalar
ödüllü reklamların özel veri özelliği. Ödüllü reklamda ayarlanan herhangi bir dize değeri
nesnesi, SSV geri çağırmasının custom_data
sorgu parametresine iletilir. Yanıt hayır ise
özel veri değeri ayarlandığında, custom_data
sorgu parametresi değeri
mevcut olduğu anlamına gelir.
Aşağıdaki kod örneğinde, ödüllü reklam yüklendiğinde.
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 } })
Özel ödül dizesini ayarlamak istiyorsanız göstermeden önce bunu yapmanız gerekir reklam.
.Ödüllü SSV için manuel doğrulama
Ödüllü bir reklamı doğrulamak için RewardedAdsVerifier
sınıfının gerçekleştirdiği adımlar
SSV aşağıda özetlenmiştir. Dahil edilen kod snippet'leri Java ve
Tink üçüncü taraf kitaplığından yararlanıyorsanız, bu adımları Google Play'de
destekleyen herhangi bir üçüncü taraf kitaplığını kullanarak istediğiniz dili
ECDSA'da bulabilirsiniz.
Ortak anahtarları getir
Ödüllü SSV geri arama işlemini doğrulamak için AdMob tarafından sağlanan bir ortak anahtara ihtiyacınız vardır.
Ödüllü SSV geri çağırmalarının doğrulanması için kullanılacak ortak anahtarların listesi AdMob anahtarından getirilir. sunucu değerleridir. Ortak anahtarların listesi aşağıdakine benzer bir biçimde JSON gösterimi olarak sağlanır:
{
"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=="
},
],
}
Ortak anahtarları almak için AdMob anahtar sunucusuna bağlanın ve
tuşlarını kullanın. Aşağıdaki kod bu görevi gerçekleştirir ve JSON dosyasını kaydeder
data
değişkenine ilişkin anahtarların gösterimi.
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();
}
Ortak anahtarların düzenli olarak döndürüldüğünü unutmayın. Konuyla ilgili size yardımcı olabilir. Ortak anahtarları önbelleğe alıyorsanız anahtarlara teslim edilir.
Ortak anahtarlar getirildikten sonra ayrıştırılmalıdır. İlgili içeriği oluşturmak için kullanılan
Aşağıdaki parsePublicKeysJson
yöntemi, örnekteki gibi bir JSON dizesi alır
ve key_id
değerlerinden ortak anahtarlara bir eşleme oluşturur.
Bunlar, Tink kitaplığından ECPublicKey
nesneleri olarak kapsüllenmiş durumdadır.
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;
}
İçeriğin doğrulanmasını sağlama
Ödüllü SSV geri çağırmalarının son iki sorgu parametresi her zaman signature
olur
key_id,
ve bu sırada. Kalan sorgu parametreleri,
doğrulanması gerekir. AdMob'u, ödül geri çağırması için AdMob'u yapılandırdığınızı varsayalım.
https://www.myserver.com/mypath
Aşağıdaki snippet'te ödüllü reklam örneği gösterilmektedir
Doğrulanacak içeriğin vurgulandığı SSV geri çağırması.
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
Aşağıdaki kod, bir geri çağırma URL'sini UTF-8 bayt dizisi olarak kullanın.
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"));
Geri çağırma URL'sinden imza ve key_id öğesini alın
Önceki adımda bulunan queryString
değerini kullanarak signature
ve
Geri çağırma URL'sinden aşağıda gösterildiği gibi key_id
sorgu parametresi:
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()));
Doğrulama gerçekleştirme
Son adım,
uygun bir ortak anahtara hayat verin.
parsePublicKeysJson
yöntemini kullanın ve geri çağırmanın key_id
parametresini kullanın
Bu eşlemeden ortak anahtarı almak için URL. Ardından şununla imzayı doğrulayın:
bu ortak anahtarı kullanın. Bu adımlar aşağıdaki verify
yönteminde gösterilmiştir.
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);
}
}
Yöntem bir istisna olmadan yürütülürse geri çağırma URL'si başarıyla doğrulandı.
SSS
- AdMob anahtar sunucusu tarafından sağlanan ortak anahtarı önbelleğe alabilir miyim?
- AdMob anahtarı tarafından sağlanan ortak anahtarı önbelleğe almanızı öneririz SSV'yi doğrulamak için gereken işlem sayısını azaltmak üzere sunucuya daha fazla bilgi edindiniz. Ancak ortak anahtarların düzenli olarak döndürüldüğünü ve 24 saatten uzun süre önbellekte tutulur.
- AdMob anahtar sunucusu tarafından sağlanan ortak anahtarlara ne sıklıkta rotasyon uygulanır?
- AdMob anahtar sunucusu tarafından sağlanan ortak anahtarlar, bir değişkene göre döndürülür hakkında bilgi edindiniz. SSV geri çağırmalarının doğrulanmasının genel anahtarlar 24 saatten uzun bir süre boyunca önbelleğe alınmamalıdır.
- Sunucuma erişemezse ne olur?
- Google, SSV için
HTTP 200 OK
başarı durumu yanıt kodu bekler daha fazla bilgi edindiniz. Sunucunuza ulaşılamıyorsa veya beklenen sunucu sağlanmıyorsa Google, SSV geri çağırması için bu süre içinde en fazla beş kez saniyelik aralıklarla kullanılabilir. - SSV geri aramalarının Google'dan geldiğini nasıl doğrulayabilirim?
- SSV geri aramalarının Google'dan geldiğini doğrulamak için ters DNS aramasını kullanın.