[TOC]
# [短信服務使用指南 · JavaScript](#短信服務使用指南___JavaScript)
LeanCloud 短信服務支持的應用場景有以下三種:
* 用戶驗證:例如微信、陌陌等在登錄時需要向用戶發送一條包含了驗證碼的短信,再引導用戶輸入進行安全認證,以及修改密碼等數據安全相關的操作。
* 操作驗證:例如銀行金融類應用,用戶在對賬戶資金進行敏感操作(例如轉賬、消費等)時,需要通過驗證碼來驗證是否為用戶本人操作。
* 通知公告:例如淘寶某賣家在發貨之后會用短信的方式將快遞單、訂單號、發貨時間等發給買家,以達到良好的購買體驗。
開發者在設置短信內容的時候,文字表述上應該做到規范、正確、簡潔。我國相關法律嚴令禁止發送內容涉及以下情況的短信:
* 政治敏感
* 極端言論
* 淫穢色情
* 傳銷詐騙
* 封建迷信
* 造謠誹謗
* 我國現行法律、行政法規及政策所禁止的內容
因此 LeanCloud 需要審核短信內容,并且保留對發送人追究相關法律責任的權力。
## [短信服務配置](#短信服務配置)
從應用級別來控制能否發送短信,進入?[控制臺 > 設置 >?安全中心](https://leancloud.cn/app.html?appid=csXFgnEzBkodigdDUARBrEse-gzGzoHsz#/security),設置?短信發送?開關。
然后點擊?[應用選項](https://leancloud.cn/app.html?appid=csXFgnEzBkodigdDUARBrEse-gzGzoHsz#/permission),查看與短信相關選項。當開啟?安全中心?>?短信發送?服務之后,以下打勾的選項會被默認開啟:
* 【?】用戶賬號 >?用戶注冊時,向注冊手機號碼發送驗證短信
開啟:調用 AVUser 注冊相關的接口時,如果傳入了手機號,系統則會自動發送驗證短信,然后開發者需要手動調用一下驗證接口,這樣?`_User`?表中的?`mobilePhoneVerified`?值才會被置為?`true`。
關閉:調用 AVUser 注冊相關的接口不會發送短信。
1
* 用戶賬號 >?未驗證手機號碼的用戶,禁止登錄
開啟:未驗證手機號的?`AVUser`?不能使用「手機號 + 密碼」以及「手機號 + 短信驗證碼」的方式登錄,但是用戶名搭配密碼的登錄方式不會失敗。
關閉:不會對登錄接口造成任何影響。
+
* 用戶賬號 >?未驗證手機號碼的用戶,允許以短信重置密碼
開啟:允許尚未驗證過手機號的?`AVUser`?通過短信驗證碼實現重置密碼的功能。
關閉:`AVUser`?必須在使用短信重置密碼之前,先行驗證手機號,也就是?`mobilePhoneVerified`?字段必須是?`true`?的前提下,才能使用短信重置密碼。
+
* 用戶賬號 >?已驗證手機號碼的用戶,允許以短信驗證碼登錄
開啟:`AVUser`?可以使用手機號搭配短信驗證碼的方式登錄。
關閉:`AVUser`?不能直接使用。
+
* 【?】其他 >?啟用通用的短信驗證碼服務(開放 requestSmsCode 和 verifySmsCode 接口)
開啟:開發者可以使用短信進行驗證功能的開發,比如,敏感的操作認證、異地登錄、付款驗證等業務相關的需求。
關閉:請求驗證發送短信以及驗證短信驗證碼都會被服務端拒絕,但是請注意,跟用戶相關的驗證與該選項無關。
+
了解以上配置項有助于開發者針對業務需求,在功能選擇上做出調整。下面,我們根據不同的需求逐一介紹短信服務的功能。
### [短信服務覆蓋的國家和地區](#短信服務覆蓋的國家和地區)
目前 LeanCloud 的短信服務覆蓋以下國家和地區:
| 大區 | 國家和地區 |
| --- | --- |
| 中國 | 中國大陸、臺灣省、香港行政區、澳門行政區 |
| 北美 | 美國、加拿大 |
| 南美 | 巴西 |
| 歐洲 | 英國、法國、德國、意大利、烏克蘭、俄羅斯、西班牙 |
| 東亞 | 韓國、日本 |
| 東南亞 | 印度、馬來西亞、新加坡、泰國、越南、印度尼西亞 |
| 大洋洲 | 澳大利亞、新西蘭 |
### [短信計費](#短信計費)
如果一個短信模板字數超過 70 個字(包括簽名的字數),那么該短信在發送時會被運營商按多條來收取費用,但接收者收到的仍是一條完整的短信。
* 小于或等于 70 個字,按一條計費。
* 大于 70 個字,按每 67 字一條計費。
狀態為「等待回執」的短信不會收費計入賬單。每條短信的收費標準請參考?[官網價格方案](https://leancloud.cn/pricing.html)。
### [短信購買](#短信購買)
短信發送采取實時扣費。如果當前賬戶沒有足夠的余額,短信將無法發送。充值請進入?[開發者賬戶 > 財務 > 財務概況](https://leancloud.cn/bill.html#/bill/general),點擊?余額充值。
同時我們建議設定好?[余額告警](https://leancloud.cn/settings.html#/setting/alert),以便在第一時間收到短信或郵件獲知余額不足。
## [驗證類](#驗證類)
用戶驗證是一個移動應用最基本的功能,傳統的「賬號和密碼登錄」在一般的應用場景下尚且可以滿足需求,但是相對于社交類、照片存儲類、金融類等應用,隨著不斷使用,用戶往往會在應用中留下較多的個人信息記錄,比如:
當微信發現用戶忽然在一臺從未授權過的新設備上登錄時,如果該用戶已經開啟了「安全驗證」,那么它會向該用戶的手機號發一條驗證短信,以驗證當前登錄是否為本人操作。微信是一個較為私密的社交應用,隨著使用時間的增加,用戶的手機號、聊天記錄都可能涉及到更為私密的信息。
開發者在開發過程中也可能會遇到與微信類似的場景和需求。
### [操作認證](#操作認證)
象在新設備上登錄微信、在新設備上進行支付寶的第一次支付認證,這種與應用內業務邏輯緊密相關的驗證操作一般都跟用戶的敏感信息相關。出于對用戶信息以及金融安全的考慮,短信驗證往往會比較可信,LeanCloud 為此提供了一系列的接口。
我們以一個購物應用為例,說明一下操作認證的大致步驟:
1. 用戶點擊支付訂單
發起敏感操作
+
2. 調用接口發送驗證短信
注意,在這一步之前,我們假設當前用戶已經設置過了手機號,所以推薦這類應用在注冊環節,盡量要求用戶以手機號作為用戶名,否則到了支付界面,還需要用戶在首次購買時輸入一次手機號。
+
~~~
AV.Cloud.requestSmsCode({
mobilePhoneNumber: '186xxxxxxxx',
name: '應用名稱',
op: '某種操作',
ttl: 10
}).then(function(){
//發送成功
}, function(err){
//發送失敗
});
~~~
* name:應用名稱,默認是你的應用在 LeanCloud 顯示的名稱。
* op:進行的操作字符串,例如付費。
* ttl:以分鐘為單位的過期時間。
3. 用戶收到短信,并且輸入了驗證碼。
在進行下一步之前,我們依然建議先進行客戶端驗證,這樣就避免了錯誤的驗證碼被服務端駁回而產生的流量,以及與服務端溝通的時間,有助于提升用戶體驗。
+
4. 調用接口驗證用戶輸入的驗證碼是否有效。
+
~~~
AV.Cloud.verifySmsCode('6位數字驗證碼', '11 位手機號碼').then(function(){
//驗證成功
}, function(err){
//驗證失敗
});
~~~
針對上述的需求,可以把場景換成異地登錄驗證、修改個人敏感信息驗證等一些常見的場景,步驟是類似的,調用的接口也是一樣的,僅僅是在做 UI 展現的時候需要開發者自己去優化驗證過程。
### [注冊驗證](#注冊驗證)
用戶注冊對所有開發者來說都是非常重要的,為了降低操作難度,越來越多的應用支持使用手機號碼來快速注冊賬戶,并且同時會通過短信驗證碼來核實用戶手機號碼的有效性。為了滿足這一需求,我們將 LeanCloud 內建的?[賬戶系統](https://leancloud.cn/docs/leanstorage_guide-js.html#用戶)與短信驗證碼相結合,推出了便捷的「注冊驗證」功能。其使用步驟如下:
1. 用戶輸入手機號以及密碼
引導用戶正確的輸入,建議在調用 SDK 接口之前,驗證一下手機號的格式。
+
2. 調用 AVUser 的注冊接口,傳入手機號以及密碼。
+
~~~
var user = new AV.User();
user.set("username", "hjiang");
user.set("password", "123456");
user.setMobilePhoneNumber('186xxxxxxxx');
user.signUp(null, ……)
~~~
3. 云端發送手機驗證碼,并且返回注冊成功。但是此時用戶的?`mobilePhoneVerified`?依然是?`false`,客戶端需要引導用戶去輸入驗證碼。
+
4. 用戶再一次輸入驗證碼
最好驗證一下是否為純數字。
+
5. 調用驗證接口,檢查用戶輸入的純數字驗證碼是否合法。
+
~~~
AV.User.verifyMobilePhone('6位數字驗證碼').then(function(){
//驗證成功
}, function(err){
//驗證失敗
});
~~~
以上是一個通用的帶有手機號驗證的注冊過程。開發者可以根據需求增加或減少步驟,但是推薦開發者在使用該功能時,首先明確是否需要勾選「驗證注冊用戶手機號碼」。因為一旦勾選,只要調用了 AVUser 相關的注冊賬號,并傳入手機號,云端就會自動發送短信驗證碼。
注意:只有使用了 LeanCloud 內建賬戶系統的應用才能使用這一功能。
另外,假如注冊的時候并沒有強制用戶驗證手機號,而是在用戶使用某一個功能的時候,要求用戶驗證手機號,也可以調用接口進行「延遲驗證」,驗證之后?`mobilePhoneVerified`?就會被置為?`true`。
2
1. 請求發送驗證碼
+
~~~
AV.User.requestMobilePhoneVerify('186xxxxxxxx').then(function(){
//發送成功
}, function(err){
//發送失敗
});
~~~
2. 調用驗證接口,驗證用戶輸入的純數字的驗證碼。
+
~~~
AV.User.verifyMobilePhone('6位數字驗證碼').then(function(){
//驗證成功
}, function(err){
//驗證失敗
});
~~~
#### [未收到注冊驗證短信](#未收到注冊驗證短信)
一般來說,用戶收到的注冊驗證短信內容為:
【AppName】歡迎使用 AppName 服務,您的驗證碼是 123456,請輸入完成驗證。
其中【AppName】為短信簽名,必須遵循?[短信簽名規范](#短信簽名)?中的長度及其他要求,否則會被短信供應商拒絕發送。
## [通知類](#通知類)
通知類短信非常普遍,例如聯通用戶從外地進入上海可能會收到如下短信:
尊敬的用戶:歡迎您來到上海,如需幫助請撥打客服熱線10010或登錄www.10010.com,優惠訂購機票酒店請撥打116114。中國聯通
這是一個來自通信運營商的通知類短信的規范案例。
在實際使用的過程中,通知類短信往往會因為措辭不當而被短信服務商拒絕發送;甚至還會出現 開發者發送過去的請求被服務商直接屏蔽的情況。因此,LeanCloud 在發送推廣類的短信時需要進行內容審核。
## [營銷類](#營銷類)
營銷類短信是應用開發者與潛在客戶溝通、進行產品推廣和銷售的有效手段。營銷類短信也是基于模板來實現的,因此使用時跟?[通知類](#通知類)?使用沒有任何本質區別,步驟依次是?[創建模板](#創建模板)?>?[使用模板](#使用模板)。
營銷類短信默認會在短信最后加上「回復TD退訂」,這是運營商的強制要求。
自 2016 年 6 月起,營銷類短信不允許由個人用戶發送。所有營銷類短信必須提供有效的公司或者企業名稱,缺失名稱將導致營銷類短信無法發送。偽造或使用虛假名稱將會被追究法律責任。
## [自定義短信內容](#自定義短信內容)
通過短信模板,我們可以自定義短信的內容。因為短信模板是由開發者自己定義的,因此為了確保平臺的安全以及穩定,我們的短信模板由專人進行審核,只有通過審核之后,在接口里的調用才會成功發送。
### [創建模板](#創建模板)
創建模板的截圖如下:

創建模板需要選擇指定一個已經通過審核的?[短信簽名](#短信簽名),并且選擇模板的類型,目前支持以下三種類型:
* 通知類型
* 驗證碼類型
* 營銷類型
要創建短信模板,先進入控制臺,選擇一個應用,再選擇?[消息 > 短信 > 設置](http://leancloud.cn/messaging.html?appid=csXFgnEzBkodigdDUARBrEse-gzGzoHsz#/message/sms/conf)。模板類型如果選擇了通知類或者驗證類,但短信內容如果涉及營銷內容則無法通過審核。要發送營銷類短信請閱讀?[營銷類](#營銷類)。
### [使用模板](#使用模板)
假設提交的短信模板名稱為?`Notice_Welcome`,當模板通過審批后就可以調用了:
~~~
AV.Cloud.requestSmsCode({
mobilePhoneNumber: '186xxxxxxxx',
template: 'Notice_Welcome',
service_name: '月度周刊',
order_id: '7623432424540'
}).then(function(){
//發送成功
}, function(err){
//發送失敗
});
~~~
### [模板變量](#模板變量)
模板可以使用自定義變量,如上例中的?`{{service_name}}`?和?`{{order_id}}`,在調用模板時以參數形式傳入。模板語法遵循?[Handlebars](http://handlebarsjs.com/)?規范。
自定義變量的值不允許包含實心括號?`【】`?。
模板還可以使用系統預留變量,在發送短信發送時,它們會被自動填充:
歡迎注冊{{name}}應用!請使用驗證碼 {{code}} 來完成注冊。該驗證碼將在{{ttl}}分鐘后失效,請盡快使用。
* `name`:應用名稱
* `code`:驗證碼
* `ttl`:過期時間(默認為 10 分鐘)
## [模板規范](#模板規范)
鑒于開發者的應用場景各異,我們整理了以下范例來說明如何撰寫規范的短信模板。需要再次強調,一切跟營銷推廣相關的短信模板,請在創建模板時務必選擇營銷類,否則將無法通過審核。
【正確范例】
XX房東您好,租客{{guest_name}}(手機號碼:{{guest_phone}})于{{payment_create_time}}向您支付了房租。租金為{{rent_price}}元,房屋地址在{{rent_addr}}。請關注微信公眾號:XX租房。XX租房APP下載地址:[http://example.com/download.html](http://example.com/download.html)
### [短信簽名](#短信簽名)
短信簽名是指短信內容里用【】括起來的短信發送方名稱,根據運營商的規定,它必須出現在短信內容的開頭或結尾。你需要在?[控制臺 > 消息 > 短信 > 設置 > 短信簽名](https://leancloud.cn/messaging.html?appid=#/message/sms/conf)?為每個應用創建合法的短信簽名。如果一個應用擁有多個短信簽名,請確保選擇其一作為默認簽名。
短信簽名缺失、或沒有默認簽名、或未通過審核且無其他可用簽名,都將導致短信無法發送。
簽名規范:
* 簽名必須是應用名稱、公司簡稱、品牌名或網站名,容易被用戶識別;長度控制在 3 到 8 個字符之間。例如簽名【應用A】中的?`應用A`?為 3 個字符。
* 不能有任何非文字字符,也不可以是變量。
* 不允許全部為英文字符或全部為數字
* 不需要帶上實心方頭括號【】
* 一個應用最多可以擁有 3 個簽名(包含審核未通過的簽名)。
### [鏈接](#鏈接)
短信中的 URL 不允許全部設置為變量,這樣是為了確保安全,防止病毒以及不良信息的傳播。錯誤范例如下:
尊敬的會員您好,您的訂單(訂單號)已確認支付。5周年慶新品降價!大牌奢品上演底價爭霸,低至2折!BV低至888元!阿瑪尼低至199元!都彭長款錢包僅售499元!杜嘉班納休閑鞋僅售1399元!周年慶家居專場千元封頂現已開啟!{{download_link}} 客服電話400-881-6609 回復TD退訂
以上通知內容包含了象?打折、降價、僅售?這類營銷推廣的敏感詞語,容易導致審批無法通過,因此請謹慎使用或改用?[營銷類短信](#營銷類)。
但是 URL 中可以包含變量,比如:
親,您的寶貝已上路,快遞信息可以通過以下鏈接查詢:[http://www.sf-express.com/cn/#search/{{bill_number}}](http://www.sf-express.com/cn/#search/{{bill_number}})
### [通知類模板](#通知類模板)
【正確范例】
恭喜您獲得關注廣州體彩微信送“排列三”的活動彩票,您的號碼是第{{phase}}期的:{{num}}。開獎時間為{{date}},請關注公眾號—開獎信息查詢中獎狀態。
〖錯誤范例〗
您好,本條短信來自“XX旅游”~恭喜幸運的您,在本次“北海道機票”抽獎活動中,獲得二等獎——定制星巴克杯! 請您關注我們的微信公眾號(XX旅游:xx_app),回復“中獎名單”即可查看詳細中獎名單及領取須知!后續還會有更多活動驚喜,期待您的參與~官方網站:xxsite.cn
錯誤點在于不可以在?[通知類](#通知類)?模板中發送帶有抽獎中獎信息等營銷信息的內容。解決方案是在創建模板的時候選擇?[營銷類短信](#營銷類)。
另外,有一些行業相關的敏感詞語是不允許發送的,錯誤范例如下:
業主還在苦苦等待你的反饋,你認領的房源已超過1小時沒有填寫核實結果,請盡快登錄XX客戶端,在“業主--待處理”列表中進行填寫。【XX網】
無論是通知類還是營銷類短信,凡包含房源、借貸這類敏感詞都被禁止發送。
### [營銷類模板](#營銷類模板)
#### [銷售類](#銷售類)
【正確范例】
X牌新款春裝已經上市,明星夫妻同款你值得擁有!詳情請咨詢當地X牌門市店,或者直接登錄 www.xxxx.com 查詢門市店,或者撥打 010-00000000,憑短信可享 9 折優惠。
#### [應用推廣類](#應用推廣類)
【正確范例】
還在找尋同桌的 TA 嗎?還在煩惱過年回家聯系不上老同學嗎?iOS 用戶在 App Store 搜索:找同學,下載最新版的找同學,讓同學聚會重溫往日時光!
注意:應用的下載鏈接必須是明文,不可設置為參數。
## [常見問題](#常見問題)
詳情請參照?[短信收發常見問題一覽](https://leancloud.cn/docs/rest_sms_api.html#常見問題_FAQ)。