Online Contactでは、ヘルプセンターのお知らせ、FAQ、チケット情報、チケット作成などのさまざまな相談情報をOpen APIで提供しています。
Open APIを活用することで、外部システムからOnline Contactの相談情報を簡単に確認できます。
Online Contactが提供するOpen APIを使用するには、[サービス管理 → 認証]メニューで機能を有効化する必要があります。
① OPEN APIの有効化
② サービス Key
各リクエストヘッダーに下記の値を必ず設定しなければなりません。
「セキュリティサービス」機能を使用しているサービスの場合、[サービス管理 → セキュリティ管理 → スパム管理]メニューで顧客のIPを基準にスパムポリシーを有効化できます。 Open APIを通じてチケットを作成する際、リクエストヘッダーにOC-Client-IP値を設定すると、該当IPを基準にスパムかどうかが判断されます。
HmacSHA256で暗号化するか、(NHN Cloud 組織ID + request URI + パラメータ値 + 現在のUTC時間値)文字列に対して暗号化してAuthorization文字列を生成することができます。
※ 参考事項
NHN Cloud組織IDは、[全体管理 → 契約サービス管理 → 組織情報] で確認できます。
// 顧客チケットリスト
String URL = "http://nhn-cs.oc.nhncloud.com/APISimple/openapi/v1/ticket/enduser/usercode/list.json?categoryId=1&language=ko";
String organizationId = "WopqM8euoYw89B7i"; // 組織ID
String securityKey = "431402c0eaaf46d889f243db9e7492e2"; // サービス Key
String uri = "/APISimple/openapi/v1/ticket/enduser/usercode/list.json"; // request uri
long timestamp = new Date().getTime();
StringBuilder sb = new StringBuilder();
sb.append(organizationId);
sb.append(uri);
sb.append("1").append("&").append("ko"); // パラメーター名のアルファベット順に従って、"&" 記号でパラメーター値を接続してください (categoryId=1&language=ko) → (1&ko)
sb.append(timestamp);// X-TC-Timestamp値と同一
SecretKeySpec signingKey = new SecretKeySpec(securityKey.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance(signingKey.getAlgorithm());
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(sb.toString().getBytes("UTF-8"));
String authorization = new String(Base64.encodeBase64(rawHmac));
Request request = new Request.Builder().url(URL).get()
.header("Content-Type", "application/json")
.header("Authorization", authorization)
.header("X-TC-Timestamp", Long.toString(timestamp))
.build();
Call call = client.newCall(request);
Response response = call.execute();
// チケット作成
String URL = "http://nhn-cs.oc.nhncloud.com/APISimple/openapi/v1/ticket.json?language=ko";
String organizationId = "WopqM8euoYw89B7i"; // 組織ID
String securityKey = "431402c0eaaf46d889f243db9e7492e2"; // サービス Key
String uri = "/APISimple/openapi/v1/ticket.json"; // request uri
long timestamp = new Date().getTime();
StringBuilder sb = new StringBuilder();
String body = mapper.writeValueAsString(bodyContentObject);
sb.append(organizationId);
sb.append(uri);
sb.append("ko").append("&"); // パラメーター名のアルファベット順に従って、"&" 記号でパラメーター値を接続してください。
sb.append(body);// パラメーターの後に、bodyの文字列内容を追加してください。
sb.append(timestamp);// X-TC-Timestamp値と同一
SecretKeySpec signingKey = new SecretKeySpec(securityKey.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance(signingKey.getAlgorithm());
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(sb.toString().getBytes("UTF-8"));
String authorization = new String(Base64.encodeBase64(rawHmac));
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), body);
Request request = new Request.Builder().url(URL).post(body)
.header("Content-Type", "application/json")
.header("Authorization", authorization)
.header("X-TC-Timestamp", Long.toString(timestamp))
.header("OC-Client-IP", ip)
.build();
Call call = client.newCall(request);
Response response = call.execute();
String URL = "http://nhn-cs.oc.nhncloud.com/APISimple/openapi/v1/ticket/attachments/upload.json";
String organizationId = "WopqM8euoYw89B7i"; // 組織ID
String securityKey = "431402c0eaaf46d889f243db9e7492e2"; // サービス Key
String uri = "/APISimple/openapi/v1/ticket/attachments/upload.json"; // request uri
long timestamp = new Date().getTime();
StringBuilder sb = new StringBuilder();
sb.append(organizationId);
sb.append(uri);
DigestUtils.appendMd5DigestAsHex(file.getInputStream(), sb);// ファイルを添付する際、ファイルのMD5はパラメーター値として認証文字列に追加してください。
sb.append(timestamp);// X-TC-Timestamp値と同一
SecretKeySpec signingKey = new SecretKeySpec(securityKey.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance(signingKey.getAlgorithm());
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(sb.toString().getBytes("UTF-8"));
String authorization = new String(Base64.encodeBase64(rawHmac));
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getOriginalFilename(),
RequestBody.create(MediaType.parse(file.getContentType()), file.getBytes())).build();
Request request = new Request.Builder().url(ticketUploadUrl).post(body)
.header("Content-Type", "application/json")
.header("Authorization", signString)
.header("X-TC-Timestamp", Long.toString(timestamp))
.build();
Call call = client.newCall(request);
Response response = call.execute();
// Generate authorization string sample with request
StringBuilder sb = new StringBuilder();
sb.append(org.getId()); // organization Id
sb.append(request.getRequestURI()); // request URI
// upload file
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest mpRequest = (MultipartHttpServletRequest) request;
MultipartFile file = mpRequest.getFile("file");
DigestUtils.appendMd5DigestAsHex(file.getInputStream(), sb);
// other
} else {
Map<String, String[]> params = request.getParameterMap();
if (!params.isEmpty()) {
// Sort parameter
Map<String, String[]> treeMap = new TreeMap<>(params);
for (Map.Entry<String, String[]> entry : treeMap.entrySet()) {
sb.append(entry.getValue()[0]).append("&");
}
sb.deleteCharAt(sb.length() - 1); // Delete '&' character
}
if (request instanceof BodyReaderHttpServletRequestWrapper) {
BodyReaderHttpServletRequestWrapper requestWrapper = (BodyReaderHttpServletRequestWrapper) request;
if (requestWrapper.hasBody()) {
String body = new String(requestWrapper.getBody(), StandardCharsets.UTF_8);
if (!params.isEmpty()) {
// params is not empty, add '&' character
sb.append("&");
}
sb.append(body);
}
}
}
String time = request.getHeader("X-TC-Timestamp");
// No '&' character
sb.append(time);
return sb.toString();
//成功: 詳細
{
"header": {
"resultCode": 200,
"resultMessage": "",
"isSuccessful": true
},
"result": {
"content": {
}
}
}
//成功: リスト
{
"header": {
"resultCode": 200,
"resultMessage": "",
"isSuccessful": true
},
"result": {
"contents": [{
}]
}
}
//失敗
{
"header": {
"resultCode": 403,
"resultMessage": "Access Denied",
"isSuccessful": false
},
"result": null
}
名称 | 変数 | データタイプ | 説明 |
---|---|---|---|
Header | resultCode | Integer | リターン結果コード、頂上は200 |
resultMessage | String | リターン エラーメッセージ | |
isSuccessful | Boolean | 実行結果(成功: true、失敗: false) | |
Result | contents | JSON | 目録結果内容 |
content | JSON | 詳細結果内容 |
環境 | BaseUrl |
---|---|
alpha | https://{domain}.oc.alpha-nhncloud.com |
real | https://{domain}.oc.nhncloud.com |
Security Key | URL |
---|---|
サービスのSecurity Key | /{serviceId}/openapi/v1/* |
認証なしで直接使用可能 | /{serviceId}/api/v2/* |
グループ | 名称 | 類型 | URL | 説明 |
---|---|---|---|---|
サービス | サービス詳細 | GET | /{serviceId}/api/v2/service.json | サービスIDでサービス情報照会 |
お知らせ | テーマリスト | GET | /{serviceId}/api/v2/notice/categories.json | お知らせテーマリスト取得 |
タグリスト | GET | /{serviceId}/api/v2/notice/tags.json | お知らせタグリスト取得 | |
お知らせリスト | GET | /{serviceId}/api/v2/notice/list.json | ヘルプセンターお知らせリスト | |
お知らせ詳細 | GET | /{serviceId}/api/v2/notice/detail/{id}.json | お知らせIDでお知らせ内容を取得 | |
お知らせ添付ファイルを開く/ダウンロード | GET | /{serviceId}/api/v2/notice/attachments/{id} | お知らせ添付ファイルを開く/ダウンロード | |
FAQ | カテゴリーリスト | GET | /{serviceId}/api/v2/helpdoc/categories.json | FAQカテゴリーリスト取得 |
FAQリスト | GET | /{serviceId}/api/v2/helpdoc/list.json | ヘルプセンターFAQリスト | |
FAQ詳細 | GET | /{serviceId}/api/v2/helpdoc/detail/{id}.json | FAQ IDによりFAQ内容を取得 | |
FAQ添付ファイルを開く/ダウンロード | GET | /{serviceId}/api/v2/helpdoc/attachments/{id} | FAQ添付ファイルを開く/ダウンロード | |
お問合せ | 受付タイプリスト | GET | /{serviceId}/api/v2/ticket/categories.json | サービス内の受付タイプリスト照会 |
受付タイプフィールドリスト | GET | /{serviceId}/api/v2/ticket/field/user/{categoryId}.json | 受付タイプで対応するフィールドリストを確認 | |
チケット添付ファイルアップロード | POST | /{serviceId}/openapi/v1/ticket/attachments/upload.json | サーバーにファイルアップロード | |
チケット作成 | POST | /{serviceId}/openapi/v1/ticket.json | 新規チケットの作成 | |
お問合せ履歴 | 顧客チケットリスト | GET | /{serviceId}/openapi/v1/ticket/enduser/{usercode}/list.json | 検索条件により、条件に合った顧客のチケットリストを露出 |
チケット詳細 | GET | /{serviceId}/openapi/v1/ticket/enduser/{usercode}/{ticketId}/detail.json | 顧客が受け付けたチケット詳細照会 | |
チケット添付ファイルを開く/ダウンロード | GET | /{serviceId}/api/v2/ticket/attachments/{id} | チケット添付ファイルを開く/ダウンロード | |
顧客再問合せ | POST | {serviceId}/openapi/v1/ticket/enduser/{usercode}/{ticketId}/comment.json | チケットIDを基準に再お問い合わせ |