# 服务器到服务器回调事件处理程序

> 使用提供的 PHP 或 Java 参数和示例代码实现和验证 ironSource 服务器到服务器委托事件回调，以安全地奖励用户已完成的广告推荐。

佣金事件发生在用户完成广告推荐后。

* 对于奖励视频和优惠墙，这意味着应该向用户奖励虚拟货币或物品。 Ironsource 会调用佣金事件回调（在应用程序设置的 Callback 网址 参数中定义）以及有关奖励的详细信息。
* 对于奖励视频和优惠墙，必须实现委托事件回调，以便代码将正确的金额奖励给正确的用户。对于 Interstitial，事件仅通知您用户已完成优惠（不涉及奖励）。

以下部分将介绍委托事件回调的语法，提供代码示例，并介绍如何验证、管理和测试事件回调。

* 对于奖励视频，除了调用服务器端佣金事件回调之外，还会在用户完成广告推荐时发送客户端事件（请参阅 iOS 的 RewardedVideoDidReceiveCredit 或 Android 的 onRVAdCredited）。
* 对于 OfferWall，调用客户端事件 ssaOfferWallDidReceiveCredit（适用于 iOS）或 onOWAdCredited（适用于 Android）。建议的最佳做法是使用服务服务器端事件触发器用户奖励，因为可以验证回调的真实性。确保在处理`ssaRewardedVideoDidReceiveCredit` (iOS) 或 `onRVAdCredited` (Android) 时，不要针对同一事件两次奖励用户。

> **Note:**
>
> 如果不为应用程序操作后端数据服务器，并希望仅依赖客户端事件，则可以禁用服务器到服务器的回调系统。

## 委托事件回调##commission-event-callbacks

当用户完成广告推荐并应该获得信用或虚拟物品奖励时，将调用佣金事件回调。您负责实现处理此事件的代码。

### 参数##parameters

| **Name**      | **类型** | **描述**                                                                                                                                                                                                                        |
| ------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| \[USER\_ID]   | 字符串    | 要奖励的用户的唯一标识符。这是调用 app 在初始化 ironSource 商品时发送的。将传递网址编码的形式（例如，“123%40abc.com”而不是“[123@abc.com](mailto:123@abc.com)”）。                                                                                                            |
| \[REWARDS]    | Int    | 要授予用户的信用单位数。                                                                                                                                                                                                                  |
| \[EVENT\_ID]  | 字符串    | 回调事件的唯一标识符，由 ironSource 服务器生成，由字母数字角色组成                                                                                                                                                                                       |
| \[ITEM\_NAME] | 字符串    | 要授予的虚拟物品的名称（如果使用虚拟物品选项）。                                                                                                                                                                                                      |
| 时间戳           | 字符串    | 调用此回调的确切日期和时间的字符串表示，格式如下：YYYYMMDDHHMM（例如："20100102 ⁇ " 表示 2010 年 1 月 2 日 14:55)。                                                                                                                                              |
| signature     | 字符串    | 用于身份Authentication的 MD5 哈希字字符串。此密钥基于以下公式生成：md5(\[TIMESTAMP]\[EVENT\_ID]\[USER\_ID] \[REWARDS]\[PRIVATE\_KEY])。USER\_ID 元素是 userID 的网址解码值（例如，“[123@abc.com](mailto:123@abc.com)”而不是“123%40abc.com”）。私有变量\_KEY 元素是在私有变量设置中定义的值。 |

### 响应##response

应用程序必须通过发送状态为 200 (OK) 的 HTTP 响应来确认收到委托事件，其中`"\[EVENT\_ID\]:OK"` 字符串出现在响应中的任何位置。

```text
<xml>
<status>dae8e6cf42b1357f8652ad6ecb5b24f1:OK</status>
</xml>
```

> **Note:**
>
> 发送具有正确语法的响应非常重要，这样 ironSource 就不会继续发送回调重试。

## 委托事件回调代码示例 - PHP##sample-commission-event-callback-code---php

以下 PHP 代代码示例演示了一个典型的委托事件回调处理程序。复制代码后需要做的就是实现 `**alreadyProcessed()**\` 和 `**doProcessEvent()**` 函数并将 `**\[YOUR\_PRIVATE\_KEY\]**` 字符串设置为正确的值。

```php
// get the variables
$userId = $_GET['applicationUserId'];
$eventId = $_GET['eventId'];
$rewards = $_GET['rewards'];
$signature = $_GET['signature'];
$timestamp = $_GET['timestamp'];
$privateKey = ‘[YOUR_PRIVATE_KEY]';
// validate the call using the signature
if (md5($timestamp.$eventId.$userId.$rewards.$privateKey) != $signature)
{
   echo "Signature does not 匹配 参数";
   return;
}
// check that we haven't processed the same event before
if (!alreadyProcessed($eventId)){
   // grant the rewards
   doProcessEvent($eventId, $userId, $rewards);
}
// return ok
echo $eventId.":OK";
```

## 委托事件回调代码示例 - Java##sample-commission-event-callback-code---java

以下 Java 代码示例演示了一个典型的委托事件回调处理程序。复制代码后需要做的就是实现`**getPostParameter()**`和`**alreadyProcessed()**\`方法并将`**\[myPrivateKey\]**`字符串设置为正确的值。

```java
import java.security.*;
import java.math.BigInteger;
public class HelloWorld {
     public static void main(String []args) {
        
        validateSuperSonicCallback();
     }
     
    public static String getPostParameter(String param){
         // TODO : your app implementaion for get post parmas
        return "";
     }
	 
	  public static boolean alreadyProcessed(String eventId){
         // TODO 
        return true;
     }
     public static boolean validateSuperSonicCallback() {
         
         String applicationUserId = getPostParameter("applicationUserId");
         String eventId = getPostParameter("eventId");
         String signature = getPostParameter("signature");
         String userId = getPostParameter("userId");
         String rewards = getPostParameter("rewards");
         String timestamp = getPostParameter("timestamp");
         String privateKey = "myPrivateKey" ;// enter your private key
         String mySignature = "";
        try {
            String message = timestamp + eventId + userId + rewards +privateKey;
            MessageDigest md = MessageDigest.getInstance("MD5"); 
            md.update(message.getBytes());
            BigInteger hash = new BigInteger(1, md.digest());
            String result = hash.toString(16);
            while(result.length() < 32) {
                result = "0" + result;
            }
                        System.out.println(result); // 显示字符串。
        } catch (NoSuchAlgorithmException e){
        }
        if (mySignature!=signature){
	     return false;
	}else{
	     return !alreadyProcessed(eventId);
    }
     
  }
}
```

## 验证委托事件回调##authenticating-the-commission-event-callback

为了保护代码免受未经授权的访问，建议的最佳做法是测试委托事件回调签名音频源代码，以验证调用是否由 Ironsource 发出。

要验证委托事件回调，可以执行以下操作：

1. 根据以下公式从调用的参数生成 MD5 哈希值：`md5(\[TIMESTAMP\]\[EVENT\_ID\]\[USER\_ID\] \[REWARDS\]\[PRIVATE\_KEY\])`，然后验证结果与签名参数值是否相同。
2. 验证调用是否源自以下 IP 地址之一：
   * 79.125.5.179
   * 79.125.26.193
   * 79.125.117.130
   * 176.34.224.39
   * 176.34.224.41
   * 176.34.224.49
   * 34.194.180.125
   * 34.196.56.165
   * 34.196.251.81
   * 34.196.253.23
   * 54.88.253.218
   * 54.209.185.78
