# 회원 연동 (GET)

***

## **➊ 회원 연동**

### **1-1. 개요** <a href="#id-2" id="id-2"></a>

{% hint style="info" %}
**회원 연동이란?**

자체 사용 중인 서비스의 회원 인증을 콘티플의 헬프센터에 적용하여 회원 문의를 접수하고,\
접수한 문의 내역을 다시 확인할 수 있도록 제공하는 기능입니다.
{% endhint %}

* 회원 연동은 GET 방식과 POST 방식의 두 가지 타입으로 제공합니다.
* 연동을 위해 콘티플에서 제공하는 개발 명세서에 따라 API를 개발하여 회원 연동 메뉴에 등록해주세요.

#### **(1) POST 방식**

* 연동하려는 서비스가 PC, Mobile 플랫폼에서 WEB 기반으로 제공될 경우 적합합니다.
* 서비스의 로그인 화면이 WEB URL 형태로 제공되어야 사용 가능합니다.
* 개발 명세에서 세부적으로 2가지 타입을 제공합니다. (Client-side, Sever-side)

#### **(2) GET 방식**&#x20;

* WEB 기반의 로그인 화면이 없는 서비스의 경우 적합합니다.
* WEB 기반이 아닌 Native APP 서비스의 경우 적합한 연동 방식입니다.

***

### **1-2. 프로세스(GET 방식)**

{% stepper %}
{% step %}

### 헬프센터 접속 및 URL 호출

* 자체 서비스를 이용하는 고객이 App 내에서 헬프센터에 접속합니다.
* App에서 헬프센터 호출 시, 아래 URL 형식으로 호출합니다.
  * https\://{org}.oc.nhncloud.com/{service}/hc/?usercode={유저\_아이디}\&username={유저\_이름}\&email={유저\_이메일}\&phone={유저\_전화번호}\&token={인증토큰\_값}

{% endstep %}

{% step %}

### Token 검증 URL 호출

* 헬프센터에서 Token 검증 URL을 호출합니다.
* Token 검증 URL은 고객사에서 아래 제공된 개발 명세서에 따라 개발 후, 콘티플 회원 연동 메뉴에 등록해야 합니다.

{% endstep %}

{% step %}

### 문의하기 또는 문의내역 접속

* 토큰 검증 후, 정상인 경우 문의하기 또는 문의내역 페이지에 접속할 수 있습니다.
* 검증에 실패할 경우, 문의하기는 비회원으로 접수됩니다.
  {% endstep %}
  {% endstepper %}

***

### **1-3. 회원 연동 방법**

#### **① 회원 연동 활성화**

* \[서비스 관리] → \[헬프센터] → \[회원 연동]으로 이동합니다.
* 회원 연동을 사용하려면 **활성화**로 설정합니다.

#### **② 비회원 문의 접수**

* <mark style="color:green;">활성화 :</mark> (고객이) 로그인하지 않은 상태에서도 문의 접수가 가능해집니다.
* <mark style="color:orange;">비활성화 :</mark> 로그인 상태에서만 문의 접수가 가능하도록 통제됩니다.

#### **③ 로그인 타입**

* GET 방식을 선택합니다.

#### **④ Token 검증 URL**

* 헬프센터 호출 시, 자체 서비스에서 전달한 토큰을 검증하기 위한 URL입니다.
* 아래 개발 명세서에 따라 개발한 Token 검증 URL을 입력 후, **저장** 버튼을 클릭하여 완료합니다.

***

## **➋ 개발 명세서**

### **2-1. 인증 토큰 생성**

{% hint style="info" %}
**콘티플 조직 Key**

\[전체 관리] → \[계약 서비스 현황] → 조직 정보]에서 확인할 수 있습니다.
{% endhint %}

> Token 생성 샘플은 아래와 같으며, 파라미터 순서는 반드시 아래와 일치해야 합니다.
>
> (※ Sample project > application.properties > oc.apikey= 항목에 조직 Key를 저장)

```java
private String getSHA256Token(String serviceId, String usercode, String username, String email, String phone,
        String returnUrl, Long time, String apiKey) throws Exception {
    StringBuilder sb = new StringBuilder();
    // Order by follow number:
    sb.append(serviceId); // 1
    sb.append("&");
    sb.append(usercode); // 2
    sb.append("&");
    if (StringUtils.isNotBlank(username)) {
        sb.append(username); // 3
        sb.append("&");
    }
    if (StringUtils.isNotBlank(email)) {
        sb.append(email); // 4
        sb.append("&");
    }
    if (StringUtils.isNotBlank(phone)) {
        sb.append(phone); // 5
        sb.append("&");
    }
    　if (StringUtils.isNotBlank(memberno)) {
        sb.append(memberno); // 6
        sb.append("&");
    　}
    if (StringUtils.isNotBlank(returnUrl)) {
        sb.append(returnUrl); // 7
        sb.append("&");
    }
    sb.append(time); // 8

    SecretKeySpec signingKey = new SecretKeySpec(apiKey.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance(signingKey.getAlgorithm());
    mac.init(signingKey);
    byte[] rawHmac = mac.doFinal(sb.toString().getBytes("UTF-8"));
    return new String(Base64.encodeBase64(rawHmac));
}

// Sample
// Use this same input, the output is : Ah9M58CQ9RFTShjFuqziQr+0MjmJxN6+bzWxMD71moo=
public static void main(String[] args) throws Exception {
    String s = getSHA256Token("yourservice", "testusercode", "testUsername", "test@email.com", "123456789",
    null, 1660095873001L, "7cf2828608274a49a3f06152b2188927");
    System.out.println(s); // Output: Ah9M58CQ9RFTShjFuqziQr+0MjmJxN6+bzWxMD71moo=
}
```

