1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Huawei Adsの実装方法-リワード広告編

Last updated at Posted at 2021-02-22

Huawei Adsの実装方法-リワード広告編

リワード広告はこのような広告です。

image.png

Ad slot ID

Huawei Adsの実装方法-準備編Ad slot IDをご参照ください。
オフィシャルのテスト用Ad slot IDは
testx9dtjwj8hp
です。

レイアウト

リワード広告の場合、XMLレイアウトの用意がいりません。リワード広告を表示するときに、Huawei AdsはActivityの上にビューを生成します。

Android

ActivityまたはFragmentに、次の種類のソースコードを入れます。

private var rewardAd: RewardAd? = null

private fun loadRewardAd(context: Context) {
    // リワード広告オブジェクトの生成
    rewardAd = RewardAd(context, "Your Ad slot ID").apply {
        // 必須ではないが、リワード検証のために設定しておいたほうがよい
        setRewardVerifyConfig(RewardVerifyConfig.Builder()
            .setData("Your reward ads data")         // リワード検証用など
            .setUserId("Your reward ads user id")    // リワード検証用など
            .build())
    }
    // リワード広告をロード
    rewardAd?.loadAd(
        AdParam.Builder().build(),
        object : RewardAdLoadListener() {
            override fun onRewardedLoaded() {
                // ロード完了後に表示する
                showRewardAd(context)
            }

            override fun onRewardAdFailedToLoad(errorCode: Int) {
                // ロード失敗時の処理
                super.onRewardAdFailedToLoad(errorCode)
            }
        }
    )
}

private fun showRewardAd(context: Context) {
    rewardAd?.let { it ->
        // ロード完了チェック
        if (it.isLoaded) {
            // リワード広告を表示する
            it.show(this.activity, object : RewardAdStatusListener() {
                override fun onRewardAdClosed() {
                    // リワード広告が閉じられたときの処理
                    super.onRewardAdClosed()
                }

                override fun onRewardAdFailedToShow(errorCode: Int) {
                    // リワード広告が表示できないときの処理
                    super.onRewardAdFailedToShow(errorCode)
                }

                override fun onRewardAdOpened() {
                    // リワード広告が開かれたときの処理
                    super.onRewardAdOpened()
                }

                override fun onRewarded(reward: Reward?) {
                    // リワードが与えられたときの処理
                    // リワードのスコア:reward?.amount
                }
            })
        }
    }
}

サーバー

リワードの検証を行う場合のみ、サーバー側の実装が発生します。

Huawei Adsサーバーから送られてきた検証データを受け取るためのAPIの実装
Huawei Adsサーバーは次のデータをユーザーが設定したコールバックAPIで返します。

データ オプショナル 説明
adId String リワード広告のAd slot ID
data String RewardVerifyConfig.Builder().setData()に渡した値
keyId String 検証用のキーのID
rewardAmount String リワードの金額
rewardName String リワード名
sign String 検証用signature
uniqueId String ユニークなID
userId String RewardVerifyConfig.Builder().setUserId()に渡した値

ユーザーが設定する検証用コールバックAPI
1.HUAWEI Ads Publisher Consoleを開きます。
2.[My apps] -> [Add ad unit] -> [Next] -> [Advanced settings]を開きます。
3.Server-side verificationに検証用コールバックAPIを設定します。
image.png

Publisher IDと鍵
1.HUAWEI Ads Publisher Consoleを開きます。
2.[Settings]を開きます。

image.png

3.[Obtain Key]をクリックします。

image.png

検証用コールバックAPIのサンプル
まず、Publisher IDとKeyを使って、公開鍵を取得します。

String data = "";
String url = "https://ppscrowd-dre.op.dbankcloud.com/action-lib-track/publickeys";
String authorization = "Digest validTime=\"{0}\", response=\"{1}\"";
// Developer ID
String userId = "YOUR_PUBLISHER_ID"; 
// Key
String key = "YOUR_KEY"; 
        
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.UTF_8);

    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) {
    }
}

上のコードを実行すれば、次のようなレスポンスが返ってきます。

{    
    "keys": [       
        {          
            "keyId":"12345678",          
            "publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1GLi4uc3c9PVxkQgUFVCTElt"       
        },      
        {          
            "keyId": "22345678",                               
            "publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1GLi4uc3c9PVxkQgUFVCTElt"       
        }     
    ]
}

検証用コールバックAPIに渡されたkeyIdと同じkeyIdを持つ要素のpublicKeyが公開鍵になります。

次は検証ロジックのメソッドを作ります。

public static boolean verify(byte[] data, String publicKey, String sign) {
    try {
        byte[] keyBytes = base64Decode(publicKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicK = keyFactory.generatePublic(keySpec);
        Signature signature = Signature.getInstance("SHA256withRSA");
        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("UTF-8"));
}

最後はverify()を使って、検証します。

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("UTF-8"));

bool result = verify(paramContentData, {公開鍵}, {検証用コールバックAPIのsign})

Huawei Adsシリーズ

GitHub

HMS Ads Kit Demo : https://github.com/Rei2020GitHub/MyPublicProject/tree/master/AdsDemo

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?