# Callback URL

사용자의 광고 참여가 완료되면 해당 정보를 입력하신 콜백(callback) URL 을 호출하여 전달합니다. 매체사에서는 전달받은 정보를 사용하여 사용자에게 리워드를 지급하도록 구현해야 합니다.

Callback URL 은 설정을 위하여 별도의 콜백 관리 화면을 제공합니다. 여기에서 설정된 콜백을 매체 상세 화면에서 지정하세요. 콜백 호출 시 테스트 여부를 구분하기 위하여 test\_yn 파라메터를 전달합니다.&#x20;

* 테스트 콜백 : 매체가 테스트 상태이거나 또는 사용자가 테스트 유저로 등록된 경우에 호출됩니다. test\_yn=Y 파라메터가 전달됩니다.
* 매체가 게시(Live) 상태이고 사용자가 테스트 유저가 아닌 경우에는 test\_yn=N 으로 파라메터가 전달됩니다.
* 콜백 테스트 버튼을 클릭하시어 간단하게 콜백 URL 동작을 테스트해보실 수 있습니다.

Callback URL 로 전달되는 파라메터들은 아래와 같습니다.

<table><thead><tr><th width="146.27734375" align="center">파라메터 이름</th><th width="135.046875" align="center">파라메터 타입</th><th>설명</th></tr></thead><tbody><tr><td align="center">pub_id</td><td align="center">long</td><td>매체 ID</td></tr><tr><td align="center">pub_key</td><td align="center">string</td><td>매체 key</td></tr><tr><td align="center">pub_user_nm</td><td align="center">string</td><td>매체에서 전달한 사용자 ID (<a href="../android#id-2.4">Android</a>, iOS 가이드 참고)</td></tr><tr><td align="center">adv_id</td><td align="center">long</td><td>참여한 광고 ID</td></tr><tr><td align="center">adv_title</td><td align="center">string</td><td>광고 타이틀</td></tr><tr><td align="center">adv_type</td><td align="center">int</td><td>광고 유형</td></tr><tr><td align="center">actn_id</td><td align="center">long</td><td>참여한 광고의 액션 ID</td></tr><tr><td align="center">actn_title</td><td align="center">string</td><td>액션 타이틀</td></tr><tr><td align="center">actn_type</td><td align="center">int</td><td>액션 유형</td></tr><tr><td align="center">user_pnt</td><td align="center">float</td><td>사용자에게 지급되는 포인트</td></tr><tr><td align="center">pnt_unit</td><td align="center">string</td><td>포인트 단위</td></tr><tr><td align="center">pay_amt</td><td align="center">float</td><td>매체에 지급되는 금액</td></tr><tr><td align="center">pub_curr</td><td align="center">string</td><td>매체 지급 금의 통화 단위 (KRW, USD 등)</td></tr><tr><td align="center">tr_dt</td><td align="center">long</td><td>지급 발생시간 (1970/1/1 기준으로 milli-seconds 값)</td></tr><tr><td align="center">tr_id</td><td align="center">string</td><td>지급에 대한 고유 ID</td></tr><tr><td align="center">verify_cd</td><td align="center">string</td><td>콜백 검증 값, SHA256(콜백Key + tr_id)</td></tr></tbody></table>

유의 사항

* tr\_id 는 지급에 대한 고유 ID 입니다. 동일한 콜백이 반복적으로 호출될 수 있으므로 tr\_id 를 통하여 중복 지급을 방지하도록 구현하세요.
* verify\_cd 는 콜백 호출 자체에 대한 유효성을 검증합니다. 콜백 관리화면에서 제공되는 콜백 key 값과 tr\_id 값의 SHA256 값을 생성하여 verify\_cd 값과 비교하세요.
* 다음은 check\_cd 를 확인하는 간단한 callback 구현 샘플입니다.

{% tabs %}
{% tab title="PHP" %}

```php
<?php
// 매체에 설정된 callback key
$callbackKey = "1234567890abcdefg...xxx";

// 파라미터 받기
$advTitle    = $_REQUEST['adv_title'];
$actionTitle = $_REQUEST['actn_title'];
$trId        = $_REQUEST['tr_id'];
$verifyCd     = $_REQUEST['verify_cd'];

$pubUserName = $_REQUEST['pub_user_nm'];
$userPoint   = (float)$_REQUEST['user_pnt'];

// 검증 코드 생성
$verifyCode = hash('sha256', $callbackKey . $trId);

if ($verifyCode === $verifyCd) {
    // verified
    // 1. trId 중복 여부 확인
    // 2. pubUserName 사용자에게 userPoint 지급
    // (DB 처리 로직 작성)
    // 예: UPDATE users SET point = point + :userPoint 
    //      WHERE username = :pubUserName
} else {
    // invalid request
    // callback 요청 무시
}
?>

```

{% endtab %}

{% tab title="Java Servlet" %}

```java
    // 매체에 설정된 callback key
    String callbackKey = "1234567890abcdefg...xxx"; 
    
    String advTitle = request.getParameter("adv_title");
    String actionTitle = request.getParameter("actn_title");
    String trId = request.getParameter("tr_id");
    String verifyCd = request.getParameter("verify_cd");

    String pubUserName = request.getParameter("pub_user_nm");
    float userPoint = Float.parseFloat(request.getParameter("user_pnt"));

    String verifyCode = DigestUtils.sha256Hex(callbackKey + trId);
    if (verifyCode.equals(verifyCd)) {
        // verified
        // 1. check if trId is duplicated.
        // 2. pay userPoint to an user who's ID is pubUserName.
        // (DB 처리 로직 작성)
        // 예: UPDATE users SET point = point + :userPoint 
        //      WHERE username = :pubUserName
    }
    else {
        // invalid request
        // ignore this callback request.
    }

```

{% endtab %}
{% endtabs %}
