广告
1.预加载广告
提示
- 当玩家进入到包含广告按钮场景时,cp就可以调用,这样可以减少用户等待的时间
接入代码示例
- Java
OmniSDKAdOptions options = OmniSDKAdOptions.builder()
.placementId(placementId)
.build();
OmniSDKv3.getInstance().preloadAd(activity, options, result -> {
if (result.isSuccess()) {
OmniSDKPreloadAdResult omniSDKPreloadAdResult = result.get();
Log.i(TAG, "preloadAd success placementId = " + omniSDKPreloadAdResult.getPlacementId());
// 预加载回调成功
} else {
// 广告加载异常
OmniSDKError error = result.error();
Log.i(TAG, "preloadAd fail desc:" + error.getDescription());
}
});
参数描述
OmniSDKAdOptions
参数 | 类型 | 说明 |
---|---|---|
placementId | String | 世游后台分配广告位Id |
返回值
OmniSDKPreloadAdResult
参数 | 类型 | 说明 |
---|---|---|
placementId | String | 世游后台分配广告位Id |
2.展示广告
提示
- 玩家点击游戏界面中广告按钮调用
- 没有提前调用预加载接口的情况下,需要处理用户等待过程,如loading弹窗
接入代码示例
- Java
// loading.show()
OmniSDKAdOptions options = OmniSDKAdOptions.builder()
.placementId(placementId)
.build();
OmniSDKv3.getInstance().showAd(activity, adsOptions, result -> {
// loading.dismiss()
if (result.isSuccess()) {
OmniSDKShowAdResult omniSDKShowAdResult = result.get();
when(omniSDKShowAdResult.getStatus()){
OmniSDKShowAdStatus.START -> {
// 广告开始展示
Log.i(TAG, "showAd statu is Start");
}
OmniSDKShowAdStatus.CLOSED -> {
// 广告关闭
Log.i(TAG, "showAd statu is Closed");
}
OmniSDKShowAdStatus.CLICKED -> {
// 广告被点击
Log.i(TAG, "showAd statu is Clicked");
}
OmniSDKShowAdStatus.REWARDED -> {
// 激励视频广告 奖励达成 使用adToken与游戏进行道具发放验证
Log.i(TAG, "showAd statu is Rewarded adToken = "+omniSDKShowAdResult.getToken());
}
}
} else {
// 广告播放异常
OmniSDKError error = result.error();
Log.i(TAG, "preloadAd fail desc:" + error.getDescription());
}
});
参数描述
OmniSDKAdOptions
参数 | 类型 | 说明 |
---|---|---|
placementId | String | 世游后台分配广告位Id |
返回值
OmniSDKShowAdResult
参数 | 类型 | 说明 |
---|---|---|
status | OmniSDKAdType(enum class) | 广告状态START 广告开始展示 CLICKED 广告被点击CLOSED 广告关闭REWARDED 广告奖励发放 |
token | String | 游戏服务端可验证奖励发放 唯一码 |
3.Token 验证说明
签名算法
使用 HS256
算法对订单 JWT 进行签名。签名的私钥是世游给游戏分配的 Secret Key
,游戏服务端需要用它验证 Ad Token 的签名。
Claims
广告 JWT 的 payload 中包含以下 claim:
字段 | 类型 | 说明 |
---|---|---|
iss | String | 颁发 JWT 的服务器,即世游 REST API 的端点 |
scope | String | JWT 的作用域,固定为 ad |
aud | String | 世游分配的游戏 ID, 也就是 Game ID,用于标识游戏项目 |
sub | String | 发起广告的用户 ID, 使用世游分配的聚合用户 ID |
exp | Long | 过期时间,以秒为单位 |
iat | Long | 签发时间,以秒为单位 |
impression_id | String | 世游服务端创建的,标识单次广告播放的唯一 ID |
placement_id | String | 广告位 ID,用于确定发放什么样的广告激励 |
示例:
{
"iss": "https://api.seayoo.com",
"scope": "ads",
"aud": "catsnsoup",
"sub": "1220329456780123",
"iat": 1698567544,
"exp": 1698571144,
"impresssion_id": "eaac7ced630f49ccbb4f3a6319694a97",
"placement_id": "Cats_Daily_RV"
}
验证逻辑
游戏服务端应当对 Ad Token 进行验证,验证不通过说明请求不可信,不能发放广告激励。 验证内容如下:
- Token 能够被解析成一个结构正确的 JWT
- Token 的 HS256 签名与服务端使用 Secret Key 计算出的签名匹配
- Token 的 scope 为 ads
- Token 的 aud 与世游分配的 Game ID 匹配
- Token 的 exp 字段指示的过期时间,服务端的当前时间尚未达到
- Token 的 sub 与当前游戏客户端的 SDK 聚合用户 ID 匹配
提示
游戏服务端应当使用 Ad Token 中的 impression_id
做幂等性处理,避免重复发放广告激励。
建议至少保存 impression_id
至 exp 中指示的 Ad Token 失效时间。