Labspace SMS

簡訊驗證碼(OTP)怎麼發?

OTP 簡訊 API 串接流程、文案範本與 7 個注意事項

發布 2026/10/27閱讀約 7 分鐘

一句話:驗證碼由你的後端產生與比對,簡訊平台只負責「送到手機」。串接只要一支 API;真正要花心思的是文案控制在一則內、重送換新碼、以及防止被盜刷。以下依流程說明,最後附常見問題。

1. OTP 簡訊的完整流程

  1. 1

    產生驗證碼

    後端用安全亂數產生 6 位數字,存「雜湊值+到期時間(例如 5 分鐘)+嘗試次數」,不要存明碼。

  2. 2

    呼叫簡訊 API

    POST /api/v2/send,dstaddr 帶手機號碼、smbody 帶簡訊內容。回應 result=1 代表平台已受理並送出。

  3. 3

    使用者輸入

    前端只送「手機號碼+使用者輸入的碼」回後端,驗證碼本身永遠不經過前端。

  4. 4

    比對與失效

    比對雜湊、檢查是否過期;驗證成功或錯誤超過次數(例如 5 次)就讓這組碼失效。

第 2 步的請求長這樣(API Key 在會員中心「API Key」頁建立,完整欄位見 API 文件):

curl -X POST https://sms-api.labspace.com.tw/api/v2/send \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "dstaddr": "0912345678",
    "smbody": "【貴公司名稱】您的驗證碼為 482913,5 分鐘內有效,請勿將驗證碼提供給任何人。"
  }'

第一次串接的完整步驟(建立 API Key、讀回應、錯誤處理)見簡訊 API 串接教學。

2. 驗證碼簡訊文案範本

【貴公司名稱】您的驗證碼為 482913,5 分鐘內有效,請勿將驗證碼提供給任何人。
【貴公司名稱】登入驗證碼 482913,10 分鐘內有效。若非本人操作請忽略此簡訊。
【貴公司名稱】您正在變更密碼,驗證碼 482913(5 分鐘內有效)。客服不會向您索取驗證碼。

三則都在 70 字內(約 40 字),一次發送就是 1 則。寫法重點:品牌放開頭、驗證碼放前面、寫明有效時間、提醒不要外流。「客服不會向您索取驗證碼」這句對防詐騙特別有用。

3. 7 個注意事項

控制在一則內

含中文的簡訊 70 字內算 1 則,超過變 2 則、費用加倍。驗證碼簡訊只需要「品牌+驗證碼+有效時間+勿外流提醒」,40 字左右就夠。

重送要產生新碼

同一門號+同一內容在短時間內(預設 10 分鐘)透過 API 重複送出,平台會視為重複發送而不重發、不扣點(回應 data.duplicate=true)。使用者按「重新發送」時請產生新的驗證碼,內容不同就會正常送出,也比重送舊碼安全。

不要放網址

純文字驗證碼(無網址、無短網址、無電話號碼)不在 NCC 網域白名單規範內;放了網址就要先申請網域白名單,還可能讓一則變兩則。

開頭品牌標示要與登記名稱相符

依電信業者實名制規範,簡訊開頭的【品牌】需與發送方登記的公司名稱相符,否則可能被攔截。要用其他品牌名義發送,可在會員中心「實名 tag」線上申請。

自己做發送頻率限制(防盜刷)

OTP 是簡訊盜刷(SMS pumping)最常被濫用的入口:有人用腳本對大量號碼觸發驗證碼,帳單由你付。建議每個號碼 60 秒內只能要求一次、每個 IP/每個號碼每天設上限,並搭配機器人驗證。

撞到速率上限要等,不要整批重送

API 每個來源 IP 每分鐘上限 60 次請求,超過回 HTTP 429(code=RATE_LIMITED、retry_after 秒數)。收到 429 請依 Retry-After 等待,已送成功的號碼不要重送。

海外號碼要帶國碼

台灣門號可用 09 開頭;海外用戶要帶國碼(例如 8613…、1415…),否則無法送達。國際簡訊依國家計費,「送出成功」不等於已送達手機,關鍵流程要搭配送達狀態查詢。

4. OTP 簡訊費用

台灣國內每則 NT$0.8~1.0(依月發送量),驗證碼簡訊通常一則就夠。舉例:每月 3,000 次登入驗證,約 NT$3,000。沒送出的(號碼格式錯誤、無效號碼、拒收名單)不扣點;已送出後對方關機或空號仍會計費。則數規則與試算見簡訊費用怎麼算。

5. 常見問題

簡訊驗證碼一則多少錢?

台灣國內簡訊每則 NT$0.8~1.0,依月發送量分級(1~10,000 則每則 NT$1.0、10,001~50,000 則 NT$0.9、50,001~100,000 則 NT$0.8)。驗證碼簡訊通常 70 字內,一次就是一則。採點數預儲值,無月租費、點數無使用期限。

驗證碼簡訊沒收到,會扣點嗎?

簡訊沒送出(例如號碼格式錯誤、號碼無效、在拒收名單內)不扣點。簡訊已經送出、但對方關機、門號停用或是空號,仍會計費。所以送出前先檢查號碼格式,能省下不少無效發送。

使用者按「重新發送」,我重送同一組驗證碼卻沒收到?

同一門號+同一內容在短時間內(預設 10 分鐘)透過 API 重複送出,平台會判定為重複發送,不重發也不扣點,回應會帶 data.duplicate=true。請在重新發送時產生新的驗證碼;內容不同就會正常送出。

驗證碼簡訊要申請網域白名單嗎?

不用。純文字驗證碼(沒有網址、短網址、電話號碼)不在 NCC 網域白名單規範內,可以直接發送。但簡訊開頭的【品牌】標示仍需與發送方登記名稱相符。

驗證碼要幾位數、多久過期比較好?

常見做法是 6 位數字、5~10 分鐘有效,錯誤 5 次即失效。位數太少容易被猜中,效期太長則增加外流風險;另外要限制同一號碼的重新發送頻率,避免被盜刷。