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.

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ụ: |
DẤU PHÂN CÁCH1 | Nếu |
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ụ: |
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"; ?>