HUAWEI Ads激励广告,华为酷炫广告HUAWEI Ads激励广告激励广告激励广告是一种全屏幕的视频广告,用户可以选择点击观看,以换取相应奖励。添加激励广告1.创建激励广告对象。创建RewardAd对象,示例代码如下:public class RewardedVideoActivity extends Activi......
激励广告
激励广告是一种全屏幕的视频广告,用户可以选择点击观看,以换取相应奖励。
添加激励广告
1.创建激励广告对象。
创建RewardAd对象,示例代码如下:
public class RewardedVideoActivity extends Activity {
// testx9dtjwj8hp为专用的测试广告位ID,App正式发布时需要改为正式的广告位ID
private static final String ADID = testx9dtjwj8hp;
private RewardAd rewardAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityrewarded);
// 创建激励广告对象
createRewardAd();
}
private void createRewardAd() {
rewardAd = new RewardAd(this, ADID);
}
}
2.获取广告。
调用RewardAd对象的loadAd()方法来获取广告,示例代码如下:
/**
* 加载激励广告
*/
private void loadRewardAd() {
if (rewardAd == null) {
rewardAd = new RewardAd(this, ADID);
}
RewardAdLoadListener listener= new RewardAdLoadListener() {
@Override
public void onRewardedLoaded() {
// 激励广告加载成功
}
@Override
public void onRewardAdFailedToLoad(int errorCode) {
// 激励广告加载失败
}
};
rewardAd.loadAd(new AdParam.Builder().build(), listener);
}
3.展示广告。
调用RewardAd的show()方法来显示广告,在此之前需要调用isLoaded()方法来确认广告已经加载完成。
如下所示:
/**
* 展示激励广告
*/
private void rewardAdShow() {
if (rewardAd.isLoaded()) {
rewardAd.show(RewardedVideoActivity.this, new RewardAdStatusListener() {
@Override
public void onRewardAdOpened() {
// 激励广告被打开
...
}
@Override
public void onRewardAdFailedToShow(int errorCode) {
// 激励广告展示失败
...
}
@Override
public void onRewardAdClosed() {
// 激励广告被关闭
...
}
@Override
public void onRewarded(Reward reward){
// 激励广告奖励达成,发放奖励
...
}
});
}
}
说明
onRewarded方法中,如果在广告位配置了奖励物品信息,则会传入奖励物品信息的对象reward,通过reward.getAmount()方法获取奖励物品的数量,通过reward.getName()方法获取奖励物品的名称,推荐立即发放奖励,同时在服务端做校验,判断奖励是否生效。如果未配置奖励物品信息,则根据实际场景发放奖励。
测试激励广告
测试激励广告时,需要使用专门的测试广告位ID来获取测试广告,以避免在测试过程中产生无效的广告点击量。测试广告位ID仅作为功能调试使用,不可用于广告变现。您需要在应用发布前申请真实的广告位ID,并替换测试广告位ID。
以下表格中提供了激励广告的专用测试广告位ID:
下载激励广告的示例代码并运行,可以看到如下效果图:
另外您也可以通过学习Codelab中的教程来集成激励广告。
校验激励广告服务端验证回调
服务端验证回调是指HUAWEI Ads广告平台发快递给媒体服务器的网址请求,其中带有特定的查询参数,用来通知媒体服务器某位用户因为与激励视频广告互动而应予以奖励,从而规避欺骗的行为。
奖励用户
·在给用户发奖励时,要把握好用户体验和奖励验证之间的平衡。因为服务器端回调,可能会出现延迟,因此我们建议客户端立即奖励用户,同时在收到服务器端回调时对所有奖励进行验证。这种做法可确保奖励符合发放条件,同时提供良好的用户体验。
·对于某些应用而言,奖励是否达到发放条件非常重要,用户可适当接受延迟。这时,最佳做法是等待服务器端回调完成验证,再向用户发放奖励。
校验服务端验证回调
1.设置激励广告的奖励配置。
您在HUAWEI Ads媒体服务平台上申请激励视频广告位时选择“媒体管理(点击媒体名)新增展示位选择激励视频(点击下一步,进入编辑页面)”,设置奖励类型和奖励数量,并点击“高级设置”,设置服务器端验证的URL。如下图:
2.(可选)设置自定义数据和userId。
您在App中请求激励广告之前对激励广告对象设置自定义数据data和userId。
RewardAd rewardAd = new RewardAd(RewardActivity.this, getString(R.string.adidreward));
RewardVerifyConfig config = new RewardVerifyConfig.Builder().setData(CUSTOMDATA)
.setUserId(1234567)
.build();
rewardAd.setRewardVerifyConfig(config);
...
rewardAd.loadAd(new AdParam.Builder().build(), rewardAdLoadListener);
说明
如果没有设置data和userId,不影响发放奖励事件上报但是服务端验证的参数中没有这两个字段。如果设置data和userId,必须在展示广告之前设置并且URLEncode之后,长度不超过1024个字符,否则影响服务端验证。
3.获取要验证的内容。
用户观看完激励广告时,HUAWEI Ads服务端会把需要验证的参数以及KeyId和sign传给媒体提供的URL: https://www.example.com/feedback(即步骤一中配置的验证URL)。请求体:
{
adId : testx9dtjwj8hp,
data : CUSTOMDATA,
keyId : 12345678,
rewardAmount : 10,
rewardName : 金币,
sign : OA33u6mypnhE4hbmF32N/ibYi1uXt72nDDyYMwjDI6JXVVFKePZYo4F7Fuk2MaG......,
uniqueId : 3361626337333932313435313430373438383561376265636130393939313166,
userId : 1234567
}
服务器端验证回调查询参数说明:
4.组装验证参数。
验证内容(除sign、keyId)格式顺序如下:
adId={adId}data={data}rewardAmount={rewardAmount}rewardName={rewardName}uniqueId={uniqueId}userId={userId}
其中‘{}’里面表示参数的值,且参数顺序不能变。假如参数为null或者空字符串,则url中不拼接该参数,然后用sha256计算散列值,得到paramContentData。
示例代码如下:
String adId = request.getParameter(adId);
String data = request.getParameter(data);
String userId = request.getParameter(userId);
String param = adId= + adId + data= + data + rewardAmount= + rewardAmount + rewardName= + rewardName + uniqueId= + uniqueId + userId= + userId;
String sha256Value = Sha256Util.digest(param);
byte[] paramContentData = sha256Value.getBytes(Charset.forName(UTF8));
5.获取公钥列表。
1.在HUAWEI Ads 媒体服务平台查看对应的激励视频广告位,点击“获取密钥”按钮获取“开发者ID”和“密钥”:
2. 通过如下接口获得华为提供的公钥列表:
接口URL:https://ppscrowddre.op.dbankcloud.com/actionlibtrack/publickeys
将body通过密钥进行HMACSHA256加密得到签名,替换到Authorization中,并设置“开发者ID”和Authorization到Header中。
示例代码如下:
String data = ;
String url = https://ppscrowddre.op.dbankcloud.com/actionlibtrack/publickeys;
String authorization = Digest validTime=\{0}\, response=\{1}\;
// 开发者ID
String userId = YOURPUBLISHERID;
// 密钥
String key = YOURKEY;
HttpClient httpclient = HttpClients.createDefault();
HttpGet request = new HttpGet();
try {
String validTime = String.valueOf(System.currentTimeMillis());
String body = validTime + :/publickeys;
byte[] keyBytes = Base64.decodeBase64(key);
byte[] bodyBytes = body.getBytes(Charsets.UTF8);
Mac mac = Mac.getInstance(HmacSHA256);
SecretKey secretKey = new SecretKeySpec(keyBytes, HmacSHA256);
mac.init(secretKey);
byte[] signatureBytes = mac.doFinal(bodyBytes);
String signature = (signatureBytes == null) null : Hex.encodeHexString(signatureBytes);
authorization = MessageFormat.format(authorization, validTime, signature);
request.setURI(new URI(url));
request.setHeader(userId, userId);
request.setHeader(Authorization, authorization);
HttpResponse response = httpclient.execute(request);
data = EntityUtils.toString(response.getEntity());
} catch (Exception e) {
}
}
返回data消息体:
{
keys: [
{
keyId:12345678,
publicKey:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1GLi4uc3c9PVxkQgUFVCTElt
},
{
keyId: 22345678,
publicKey:LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1GLi4uc3c9PVxkQgUFVCTElt
}
]
}
返回消息结构体:
Key结构体:
6.执行验证。
a.根据keyId从公钥列表中找到对应的base64编码后的publicKey。
b.然后将paramContentData、publicKey和sign作为SHA256withRSA数字签名算法的入参,执行验证。
示例代码如下:
public static boolean verify(byte[] data, String publicKey, String sign, String signatureAlgorithm) {
try {
byte[] keyBytes = base64Decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
PublicKey publicK = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(signatureAlgorithm);
signature.initVerify(publicK);
signature.update(data);
return signature.verify(base64Decode(sign));
} catch (InvalidKeyException SignatureException UnsupportedEncodingException InvalidKeySpecException NoSuchAlgorithmException e) {
return false;
}
}
private static byte[] base64Decode(String encoded) throws UnsupportedEncodingException {
return Base64.decodeBase64(encoded.getBytes(UTF8));
}
特别声明:以上文章内容仅代表作者本人观点,不代表ESG跨境电商观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与ESG跨境电商联系。
二维码加载中...
使用微信扫一扫登录
使用账号密码登录
平台顾问
微信扫一扫
马上联系在线顾问
小程序
ESG跨境小程序
手机入驻更便捷
返回顶部