# 7. 예약 메시지 취소

## 개요

예약 등록한 일괄 푸시 혹은 타겟팅 푸시를 취소하는 방법입니다.

동일한 URL에 mode 구분값(DEFT/STOS)으로 일괄 예약 푸시 혹은 타겟팅 예약 푸시를 취소할 수 있습니다.

![](https://1606198054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ff5XCUiUhwc0T57hW21TH%2Fuploads%2FNY2Z4SeJkacIqq6ujrqr%2Fimage4.png?alt=media\&token=150384b8-6ff1-4aeb-a959-130dbf9ca2b7)

{% hint style="info" %}
API Server URL: <https://api-v2.fingerpush.com/rest/sts/v4/cnclPush.jsp>
{% endhint %}

## 처리 방법 및 전송/수신 파라미터 정의

### HTTPS Parameters

SSL Protocol을 이용하여 파라미터들을 API Server에 전달합니다.\
API Server로 전달해야 할 파라미터들은 아래 표를 참조해 주세요.

#### \[표 6.1] 푸시 예약 취소 HTTPS, Parameters

<table><thead><tr><th width="150">파라미터명</th><th width="150">필수 여부</th><th width="150">Byte 수</th><th>설명</th></tr></thead><tbody><tr><td><mark style="color:red;">appkey</mark></td><td>필수</td><td>-</td><td>Application key</td></tr><tr><td><mark style="color:red;">appsecret</mark></td><td>필수</td><td>-</td><td>Application Secret</td></tr><tr><td><mark style="color:red;">customerkey</mark></td><td>필수</td><td>-</td><td>Customer key</td></tr><tr><td><mark style="color:red;">mode</mark></td><td>필수</td><td>-</td><td><p>푸시 메시지 유형</p><p>DEFT: 일괄, 태그 푸시</p><p>STOS: 타겟팅 푸시</p></td></tr><tr><td>msgidx</td><td>선택</td><td>-</td><td>푸시 등록 후 반환 받은 메시지 번호</td></tr></tbody></table>

### Response JSON

API서버에서 전달 받은 파라미터 처리 후 결과를 JSON 형태로 제공합니다.

```json
{"result" : "200", "msgIdx" :  "A1DS33DDSQ2321", "processCode" : "20003", "message" : "정상 처리되었습니다."}
```

#### \[표 6.2] 발송 JSON 결과

<table><thead><tr><th width="150">값</th><th>설명</th></tr></thead><tbody><tr><td>result</td><td>결과 코드</td></tr><tr><td>message</td><td>결과 메시지</td></tr><tr><td>msgidx</td><td><p>등록된 메시지 번호. 결과 조회 시 사용 </p><p>ex) DEF_40213134</p></td></tr><tr><td>msgstate</td><td>메시지 상태(발송완료/메시지 입력 중/발송 대기/발송중/발송 실패/일시 정지 처리 중/발송 중 일시 정지)</td></tr></tbody></table>

처리결과에 따른 result 값은 아래와 같습니다.

#### \[표 6.3] 발송 JSON 결과의 result code 유형

<table><thead><tr><th width="150">코드</th><th>내용</th><th>비고</th></tr></thead><tbody><tr><td>200</td><td>정상처리 됨</td><td> 취소 완</td></tr><tr><td>4031</td><td>유효하지 않은 appkey 혹은 appsecret</td><td> </td></tr><tr><td>4032</td><td>Server to Server 서비스 이용권한 없음</td><td> </td></tr><tr><td>4033</td><td>해당 메시지에 대한 접근 권한 없음</td><td>해당 앱에서 발송한 메시지가 아님</td></tr><tr><td>4044</td><td><p>-이미 발송 취소된 메시지입니다.</p><p>-이미 발송 완료된 메시지입니다.</p><p>-이미 발송중인 메시지 이므로 취소하실 수 없습니다.</p><p>-이미 발송 실패한 메시지 이므로 취소하실 수 없습니다.</p><p>-현재 일시 정지 처리 중이므로 취소하실 수 없습니다. 일시 정지가 완료된 후 다시 시도해 주세요.</p></td><td>메시지 상태가 취소 불가능한 상태</td></tr><tr><td>500</td><td>서버 에러</td><td></td></tr><tr><td>503</td><td>필수 값이 누락됨</td><td><p>message에 누락된 필수값 표시됨.</p><p>혹은 메시지 번호 유형이 잘못된 경우</p></td></tr><tr><td>504</td><td>발송 대상 처리 중 에러</td><td>발송 대상 데이터 확인</td></tr></tbody></table>

