One-Time Password(OTP) API¶
One-Time Password(OTP)認証システムは、ゲームにOTP認証を適用できるように、OTP送信とOTP検証で構成されたAPIを提供します。
URL¶
| サーバー | URL |
|---|---|
| プロダクション | https://otp.qpyou.cn |
| サンドボックス | https://sandbox-otp.qpyou.cn |
認証方法¶
OTP送信システムが提供するAPIを使用するには、まず認証トークン(API KEY)の発行を受ける必要があります。認証トークンは、App Centerにゲームが登録されると自動的に生成されます。認証トークンはJSON Web Token(JWT)仕様に従い、有効期限がないため固定で使用できます。
OTPを送信¶
OTP Short Message Service(SMS) 送信¶
- 基本情報
| メソッド | POST |
|---|---|
| URL | /otp/send |
- リクエストヘッダー
| フィールド | タイプ |
|---|---|
| コンテンツタイプ | application/json |
| 認証 | bearer |
| トピック | Hive Console > Notification > SMS OTP > 送信情報設定で登録または修正した送信ID |
-
OTP SMSを直接送信する際にコールバックが必要です
OTPでOTP SMSを直接送信するのではなく、アプリ開発会社が直接送信する場合は、送信に必要な情報をコールバックで受け取れます。Hive Console > Notification > SMS OTP > 送信情報設定で直接送信を選択すると、登録したコールバックURLに以下のデータがRequest BodyにJSON形式で渡されます。設定方法は直接送信を参照してください。コールバックリクエストの例と送信されるデータもあわせて確認してください。
-
リクエストボディ
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| to | 文字列 | O | 受信者の電話番号 |
| toCountryNo | 文字列 | O | 受信者の国コード |
| retry | ブール | X | このフィールドは、同じ受信者に対してこのAPIを使用してOTP SMSを送信する試行の存在を示します。このフィールドが空白のままにされている場合、過去5分間に同じ受信者に対してこのAPIが2回以上呼び出された場合はtrueに設定され、そうでない場合はfalseに設定されます。 |
| lookup | ブール | X | このフィールドは、toが電話番号の有効な形式であるかどうかを確認するかどうかを示し、デフォルト値はfalseです。trueの場合、APIの応答時間は検証プロセスのために約250ms〜2000msになりますが、falseの場合は通常200ms以内です。 |
| lang | 文字列 | X | これは言語コードで、デフォルト値はenです。有効な言語コード:
|
- レスポンスヘッダー
| フィールド | タイプ |
|---|---|
| コンテンツタイプ | application/json |
- レスポンスボディ
| フィールド | タイプ | 説明 |
|---|---|---|
| otp | 文字列 | OTP番号 |
| provider | 文字列 | SMSプロバイダー |
| expiry | 文字列 | OTPの有効期限 |
| expiryTimestamp | Long | OTP有効時間のタイムスタンプ(秒単位) |
- リクエストサンプル
次の例は、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
}'
- レスポンスサンプル
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 | 文字列 | はい | OTPの有効期限 (例: 2024-06-25T11:39:43.076573600+09:00[Asia/Seoul]) |
| expiryTimestamp | Long | O | OTP有効時間のタイムスタンプ(ミリ秒単位) (例: 1719283183076) |
| lang | 文字列 | いいえ | 言語コード、デフォルトはen |
| lookup | ブール値 | いいえ | to値が有効な電話番号形式かどうかを確認、デフォルトはfalse |
| otp | 文字列 | はい | OTP番号 |
| provider | 文字列 | はい | SMSプロバイダー、直接送信には固定値DIRECTSENDが使用されます |
| retry | ブール値 | いいえ | 再試行オプション |
| serviceName | 文字列 | はい | 送信情報設定メニューに設定されたサービス名 (英語) |
| to | 文字列 | はい | 受取人の電話番号 |
| toCountryNo | 文字列 | はい | 受取人の国コード |
エラーレスポンスコード¶
| 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値がHive Consoleに登録した送信IDと一致しない場合、このエラーが発生します。Topicヘッダー値とHive Console > Notification > SMS OTP > 送信情報設定に登録した送信IDを確認してください。
同じOTPが重複して生成された場合¶
同じリクエストを同じ区間内で2回送信すると、同じOTPが生成されます。このとき、1回目のリクエストは成功し、2回目のリクエストはDUPLICATE_OTP_EXISTSで失敗します。現在の区間が終了した後、次の区間で同じリクエストを再送信してください。
{
"id" : 40902,
"error" : "DUPLICATE_OTP_EXISTS",
"reason" : "Already sent OTP to this phone number."
}
24時間送信上限を超過した場合¶
同じ電話番号に対して24時間の間に許可された送信回数を超えると、このエラーが発生します。この上限は固定値ではありません。以下の例のレスポンスメッセージに含まれる回数は、設定した上限値を示す例です。Hive Console > Notification > SMS OTP > 送信情報設定で1日の送信上限を確認してください。
{
"id" : 42903,
"error" : "SMS_LIMIT_EXCEEDED",
"reason" : "Too many requests in 24 hours. (Can not exceed 10 times)"
}
OTPを確認する¶
| メソッド | POST |
|---|---|
| URL | /otp/verify |
- リクエストヘッダー
| フィールド | タイプ |
|---|---|
| コンテンツタイプ | application/json |
| 認証 | bearer |
| トピック | Hive Console > Notification > SMS OTP > 送信情報設定で登録または修正した送信ID |
- リクエストボディ
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| toCountryNo | String | O | 受信国番号 |
| to | String | O | 受信電話番号 |
| otp | 文字列 | O | 受信したOTP |
- レスポンスヘッダー
| フィールド | タイプ |
|---|---|
| コンテンツタイプ | application/json |
- レスポンスボディ
| フィールド | 種類 | 説明 |
|---|---|---|
| result | ブール値 | OTP検証結果 |
- リクエストサンプル 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" : "01036012891",
"otp" : "123456"
}'
- レスポンスサンプル
OTPが一致した場合、レスポンス本文は次のとおりです。