***

### **2-2. GET 회원 인증 방법**

#### **(1) 인터페이스 설명**

URL

* https\://{org}.oc.nhncloud.com/{service}/hc/?usercode=aaaabbb\&username=yzg\&email=<yzgname@163.com>\&phone=12345678901\&time=12345678\&token=8NPaBegAfbSvh1Lna9M0I1wBqjnoRyKO2r2izhuEAng%3d
* https\://{org}.oc.nhncloud.com/{service}/hc/ticket/?usercode=aaaabbb\&username=yzg\&email=<yzgname@163.com>\&phone=12345678901\&time=12345678\&token=8NPaBegAfbSvh1Lna9M0I1wBqjnoRyKO2r2izhuEAng%3d
* https\://{org}.oc.nhncloud.com/{service}/hc/ticket/list/?usercode=aaaabbb\&username=yzg\&email=<yzgname@163.com>\&phone=12345678901\&time=12345678\&token=8NPaBegAfbSvh1Lna9M0I1wBqjnoRyKO2r2izhuEAng%3d

| 인터페이스 명  | 프로토콜  | 호출방향 | 인코딩   | 결과 형식 | 인터페이스 설명                                                        |
| -------- | ----- | ---- | ----- | ----- | --------------------------------------------------------------- |
| GET 회원인증 | HTTPS | GET  | UTF-8 |       | 서비스 측에서 헬프센터 접속 시, 고객정보 및 암호화 후 생성된 token 값을 파라미터로 URL에 추가해서 호출 |

***

#### **(2) 파라미터**

{% hint style="danger" %}
**인증 Token 생성 주의사항**

1. Token 생성 시, 한글이 있을 경우 한글로 직접 생성. 인코딩 필요 없음
2. 생성된 Token을 URL 파라미터로 사용 시, encodeURIComponent()로 인코딩 필요
   {% endhint %}

<table><thead><tr><th width="156">명칭</th><th width="119">변수</th><th width="153">데이터 타입</th><th width="81">필수</th><th>설명</th></tr></thead><tbody><tr><td>서비스 ID</td><td>service</td><td>VARCHAR(50)</td><td>O</td><td>서비스 ID</td></tr><tr><td>유저 ID</td><td>usercode</td><td>VARCHAR(50)</td><td>O</td><td>유저ID(유니크 값)</td></tr><tr><td>유저 명</td><td>username</td><td>VARCHAR(50)</td><td>X</td><td>유저 명</td></tr><tr><td>유저 이메일</td><td>email</td><td>VARCHAR(100)</td><td>O</td><td>유저 이메일</td></tr><tr><td>전화번호</td><td>phone</td><td>VARCHAR(20)</td><td>X</td><td>전화번호</td></tr><tr><td>회원번호</td><td>memberno</td><td>VARCHAR(50)</td><td>X</td><td>회원번호</td></tr><tr><td>timestamp</td><td>time</td><td>LONG</td><td>O</td><td>시간 단위: 밀리초</td></tr><tr><td>인증 Token</td><td>token</td><td>VARCHAR</td><td>O</td><td>다음 파라미터 값과 조직 Key로 계산(SHA256). (선택사항 값이 null 혹은 없을 경우, token 생성에서 제외. 주의사항: 문자열에서 각 값의 순서는 다음과 동일해야 함) SHA256Digest(service + usercode + username + email + phone + memberno + returnUrl + time)</td></tr></tbody></table>

***

#### **(3) 결과 데이터**

* Token 인증 성공 : 회원으로 접속하는 주소로 이동
* Token 인증 실패 : 비회원으로 접속하는 주소로 이동
* Token 인증 실패 상태에서 문의내역으로 접속 시, 문의하기 화면으로 이동

***

### **2-3. Token 검증 URL (서비스 측)**

#### **(1) 인터페이스 설명**

* URL: 서비스 측에서 제공

| 인터페이스 명      | 프로토콜  | 호출방향 | 인코딩   | 결과 형식 | 인터페이스 설명                                              |
| ------------ | ----- | ---- | ----- | ----- | ----------------------------------------------------- |
| Token 검증 URL | HTTPS | GET  | UTF-8 | JSON  | 서비스 측에서 token과 usercode로 로그인 상태 확인 후 JSON 형태 결과 값을 전송 |

***

#### **(2) 요청 파라미터**

<table><thead><tr><th>명칭</th><th width="125">변수</th><th>데이터 타입</th><th width="70">필수</th><th>설명</th></tr></thead><tbody><tr><td>유저 ID</td><td>usercode</td><td>VARCHAR(50)</td><td>O</td><td>유저 ID(유니크 값)</td></tr><tr><td>서비스 측에서 생성한 Token</td><td>token</td><td>VARCHAR</td><td>O</td><td>사용자가 GET 방식을 통해 Online Contact에 로그인 시, Online Contact으로 전달하는 token</td></tr></tbody></table>

***

#### **(3) Response Body**

```json
로그인:
{
"login": "true",
"usercode":"usercodeXXX"
}


로그아웃:
{
"login": "false",
"usercode": null
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.contiple.com/api/open-api/get.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
