發(fā)送短信在小程序中是一個(gè)常見(jiàn)功能排霉,比如注冊(cè)賬號(hào)時(shí)發(fā)送驗(yàn)證碼,發(fā)送短信通知等等硬纤,這些都需要用到云短信功能。使用騰訊云的SMS來(lái)發(fā)送短信功能開(kāi)發(fā)比較簡(jiǎn)單赃磨,但申請(qǐng)流程還是比較麻煩筝家,整理下來(lái)避免大家少走彎路。
第一步邻辉,上線小程序
訪問(wèn)騰訊的SMS控制臺(tái)的快速開(kāi)始頁(yè)面
給出了短信功能的快速入門(mén)的步驟溪王,第一步是創(chuàng)建短信簽名,這一步需要使用小程序來(lái)申請(qǐng)短信簽名值骇,因此需要上線小程序莹菱,并提供小程序的相關(guān)信息才能申請(qǐng)短信簽名。上線小程序特別注意小程序的類目設(shè)置吱瘩,如果這個(gè)設(shè)置不正確道伟,審核就不能通過(guò),吐槽一下小程序?qū)徍耸鼓耄话銓徍舜蟾?天左右的時(shí)間蜜徽,而且每次都是一項(xiàng)一項(xiàng)的審核不通過(guò),不會(huì)一次把所有不通過(guò)的項(xiàng)全部列出票摇,一次解決多痛快拘鞋,因此這樣審核導(dǎo)致周期會(huì)比較長(zhǎng),我的審核了5天才成功上線矢门。第一次因?yàn)樾〕绦蚶镩_(kāi)發(fā)了一個(gè)日歷控件盆色,沒(méi)有選擇工具-》日歷灰蛙,第二次因?yàn)樾〕绦蚶镉袀€(gè)報(bào)名功能,沒(méi)有選擇工具-》預(yù)約報(bào)名隔躲,第三次因?yàn)樾〕绦蚶镉袀€(gè)旅游信息查詢缕允,沒(méi)有選擇旅游類目,第四次需要我提供一個(gè)測(cè)試賬號(hào)蹭越。因此障本,服務(wù)類目特別重要,設(shè)置方法如下响鹃,登錄你的小程序控制臺(tái)
- 選擇設(shè)置驾霜,在右邊的面板中選擇基本設(shè)置,服務(wù)類目买置,按照你的小程序的功能選擇相應(yīng)的服務(wù)類目粪糙,最多只能有5個(gè)服務(wù)類目。比如你的小程序里有旅游功能忿项,需要選擇旅游蓉冈,然后選擇子類目,還比如你的小程序里有日歷功能轩触,需要選擇工具類目里的日歷子類目寞酿,因此一定要檢查你的小程序的相關(guān)功能,來(lái)選擇正確的服務(wù)類目脱柱。
- 提供一個(gè)測(cè)試賬號(hào)和密碼伐弹,審核人員會(huì)運(yùn)行你的小程序來(lái)進(jìn)行審核。
-
如果有審核不明白的地方榨为,可以在線人工服務(wù)惨好,響應(yīng)也比較及時(shí)。
創(chuàng)建短信簽名
小程序上線完成后随闺,就可以使用小程序的設(shè)置來(lái)申請(qǐng)短信簽名日川,如下圖,需要提供小程序的截圖矩乐,也就是小程序的控制臺(tái)的基本設(shè)置頁(yè)面的截圖龄句。簽名內(nèi)容是小程序的全程或者簡(jiǎn)稱,這個(gè)內(nèi)容在發(fā)送短信時(shí)需要用到绰精。
創(chuàng)建短信正文模板
短信簽名完成后撒璧,就可以創(chuàng)建正文模板,系統(tǒng)也提供了一些內(nèi)置的標(biāo)準(zhǔn)模板笨使,也可以創(chuàng)建自定義模板,如
{1}為您的登錄驗(yàn)證碼僚害,請(qǐng)于{2}分鐘內(nèi)填寫(xiě)硫椰。如非本人操作繁调,請(qǐng)忽略本短信。(其中{1}靶草、{2}為可自定義的內(nèi)容蹄胰,須從1開(kāi)始連續(xù)編號(hào),如{1}奕翔、{2}等)
其中{1}裕寨,{2}這些在發(fā)送短信時(shí)需要作為模板參數(shù)傳入。
等待審核
短信模板審核提交后派继,就只需要等待審核宾袜,這個(gè)過(guò)程很快就能完成。
發(fā)送短信
網(wǎng)上也有很多的方法來(lái)發(fā)送短信驾窟,但因?yàn)閟ms的版本也在不斷變化庆猫,因此請(qǐng)求參數(shù)也是不斷的在變化,肯定會(huì)出現(xiàn)版本兼容性的問(wèn)題绅络,因此大部分都不能正常使用月培。因此,盡量使用騰訊提供的SDK是最省事的辦法恩急,而且有sdk的版本信息杉畜。代碼片段可以參考git上的源碼。
隨著騰訊云SMS的升級(jí)衷恭,sms的sdk client應(yīng)該也會(huì)跟著升級(jí)寻行。在發(fā)送短信中,需要以下幾個(gè)關(guān)鍵配置匾荆。
SecretId和SecretKey
這兩項(xiàng)是必填項(xiàng)拌蜘,騰訊云賬戶密鑰對(duì)secretId,secretKey牙丽。獲取這兩項(xiàng)的方法是訪問(wèn)云控制平臺(tái)的CAM
這兩項(xiàng)值涉及到你的賬號(hào)安全简卧,因此需要妥善保管,防止外泄烤芦,因此采用的是從環(huán)境變量讀取的方式举娩,需要在環(huán)境變量中先設(shè)置這兩個(gè)值。
短信應(yīng)用Id
短信應(yīng)用ID构罗,訪問(wèn)短息控制臺(tái)
短信SdkAppid在 [短信控制臺(tái)] 添加應(yīng)用后生成的實(shí)際SdkAppid铜涉,如下圖。
短信簽名內(nèi)容
短信簽名內(nèi)容遂唧,使用 UTF-8 編碼芙代,必須填寫(xiě)已審核通過(guò)的簽名,簽名信息可登錄控制臺(tái)查看盖彭。
模板ID
模板 ID纹烹,必須填寫(xiě)已審核通過(guò)的模板 ID页滚。模板ID可登錄 [短信控制臺(tái)] 查看。
模板參數(shù)
模板參數(shù)铺呵,若無(wú)模板參數(shù)裹驰,則設(shè)置為空。模板參數(shù)即創(chuàng)建模板時(shí)候的{1}{2}等內(nèi)容片挂。
電話號(hào)碼
這個(gè)就不用過(guò)多描述了幻林,接受短線的電話號(hào)碼,中國(guó)大陸電話需要有+86音念。
發(fā)送短信源碼
整個(gè)短信發(fā)送的代碼片段如下沪饺,接受三個(gè)參數(shù),templateId症昏,phone随闽,templateParamSet
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
const tencentcloud = require('tencentcloud-sdk-nodejs');
cloud.init()
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
async function sendSms(phone, templateId, templateParamSet) {
const smsClient = tencentcloud.sms.v20190711.Client
console.log(process.env)
/* 實(shí)例化要請(qǐng)求產(chǎn)品(以sms為例)的client對(duì)象 */
const client = new smsClient({
credential: {
/* 必填:騰訊云賬戶密鑰對(duì)secretId,secretKey肝谭。
* 這里采用的是從環(huán)境變量讀取的方式掘宪,需要在環(huán)境變量中先設(shè)置這兩個(gè)值。
* 你也可以直接在代碼中寫(xiě)死密鑰對(duì)攘烛,但是小心不要將代碼復(fù)制魏滚、上傳或者分享給他人,
* 以免泄露密鑰對(duì)危及你的財(cái)產(chǎn)安全坟漱。
* CAM密匙查詢: https://console.cloud.tencent.com/cam/capi */
secretId: process.env.SECRETID,
secretKey: process.env.SECRETKEY,
},
/* 必填:地域信息鼠次,可以直接填寫(xiě)字符串a(chǎn)p-guangzhou,或者引用預(yù)設(shè)的常量 */
region: "ap-guangzhou",
/* 非必填:
* 客戶端配置對(duì)象芋齿,可以指定超時(shí)時(shí)間等配置 */
profile: {
/* SDK默認(rèn)用TC3-HMAC-SHA256進(jìn)行簽名腥寇,非必要請(qǐng)不要修改這個(gè)字段 */
signMethod: "HmacSHA256",
httpProfile: {
/* SDK默認(rèn)使用POST方法。
* 如果你一定要使用GET方法觅捆,可以在這里設(shè)置赦役。GET方法無(wú)法處理一些較大的請(qǐng)求 */
reqMethod: "POST",
/* SDK有默認(rèn)的超時(shí)時(shí)間,非必要請(qǐng)不要進(jìn)行調(diào)整
* 如有需要請(qǐng)?jiān)诖a中查閱以獲取最新的默認(rèn)值 */
reqTimeout: 30,
/**
* SDK會(huì)自動(dòng)指定域名栅炒。通常是不需要特地指定域名的掂摔,但是如果你訪問(wèn)的是金融區(qū)的服務(wù)
* 則必須手動(dòng)指定域名,例如sms的上海金融區(qū)域名: sms.ap-shanghai-fsi.tencentcloudapi.com
*/
endpoint: "sms.tencentcloudapi.com"
},
},
})
/* 請(qǐng)求參數(shù)赢赊,根據(jù)調(diào)用的接口和實(shí)際情況乙漓,可以進(jìn)一步設(shè)置請(qǐng)求參數(shù)
* 屬性可能是基本類型,也可能引用了另一個(gè)數(shù)據(jù)結(jié)構(gòu)
* 推薦使用IDE進(jìn)行開(kāi)發(fā)释移,可以方便的跳轉(zhuǎn)查閱各個(gè)接口和數(shù)據(jù)結(jié)構(gòu)的文檔說(shuō)明 */
const params = {
/* 短信應(yīng)用ID: 短信SdkAppid在 [短信控制臺(tái)] 添加應(yīng)用后生成的實(shí)際SdkAppid叭披,示例如1400006666 */
SmsSdkAppid:process.env.SMS_SDKAPPID,
/* 短信簽名內(nèi)容: 使用 UTF-8 編碼,必須填寫(xiě)已審核通過(guò)的簽名秀鞭,簽名信息可登錄 [短信控制臺(tái)] 查看 */
Sign:process.env.SMS_SIGN,
//'process.env.SMS_SIGN',
/* 短信碼號(hào)擴(kuò)展號(hào): 默認(rèn)未開(kāi)通趋观,如需開(kāi)通請(qǐng)聯(lián)系 [sms helper] */
ExtendCode: "",
/* 國(guó)際/港澳臺(tái)短信 senderid: 國(guó)內(nèi)短信填空扛禽,默認(rèn)未開(kāi)通锋边,如需開(kāi)通請(qǐng)聯(lián)系 [sms helper] */
SenderId: "",
/* 用戶的 session 內(nèi)容: 可以攜帶用戶側(cè) ID 等上下文信息皱坛,server 會(huì)原樣返回 */
SessionContext: "",
/* 下發(fā)手機(jī)號(hào)碼,采用 e.164 標(biāo)準(zhǔn)豆巨,+[國(guó)家或地區(qū)碼][手機(jī)號(hào)]
* 示例如:+8613711112222剩辟, 其中前面有一個(gè)+號(hào) ,86為國(guó)家碼往扔,13711112222為手機(jī)號(hào)贩猎,最多不要超過(guò)200個(gè)手機(jī)號(hào)*/
PhoneNumberSet: ["+86" + phone],
/* 模板 ID: 必須填寫(xiě)已審核通過(guò)的模板 ID。模板ID可登錄 [短信控制臺(tái)] 查看 */
TemplateID: templateId,
/* 模板參數(shù): 若無(wú)模板參數(shù)萍膛,則設(shè)置為空*/
TemplateParamSet: templateParamSet,
}
// 通過(guò)client對(duì)象調(diào)用想要訪問(wèn)的接口吭服,需要傳入請(qǐng)求對(duì)象以及響應(yīng)回調(diào)函數(shù)
return client.SendSms(params);
}
return sendSms(event.phone, event.templateId, event.templateParamSet);
}
其中,需要配置4個(gè)環(huán)境變量蝗罗,在小程序開(kāi)發(fā)工具中選擇云函數(shù)艇棕,選擇版本與配置,高級(jí)配置里設(shè)置如下四個(gè)環(huán)境變量串塑。
- SECRETID
- SECRETKEY
- SMS_SDKAPPI
- SMS_SIGN沼琉。
方法接受三個(gè)輸入?yún)?shù) - phone,電話號(hào)碼
- templateId桩匪,短信模板ID
- templateParamSet,短信模板參數(shù)打瘪,數(shù)組
注意事項(xiàng)
本地調(diào)試版本貌似環(huán)境變量不能生效,必須上傳云函數(shù)傻昙,而且需要上傳所有文件環(huán)境變量才能生效闺骚,這上面花了很多時(shí)間一直沒(méi)通過(guò)。
測(cè)試SMS云函數(shù)
在小程序里測(cè)試短信云函數(shù)是否生效妆档,代碼如下:
wx.cloud.callFunction({
name: 'sms',
data: {
phone: "136********",
templateId: "859976",
templateParamSet: ["123456"]
}
}).then(res=>{
console.log(res);
})
寫(xiě)在最后
上面就介紹完了在小程序中使用騰訊云sms來(lái)發(fā)送短信的整個(gè)流程僻爽,開(kāi)發(fā)不困難,關(guān)鍵是搞清小程序上線流程过吻,以及短信功能涉及到的一些關(guān)鍵必填信息的獲取进泼,需要涉及到騰訊云的CAM,短信sms,以及小程序這三個(gè)功能纤虽。環(huán)境變量的設(shè)置遇到來(lái)一些小坑乳绕,一直在本地云調(diào)試,所以沒(méi)能獲取到環(huán)境變量值逼纸,剛開(kāi)始上傳云函數(shù)洋措,也沒(méi)有選中上傳所有文件,導(dǎo)致也不能獲取到環(huán)境變量杰刽。