结合一些第三方提供的短信API,使用云开发的云函数也能发送短信验证码、系统和活动通知等,下面以腾讯云的短信服务为例。腾讯云有针对Node环境的tencentcloud-sdk-nodejs模块,集成了腾讯云多项服务,除了短信之外,腾讯云服务的几乎所有能力都会集成在这个开发者工具套件(SDK)里。
登录短信控制台,这里的账号不限于小程序的账号,其他账号也可以;也不限于是个人账号还是企业账号,不过账号需要进行实名认证,个人认证用户只能发送短信验证码、短信通知等,不能用于营销短信;企业认证用户可以发送短信验证码、短信通知、营销短信等。如果账号已经认证,直接申请短信服务就可以开通了。
创建应用可用于个性化管理短信发送任务,例如设置不同的发送频率和发送超量提醒等。打开左侧菜单里的应用管理-应用列表,点击创建应用,应用名称可以为你的小程序名称+云开发,便于区分管理。创建后,会有一个SDKAppID
,这个之后会用到。
国内短信由签名+正文组成,签名符号为【】,发送短信内容时必须带签名。所以要发送短信,需要申请短信签名和正文模板,两者都通过审核后,就可以开始发送短信了。
(1)创建签名
打开左侧菜单里的国内短信-签名管理,点击创建签名,创建完签名后,这个签名内容
之后会用到。
(2)创建正文模板
打开左侧菜单里的国内短信-正文模板管理,点击创建正文模板,创建完模板后,会有一个模板ID
,这个之后会用到,也要记住你模板的变量位置。
{1}
和{2}
是你要在代码里传入的变量,变量的编码必须是从{1}开始,传入变量时也要按照顺序传入在使用云API之前,用户首先需要在腾讯云控制台上申请安全凭证(API密钥),安全凭证包括 SecretID 和 SecretKey。打开腾讯云访问密钥的API密钥管理,点击新建密钥,就可以创建密钥了,创建之后,就可以看到 SecretID
和SecretKey
,这两个之后会用到。
API 密钥是构建腾讯云 API 请求的重要凭证,使用腾讯云 API 可以操作你这个账号名下的所有腾讯云资源,一定要妥善保管和定期更新,不要分享给别人或者上传到网络上。
使用开发者工具新建一个云函数,比如sms,打开云函数目录中的 package.json ,新增最新版tencentcloud-sdk-nodejs 依赖,右键云函数目录选择在终端中打开输入命令npm install安装依赖::
"dependencies": {
"wx-server-sdk":"latest",
"tencentcloud-sdk-nodejs":"latest"
}
然后再在云函数的目录下面新建一个config文件夹,在config文件夹里创建一个config.js,云函数的目录结构如下图所示:
sms // 云函数目录
├── config //config文件夹
│ └── config.js //config.js文件
└── index.js
└── config.json
└── package.json
然后再在config.js里输入以下代码,填入获取安全凭证里的SecretID 和 SecretKey:
module.exports = {
secretId: 'wxda99ae45313257046',
secretKey: 'josgjwoijgowjgjsogjo',
}
再在index.js里输入以下代码,代码的内容比较多,但是基本都是从腾讯云短信的技术文档里直接Copy过来的,我们只需要改里面相应的参数即可,比如
SDKAppID
,签名内容
,ID
,修改完以上内容之后,就可以触发该云函数给相应的手机号发送短信了:
const cloud = require('wx-server-sdk')
const tencentcloud = require("tencentcloud-sdk-nodejs");
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
const config= require("./config/config.js")
const {secretId,secretKey} = config
exports.main = async (event, context) => {
const smsClient = tencentcloud.sms.v20190711.Client;
const models = tencentcloud.sms.v20190711.Models;
const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;
let cred = new Credential(secretId,secretKey)
let httpProfile = new HttpProfile();
httpProfile.reqMethod = "POST";
httpProfile.reqTimeout = 30;
httpProfile.endpoint = "sms.tencentcloudapi.com";
let clientProfile = new ClientProfile();
clientProfile.signMethod = "HmacSHA256";
clientProfile.httpProfile = httpProfile;
let client = new smsClient(cred, "ap-guangzhou", clientProfile);
let req = new models.SendSmsRequest();
req.SmsSdkAppid = "1400364657";
req.Sign = "HackWeek";
req.ExtendCode = "";
req.SenderId = "";
req.SessionContext = "";
req.PhoneNumberSet = ["+86185****3"];
req.TemplateID = "597853";
req.TemplateParamSet = ["1234","5"];
client.SendSms(req, function (err, response) {
if (err) {
console.log(err);
return;
}
console.log(response.to_json_string());
});
}