Cách triển khai lệnh gọi lại đổi từ máy chủ sang máy chủ

Read time 10 minutes

Sử dụng lệnh gọi lại Máy chủ đến Máy chủ (S2S) để phát hiện và ngăn chặn gian lận khi thưởng cho người chơi.

Cách thức hoạt động

Khi người chơi xem trọn vẹn video quảng cáo, máy chủ Unity Ads sẽ gửi lệnh gọi lại đã ký đến URL do bạn chỉ định. Điều này xảy ra trước khi thực sự kết thúc video, nên trò chơi có thể hoàn thành chu kỳ tặng thưởng trước khi người dùng trở lại trò chơi.

S2S redeem callback process

Triển khai

Để sử dụng lệnh gọi lại S2S, bạn cần đặt ID Máy chủ (sid) trước khi hiển thị quảng cáo. Theo mặc định, lệnh gọi lại S2S không khả dụng. Nếu muốn kích hoạt chúng cho dự án, hãy liên hệ với bộ phận Hỗ trợ bằng ID Trò chơi của bạn và URL gọi lại tương ứng trong tin nhắn. Unity sẽ gửi cho bạn mã băm bí mật dùng để ký và xác thực các lệnh gọi lại đó.

Để triển khai lệnh gọi lại trong mã C#, hãy đặt giá trị ShowOptions.gamerSid cho ID Máy chủ của bạn, sau đó chuyển đối tượng tùy chọn qua phương thức Show.

using UnityEngine;
using System.Collections;
using UnityEngine.Advertisements;

public class UnityAdsManager : MonoBehaviour
{
    public string gameId;
    public string placement = "rewardedVideo"

    public void ShowAd() {

        ShowOptions options = new ShowOptions();

        // setting the server ID
        options.gamerSid = "your-side-id";

        Advertisement.Show(placementID, options);
    }
}

Để triển khai lệnh gọi lại trong mã Java của bạn, hãy đặt giá trị PlayerMetaData.setServerId thành ID Máy chủ.

PlayerMetaData playerMetaData = new PlayerMetaData(context);
        playerMetaData.setServerId("example");
        playerMetaData.commit();

        UnityAds.show(activity);

Để triển khai lệnh gọi lại trong mã Objective-C, hãy đặt giá trị playerMetaData.setServerId thành ID Máy chủ.

        id playerMetaData = [[UADSPlayerMetaData alloc] init];
        [playerMetaData setServerId:@"example"];
        [playerMetaData commit];

        [UnityAds show:self
  placementId: placementId
          showDelegate: showDelegate];

Thông tin về lệnh gọi lại

Nguồn gốc của lệnh gọi lại

Lệnh gọi lại bắt nguồn từ địa chỉ IP/mạng được liệt kê tại đây. Danh sách sẽ được cập nhật vào ngày đầu tiên của mỗi tháng. Đơn vị phát hành có thể bỏ qua hoặc chặn các lệnh gọi lại một cách an toàn từ mọi nơi.

Định dạng URL gọi lại

Yêu cầu là một yêu cầu GET HTTP/1.1 đến URL có định dạng như sau:

[CALLBACK_URL][SEPARATOR1]sid=[SID][SEPARATOR]oid=[OID][SEPARATOR]hmac=[SIGNATURE]

Hãy tham khảo bảng sau để biết thông tin về các tham số truy vấn:

Tham sốNội dung
CALLBACK_URL

URL nền tảng của URL gọi lại, ví dụ: https://developer.example.com/award.php?productid=1234. Để định cấu hình tham số này, hãy liên hệ với bộ phận Hỗ trợ

DẤU PHÂN CÁCH1

Nếu ? chưa tồn tại trong URL, hãy dùng ?. Nếu không, & sẽ được sử dụng.

SID
ID người dùng hoặc mọi dữ liệu tùy chỉnh bạn muốn gửi đến điểm cuối của mình.
DẤU PHÂN CÁCH
&
OID
ID Ưu đãi duy nhất do máy chủ Unity Ads tạo ra.
DẤU PHÂN CÁCH
&
CHỮ KÝ

Mã băm HDMAC-MD5 của một chuỗi tham số Ví dụ: 106ed4300f91145aff6378a355fced73.

URL gọi lại mẫu

https://developer.example.com/award.php?productid=1234&sid=1234567890&oid=0987654321&hmac=106ed4300f91145aff6378a355fced73

Ký URL gọi lại

Yêu cầu URL gọi lại sẽ có chữ ký đính kèm với các tham số URL. Chữ ký là mã băm HDMAC-MD5 của chuỗi tham số được tạo bằng cách nối tất cả các tham số URL ở dạng key-value (ngoại trừ HMAC) theo thứ tự bảng chữ cái được phân tách bằng dấu phẩy.

Ví dụ: một URL gọi lại với SID hoặc OID của