## 샘플 소스 설명

HTTPS로 미리 정의된 파라미터들을 전달하고 JSON으로 결과 데이터를 읽을 수 있도록 작업해 주시면 됩니다.

JAVA용 샘플의 경우 Apache common의 HttpClient(<http://hc.apache.org/)를> 이용하여 파라미터를 전송하도록 하였으므로 해당 library가 필요합니다.

샘플 소스는 GitHub를 통해 확인 가능합니다.&#x20;

JSP 샘플의 경우, 샘플 메소드를 이용한 직접 발송이 가능합니다. 혹, 사용자 환경에 맞도록 수정이 필요하면 class(com.fingerpush.push.FingerpushDaoImpl)내에 구성되어 있는 메소드를 참조해 주시기 바랍니다.

해당 샘플에 대한 설명은 파라미터 전달 및 API URL에 대해 클래스 내에 구현되어 있는 로직 위주로 설명 드립니다.

### JAVA Version

Github에 올려져 있는 샘플 소스는 아래 설명된 내용 중 중복된 부분들을 method화 하여 처리하므로 약간의 차이가 있을 수 있으나, 기본 발송 방식의 설명이므로 해당 중복되는 부분을 풀어서 설명하도록 하겠습니다.

&#x20;

1\) 파라미터를 담을 List 객체를 선언해 전달할 값들을 셋팅 합니다.

```java
List <BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
```

2\) 필수값들을 셋팅 합니다.

```java
List <BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); 

params.add (new BasicNameValuePair("appkey", 애플리케이션 키));           // (필수)	
params.add (new BasicNameValuePair("appsecret", 애플리케이션 시크릿));     // (필수)
params.add (new BasicNameValuePair("customerkey", 발급받은 커스터머키));   // (필수)
params.add (new BasicNameValuePair("mode", 푸시메시지 유형));             // 푸시메시지 유형(필수)        
params.add (new BasicNameValuePair("msgidx", 푸시메시지 번호));           // 푸시메시지 번호(필수)
```

3\) 기존 HttpClient의 DefaultHttpClient를 이용한 원격 접속 방식이 deprecated 된 이유로 httpsURLConnection을 이용하여 접속합니다. 물론 deprecated 되었다고 해서 DefaultHttpClient 방식이 동작하지 않는 것은 아닙니다. 해당 방식 역시 github에 올려져 있는 샘플 소스에 구현되어 있습니다.

* 예제: FingerpushDaoImpl.sendHttpsExe(String callUrl, List \<BasicNameValuePair> params)

전달하는 파라미터는 UTF-8로 인코딩 하여 전달해야 합니다.

* 예제: 샘플의 FingerpushDaoImpl.sendHttpsUrlConExe(String callUrl, List \<BasicNameValuePair> params)

