One-Time Password(OTP) API¶
One-Time Password(OTP) 인증 시스템은 게임에 OTP 인증을 적용할 수 있도록 OTP 발송과 OTP 검증으로 구성된 API를 제공합니다.
환경별 접근 URL¶
| 서버 | URL |
|---|---|
| Production | https://otp.qpyou.cn |
| Sandbox | https://sandbox-otp.qpyou.cn |
인증 방식¶
OTP 발송 시스템이 제공하는 API를 사용하려면 먼저 인증 토큰(API KEY)을 발급받아야 합니다. 인증 토큰은 앱 센터에 게임이 등록되면 자동으로 생성됩니다. 인증 토큰은 JSON Web Token(JWT) 명세를 따르며, 만료 시간이 없어 고정적으로 사용할 수 있습니다.
OTP 발송¶
OTP Short Message Service(SMS) 발송¶
- Basic Info
| Method | POST |
|---|---|
| URL | /otp/send |
- Request Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
| Authorization | bearer |
| Topic | 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 등록 또는 수정한 발송 ID |
-
OTP SMS를 앱 개발사가 직접 발송 시 콜백
OTP에서 OTP SMS를 직접 발송하는 것이 아니라 앱 개발사가 직접 발송하는 경우, 발송에 필요한 정보를 콜백으로 받을 수 있습니다. 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 직접 발송을 선택하면, 등록한 콜백 URL로 아래 데이터가 Request Body에 JSON 형태로 전달됩니다. 설정 방법은 직접 발송을 참고하세요. 콜백 요청 예시와 전달하는 데이터를 함께 확인하세요.
-
Request Body
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| to | String | O | 수신 전화번호 |
| toCountryNo | String | O | 수신 국가 코드 |
| retry | Boolean | X | 이 API를 사용해 동일한 수신자에게 OTP SMS를 보내려고 시도한 이력이 있는지 여부입니다. 값이 주어지지 않으면, 최근 5분 이내에 동일한 수신자에게 OTP SMS를 전송 시도한 이력이 있을 때 true, 그렇지 않으면 false로 설정됩니다. |
| lookup | Boolean | X | to 값이 유효한 전화번호 형식인지 검증할지 여부로 기본값은 false입니다. true일 때는 검증을 수행하므로 API 응답에 대략 250ms ~ 2000ms 정도 소요되며, false일 때에는 보통 200ms 이내로 API 응답을 받습니다. |
| lang | String | X | 언어 코드로 기본값은 en. 유효한 언어 코드
|
- Response Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
- Response Body
| 필드 | 타입 | 설명 |
|---|---|---|
| otp | String | OTP 번호 |
| provider | String | SMS 제공자 |
| expiry | String | OTP 유효 시간 |
| expiryTimestamp | Long | OTP 유효 시간 타임스탬프(초 단위) |
- Request Sample
다음 예시는 Topic 헤더와 수신자 정보를 포함해 OTP SMS 발송 API를 호출할 때 사용합니다.
//sample 1
curl --location 'https://otp.qpyou.cn/otp/send'
--header 'Authorization: Bearer AUTH_TOKNE_VALUE'
--header 'Topic: testTopicName'
--header 'Content-Type: application/json'
--data '{
"to" : "01012345678",
"toCountryNo" : "82",
"lang" : "ko"
}'
//sample 2
curl --location 'https://otp.qpyou.cn/otp/send'
--header 'Authorization: Bearer AUTH_TOKNE_VALUE'
--header 'Topic: testTopicName'
--header 'Content-Type: application/json'
--data '{
"to" : "01012345678",
"toCountryNo" : "82",
"lang" : "ko",
"retry" : true,
"lookup" : true
}'
- Response Sample
OTP SMS 발송 요청이 정상 처리되면 다음과 같은 응답 본문을 받습니다.
{
"otp" : "123456",
"provider" : "YOUR_SMS_PROVIDER",
"expiry" : "2026-03-23T11:00:48.533695818+09:00",
"expiryTimestamp" : 1774231248
}
콜백 예시¶
앱 개발사가 직접 발송하도록 설정한 경우 등록한 콜백 URL은 다음과 같은 요청 본문을 받습니다.
curl --location 'https://{your_callback_url}'
--header 'Content-Type: application/json'
--data '{
"to":"01012345678",
"toCountryNo":"82",
"lang":"en",
"retry":null,
"lookup":false,
"serviceName":"LocalTest",
"otp":"809881",
"provider":"DIRECTSEND",
"expiry":"2024-06-26T11:36:29.680680500+09:00[Asia/Seoul]",
"expiryTimestamp":1719369389680
}'
콜백 데이터 정보¶
| 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| expiry | String | O | OTP 유효 시간 (예시: 2024-06-25T11:39:43.076573600+09:00[Asia/Seoul]) |
| expiryTimestamp | Long | O | OTP 유효 시간 타임스탬프(밀리초 단위) (예시: 1719283183076) |
| lang | String | X | 언어 코드로 기본값은 en |
| lookup | boolean | X | to 값이 유효한 전화번호 형식인지 검증. 기본값은 false |
| otp | String | O | OTP 번호 |
| provider | String | O | SMS 제공자, 직접 발송이므로 DIRECTSEND 고정값으로 전달됨 |
| retry | boolean | X | 재시도 여부 |
| serviceName | String | O | 발송 정보 설정 메뉴에서 설정한 발송 서비스 명(영문) |
| to | String | O | 수신 전화번호 |
| toCountryNo | String | O | 수신 국가 코드 |
오류 응답 코드¶
| HTTP Status | id | error | 설명 |
|---|---|---|---|
| 400 | 40004 | VALIDATION_FAIL | 요청 본문 유효성 검증에 실패하면 발생합니다. |
| 400 | 40003 | INVALID_PHONE_NUMBER | 전화번호 유효성 검증에 실패하면 발생합니다. |
| 422 | 42202 | NO_TOPIC | 헤더의 Topic에 전달한 값이 유효하지 않으면 발생합니다. |
| 409 | 40902 | DUPLICATE_OTP_EXISTS | 동일한 인증 대상에 대해 일정 시간 내 중복 OTP 발급 요청이 감지되면 DUPLICATE_OTP_EXISTS 오류를 반환합니다. 최대 15초 후 다시 시도해 주세요. |
| 429 | 42903 | SMS_LIMIT_EXCEEDED | 동일한 번호로 24시간 동안 설정한 발송 한도를 초과해 요청하면 발생합니다. 응답 메시지에는 설정된 한도 값이 포함될 수 있습니다. |
Topic 값이 유효하지 않은 경우¶
요청 헤더의 Topic 값이 하이브 콘솔에 등록한 발송 ID와 일치하지 않으면 이 오류가 발생합니다. Topic 헤더 값과 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에 등록한 발송 ID를 확인하세요.
동일한 OTP가 중복 생성된 경우¶
같은 요청을 같은 구간 안에서 두 번 보내면 동일한 OTP가 생성됩니다. 이때 첫 번째 요청은 성공하고 두 번째 요청은 DUPLICATE_OTP_EXISTS로 실패합니다. 현재 구간이 끝난 뒤 다음 구간에서 같은 요청을 다시 보내세요.
{
"id" : 40902,
"error" : "DUPLICATE_OTP_EXISTS",
"reason" : "Already sent OTP to this phone number."
}
24시간 발송 한도를 초과한 경우¶
같은 전화번호로 24시간 동안 허용된 발송 횟수를 넘기면 이 오류가 발생합니다. 이 한도는 고정값이 아닙니다. 아래 예시의 응답 메시지에 포함된 횟수는 설정한 한도 값을 보여주는 예시입니다. 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 일일 발송 한도를 확인하세요.
{
"id" : 42903,
"error" : "SMS_LIMIT_EXCEEDED",
"reason" : "Too many requests in 24 hours. (Can not exceed 10 times)"
}
OTP 검증¶
| Method | POST |
|---|---|
| URL | /otp/verify |
- Request Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
| Authorization | bearer |
| Topic | 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 등록 또는 수정한 발송 ID |
- Request Body
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| toCountryNo | String | O | 수신 국가 번호 |
| to | String | O | 수신 전화번호 |
| otp | String | O | 수신 OTP |
- Response Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
- Response Body
| 필드 | 타입 | 설명 |
|---|---|---|
| result | boolean | OTP 검증 결과 |
- Request Sample 1
다음 예시는 수신 전화번호와 OTP 번호를 전달해 OTP를 검증할 때 사용합니다.
// sample 1
curl --location 'https://otp.qpyou.cn/otp/verify'
--header 'Authorization: bearer AUTH_TOKEN_VALUE'
--header 'Topic: testTopicName'
--header 'Content-Type: application/json'
--data '{
"toCountryNo" : "82",
"to" : "01012345678",
"otp" : "123456"
}'
- Response Sample
OTP가 일치한 경우 응답 본문은 다음과 같습니다.