发送短信在小程序中是一个常见功能,比如注册账号时发送验证码,发送短信通知等等,这些都需要用到云短信功能。使用腾讯云的SMS来发送短信功能开发比较简单,但申请流程还是比较麻烦,整理下来避免大家少走弯路。
第一步,上线小程序
访问腾讯的SMS控制台的快速开始页面
给出了短信功能的快速入门的步骤,第一步是创建短信签名,这一步需要使用小程序来申请短信签名,因此需要上线小程序,并提供小程序的相关信息才能申请短信签名。上线小程序特别注意小程序的类目设置,如果这个设置不正确,审核就不能通过,吐槽一下小程序审核,一般审核大概1天左右的时间,而且每次都是一项一项的审核不通过,不会一次把所有不通过的项全部列出,一次解决多痛快,因此这样审核导致周期会比较长,我的审核了5天才成功上线。第一次因为小程序里开发了一个日历控件,没有选择工具-》日历,第二次因为小程序里有个报名功能,没有选择工具-》预约报名,第三次因为小程序里有个旅游信息查询,没有选择旅游类目,第四次需要我提供一个测试账号。因此,服务类目特别重要,设置方法如下,登录你的小程序控制台
- 选择设置,在右边的面板中选择基本设置,服务类目,按照你的小程序的功能选择相应的服务类目,最多只能有5个服务类目。比如你的小程序里有旅游功能,需要选择旅游,然后选择子类目,还比如你的小程序里有日历功能,需要选择工具类目里的日历子类目,因此一定要检查你的小程序的相关功能,来选择正确的服务类目。
- 提供一个测试账号和密码,审核人员会运行你的小程序来进行审核。
-
如果有审核不明白的地方,可以在线人工服务,响应也比较及时。
创建短信签名
小程序上线完成后,就可以使用小程序的设置来申请短信签名,如下图,需要提供小程序的截图,也就是小程序的控制台的基本设置页面的截图。签名内容是小程序的全程或者简称,这个内容在发送短信时需要用到。
创建短信正文模板
短信签名完成后,就可以创建正文模板,系统也提供了一些内置的标准模板,也可以创建自定义模板,如
{1}为您的登录验证码,请于{2}分钟内填写。如非本人操作,请忽略本短信。(其中{1}、{2}为可自定义的内容,须从1开始连续编号,如{1}、{2}等)
其中{1},{2}这些在发送短信时需要作为模板参数传入。
等待审核
短信模板审核提交后,就只需要等待审核,这个过程很快就能完成。
发送短信
网上也有很多的方法来发送短信,但因为sms的版本也在不断变化,因此请求参数也是不断的在变化,肯定会出现版本兼容性的问题,因此大部分都不能正常使用。因此,尽量使用腾讯提供的SDK是最省事的办法,而且有sdk的版本信息。代码片段可以参考git上的源码。
随着腾讯云SMS的升级,sms的sdk client应该也会跟着升级。在发送短信中,需要以下几个关键配置。
SecretId和SecretKey
这两项是必填项,腾讯云账户密钥对secretId,secretKey。获取这两项的方法是访问云控制平台的CAM
这两项值涉及到你的账号安全,因此需要妥善保管,防止外泄,因此采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
短信应用Id
短信应用ID,访问短息控制台
短信SdkAppid在 [短信控制台] 添加应用后生成的实际SdkAppid,如下图。
短信签名内容
短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录控制台查看。
模板ID
模板 ID,必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看。
模板参数
模板参数,若无模板参数,则设置为空。模板参数即创建模板时候的{1}{2}等内容。
电话号码
这个就不用过多描述了,接受短线的电话号码,中国大陆电话需要有+86。
发送短信源码
整个短信发送的代码片段如下,接受三个参数,templateId,phone,templateParamSet
// 云函数入口文件
const cloud = require('wx-server-sdk')
const tencentcloud = require('tencentcloud-sdk-nodejs');
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
async function sendSms(phone, templateId, templateParamSet) {
const smsClient = tencentcloud.sms.v20190711.Client
console.log(process.env)
/* 实例化要请求产品(以sms为例)的client对象 */
const client = new smsClient({
credential: {
/* 必填:腾讯云账户密钥对secretId,secretKey。
* 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
* 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
* 以免泄露密钥对危及你的财产安全。
* CAM密匙查询: https://console.cloud.tencent.com/cam/capi */
secretId: process.env.SECRETID,
secretKey: process.env.SECRETKEY,
},
/* 必填:地域信息,可以直接填写字符串ap-guangzhou,或者引用预设的常量 */
region: "ap-guangzhou",
/* 非必填:
* 客户端配置对象,可以指定超时时间等配置 */
profile: {
/* SDK默认用TC3-HMAC-SHA256进行签名,非必要请不要修改这个字段 */
signMethod: "HmacSHA256",
httpProfile: {
/* SDK默认使用POST方法。
* 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */
reqMethod: "POST",
/* SDK有默认的超时时间,非必要请不要进行调整
* 如有需要请在代码中查阅以获取最新的默认值 */
reqTimeout: 30,
/**
* SDK会自动指定域名。通常是不需要特地指定域名的,但是如果你访问的是金融区的服务
* 则必须手动指定域名,例如sms的上海金融区域名: sms.ap-shanghai-fsi.tencentcloudapi.com
*/
endpoint: "sms.tencentcloudapi.com"
},
},
})
/* 请求参数,根据调用的接口和实际情况,可以进一步设置请求参数
* 属性可能是基本类型,也可能引用了另一个数据结构
* 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */
const params = {
/* 短信应用ID: 短信SdkAppid在 [短信控制台] 添加应用后生成的实际SdkAppid,示例如1400006666 */
SmsSdkAppid:process.env.SMS_SDKAPPID,
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */
Sign:process.env.SMS_SIGN,
//'process.env.SMS_SIGN',
/* 短信码号扩展号: 默认未开通,如需开通请联系 [sms helper] */
ExtendCode: "",
/* 国际/港澳台短信 senderid: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */
SenderId: "",
/* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
SessionContext: "",
/* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
* 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
PhoneNumberSet: ["+86" + phone],
/* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
TemplateID: templateId,
/* 模板参数: 若无模板参数,则设置为空*/
TemplateParamSet: templateParamSet,
}
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
return client.SendSms(params);
}
return sendSms(event.phone, event.templateId, event.templateParamSet);
}
其中,需要配置4个环境变量,在小程序开发工具中选择云函数,选择版本与配置,高级配置里设置如下四个环境变量。
- SECRETID
- SECRETKEY
- SMS_SDKAPPI
- SMS_SIGN。
方法接受三个输入参数 - phone,电话号码
- templateId,短信模板ID
- templateParamSet,短信模板参数,数组
注意事项
本地调试版本貌似环境变量不能生效,必须上传云函数,而且需要上传所有文件环境变量才能生效,这上面花了很多时间一直没通过。
测试SMS云函数
在小程序里测试短信云函数是否生效,代码如下:
wx.cloud.callFunction({
name: 'sms',
data: {
phone: "136********",
templateId: "859976",
templateParamSet: ["123456"]
}
}).then(res=>{
console.log(res);
})
写在最后
上面就介绍完了在小程序中使用腾讯云sms来发送短信的整个流程,开发不困难,关键是搞清小程序上线流程,以及短信功能涉及到的一些关键必填信息的获取,需要涉及到腾讯云的CAM,短信sms,以及小程序这三个功能。环境变量的设置遇到来一些小坑,一直在本地云调试,所以没能获取到环境变量值,刚开始上传云函数,也没有选中上传所有文件,导致也不能获取到环境变量。