https://developer.example.com/award.php?productid=1234&sid=1234567890&oid=0987654321

sẽ có chuỗi tham số như sau:

oid=0987654321,productid=1234,sid=1234567890

Sau khi được băm bằng khóa băm bí mật mà bạn sẽ nhận từ bộ phận Hỗ trợ, chuỗi này trả về mã băm mà lệnh gọi lại phần thưởng sẽ kích hoạt đến một URL. Ví dụ:

https://developer.example.com/award.php?productid=1234&sid=1234567890&oid=0987654321&hmac=106ed4300f91145aff6378a355fced73

Phản hồi lệnh gọi lại

Nếu yêu cầu vượt qua tất cả các bước kiểm tra và người dùng được trao tặng vật phẩm, URL phải phản hồi bằng HTTP/1.1 200 OK và bao gồm ký tự 1 trong phần nội dung của yêu cầu HTTP. Ví dụ:

Phản hồi lệnh gọi lại mẫu

HTTP/1.1 200 OK
Date: Wed, 22 Feb 2012 23:59:59 GMT
Content-Length: 8

1

Nếu xảy ra lỗi (ví dụ: khi OID đã được sử dụng hoặc chữ ký không khớp hoặc bất kỳ lỗi nào khác khi người dùng cuối cùng không có vật phẩm đã hứa), máy chủ sẽ trả về lỗi HTTP trong phạm vi 400- hoặc 500- với lỗi con người có thể đọc được. Ví dụ:

Phản hồi lỗi của lệnh gọi lại mẫu

HTTP/1.1 400 ERROR
Date: Wed, 22 Feb 2012 23:59:59 GMT
Content-Length: 12

Duplicate order

Ví dụ về lệnh gọi lại trong node.js

Ví dụ sau đây cho biết cách xác minh chữ ký bằng biểu thức node.js +:

Lệnh gọi lại mẫu trong node.js

// NODE.js S2S callback endpoint sample implementation
// Unity Ads

var express = require("express")
var crypto = require("crypto")
var app = express()

app.listen(process.env.PORT || 3412)

function getHMAC(parameters, secret) {
  var sortedParameterString = sortParams(parameters)
  return crypto.createHmac("md5", secret).update(sortedParameterString).digest("hex")
}

function sortParams(parameters) {
  var params = parameters || {}
  return Object.keys(params)
    .filter((key) => key !== "hmac")
    .sort()
    .map((key) => (params[key] === null ? `${key}=` : `${key}=${params[key]}`))
    .join(",")
}

app.get("/", function (req, res) {
  var sid = req.query.sid
  var oid = req.query.oid
  var hmac = req.query.hmac

  // Save the secret as an environment variable. If none is set, default to xyzKEY
  var secret = process.env.UNITYADSSECRET || "xyzKEY"

  var newHmac = getHMAC(req.query, secret)

  if (hmac === newHmac) {
    // Signatures match

    // Check for duplicate oid here (player already received reward) and return 403 if it exists

    // If there's no duplicate - give virtual goods to player. Return 500 if it fails.

    // Save the oid for duplicate checking. Return 500 if it fails.

    // Callback passed, return 200 and include '1' in the message body
    res.status(200).send("1")
  } else {
    // no match
    res.sendStatus(403)
  }
})

Ví dụ về cuộc gọi lại trong PHP

Ví dụ sau cho thấy cách xác minh chữ ký trong PHP:

Lệnh gọi lại mẫu trong PHP

<?php
function generate_hash($params, $secret) {
   ksort($params); // All parameters are always checked in alphabetical order
   $s = '';
   foreach ($params as $key => $value) {
     $s .= "$key=$value,";
   }
   $s = substr($s, 0, -1);
   $hash = hash_hmac('md5', $s, $secret);
   return $hash;
}

$hash = $_GET['hmac'];
unset($_GET['hmac']);
$signature = generate_hash($_GET, 'xyzKEY'); // insert here the secret hash key you received from Unity Ads support
error_log("req hmac".$hash);
error_log("sig hmac".$signature);

// check signature
if($hash != $signature) { header('HTTP/1.1 403 Forbidden'); echo "Signature did not match"; exit; }

// check duplicate orders
if(check_duplicate_orders($_GET['oid']) { header('HTTP/1.1 403 Forbidden'); echo "Duplicate order"; exit; }

// if not then give the player the item and check that it succeeds.
if(!give_item_to_player($_GET['sid'], $_GET['product']) { header('HTTP/1.1 500 Internal Server Error'); echo "Failed to give item to the player"; exit; }

// save the order ID for duplicate checking
if(save_order_number($_GET['oid']) { header('HTTP/1.1 500 Internal Server Error'); echo "Order ID saving failed, user granted item"; exit; }

// everything OK, return "1"
header('HTTP/1.1 200 OK');
echo "1";
?>