{% hint style="info" %}
API Server URL: [https://api-v2.fingerpush.com/rest/sts/v4/cnclPush.jsp](https://api-v2.fingerpush.com/rest/sts/v3/cnclPush.jsp)
{% endhint %}

```java
URL url = new URL(callUrl);
trustAllHosts();

HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
httpsURLConnection.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String s, SSLSession sslSession) {
    return true;
    }
});
HttpURLConnection connection = httpsURLConnection;

connection.setRequestMethod("POST");
connection.setUseCaches(false);           
connection.setDoInput(true);
connection.setDoOutput(true);

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
OutputStream post = connection.getOutputStream();
entity.writeTo(post);
 
post.flush();
connection.connect();
```

4\) 받은 결과는 JSON 타입의 String이므로 결과에 맞게 변환하여 사용하시는 UI에 적용하시면 됩니다.\
받은 jsonString은 앞서 설명한 ‘[Response JSON](#response-json)’ 부분을 참조해 주세요.

```java
StringBuilder responseStringBuilder = new StringBuilder();
logger.debug("contentType : "+connection.getContentType());
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK){
        
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        for (;;){
                String stringLine = bufferedReader.readLine();
                if (stringLine == null ) break;
                responseStringBuilder.append(stringLine + '\n');
        }
        bufferedReader.close();
}

connection.disconnect();

jsonString = responseStringBuilder.toString(); 
```

#### ※ JAVA Version 예약메시지 취소 샘플

<table data-header-hidden><thead><tr><th width="150"></th><th></th></tr></thead><tbody><tr><td>소스 주소</td><td><a href="https://github.com/kissoft/FingerPushSTSinJava">https://github.com/kissoft/FingerPushSTSinJava</a></td></tr><tr><td>class</td><td><p>com.fingerpush.push.FingerpushDao</p><p>com.fingerpush.push.FingerpushDaoImpl</p><p>com.fingerpush.push.PushVO</p></td></tr><tr><td>jsp</td><td>JSP/cnclPush.jsp</td></tr></tbody></table>

### PHP Version

Github에 올려져 있는 샘플 소스는 아래 설명된 내용 중 중복된 부분들을 method화 하여 처리하므로 약간의 차이가 있을 수 있으나, 기본 발송 방식의 설명이므로 해당 중복되는 부분을 풀어서 설명하도록 하겠습니다.

1\) 기본 앱 정보를 세팅합니다.

```php
// 공통 필수 
$key = array(
    'appkey'            => '[발급받은 appkey]',
    'appsecret'         => '[발급받은 appsecret]',
    'customerkey'       => '[발급받은 customerkey]',
);
```

2\) 메시지 취소 시 필수 값을 세팅합니다.

```php
$option = array(
	"mode" 		=> "STOS",	// 푸시 메시지 유형 : DEFT: 일괄, 태그 푸시 / STOS: 타겟팅 푸시
	"msgidx" 	=> $msgidx,	// message idx (필수)
);
```

3\) 앱 기본정보와 옵션값을 URL 인코드 한 쿼리 문자열로 생성합니다.

<pre class="language-php"><code class="lang-php"><strong>$data = array_merge($key, $option);
</strong>$param = http_build_query($data);
</code></pre>

4\) PHP cURL 라이브러리를 이용하여 핑거푸시 API와 통신합니다.

* PHP cURL 라이브러리: <https://www.php.net/manual/en/book.curl.php>
* 일괄발송 API URL: <https://api-v2.fingerpush.com/rest/sts/v4/cnclPush.jsp>

cURL을 아래와 같이 HTTPS 통신으로 세팅합니다.

```php
$url = 'https://api-v2.fingerpush.com/rest/sts/v4/cnclPush.jsp';   // 핑거푸시 일괄발송 API URL

$ch = curl_init ();                                     // cURL 선언
curl_setopt ( $ch, CURLOPT_URL, $url );                 // URL 세팅
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );     // 인증서 체크
curl_setopt ( $ch, CURLOPT_SSLVERSION, 1 );             // SSL 버전 -> 1만 된다.
curl_setopt ( $ch, CURLOPT_HEADER, 0 );                 // 헤더 출력 여부
curl_setopt ( $ch, CURLOPT_POST, 1 );                   // POST, GET 접속 여부
curl_setopt ( $ch, CURLOPT_TIMEOUT, 30 );               // Time Out 세팅
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );         // 결과값 리턴 여부
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $param );        // parameter
$res = curl_exec ( $ch );                               // cURL 실행하고 결과 저장

/* cURL 에러검출 */
$cErrno = curl_errno($ch);

if ($cErrno == 0) $response = $res;
else $response = exit;
curl_close ( $ch );                                     // cURL을 닫고 자원 반환
```

5\) 전달 받은 JSON 문자열 결과값을 PHP 변수로 변환합니다.

```php
// 1. json 처리시
echo $response;

// 2. object 처리시
$result = json_decode ( $response, true );                // 결과값 JSON 디코드
print_r($result);                                        // 결과 값 출력
```
