-

结合一些第三方提供的短信API,使用云开发的云函数也能发送短信验证码、系统和活动通知等,下面以腾讯云的短信服务为例。腾讯云有针对Node环境的tencentcloud-sdk-nodejs模块,集成了腾讯云多项服务,除了短信之外,腾讯云服务的几乎所有能力都会集成在这个开发者工具套件(SDK)里。

一、开通腾讯云短信服务

1、开通短信服务

登录短信控制台,这里的账号不限于小程序的账号,其他账号也可以;也不限于是个人账号还是企业账号,不过账号需要进行实名认证,个人认证用户只能发送短信验证码、短信通知等,不能用于营销短信;企业认证用户可以发送短信验证码、短信通知、营销短信等。如果账号已经认证,直接申请短信服务就可以开通了。

2、创建应用

创建应用可用于个性化管理短信发送任务,例如设置不同的发送频率和发送超量提醒等。打开左侧菜单里的应用管理-应用列表,点击创建应用,应用名称可以为你的小程序名称+云开发,便于区分管理。创建后,会有一个SDKAppID,这个之后会用到。

3、建签名和正文模板

国内短信由签名+正文组成,签名符号为【】,发送短信内容时必须带签名。所以要发送短信,需要申请短信签名正文模板,两者都通过审核后,就可以开始发送短信了。

(1)创建签名

打开左侧菜单里的国内短信-签名管理,点击创建签名,创建完签名后,这个签名内容之后会用到。

  • 签名用途:选择【自用(签名为本账号实名认证的公司、网站、产品名等)】。

  • 签名类型:选择【小程序】。

  • 签名内容:输入公司名或小程序名或产品名称

  • 证明类型:选择小程序设置页面截图,然后上传小程序设置页面截图,可以参考案例;

(2)创建正文模板

打开左侧菜单里的国内短信-正文模板管理,点击创建正文模板,创建完模板后,会有一个模板ID,这个之后会用到,也要记住你模板的变量位置。

  • 模板名称,建议带有明确目的的名称,比如“注册通知”、“购买成功反馈”等;

  • 短信类型:选择【普通短信】

  • 短信内容:比如“您正在申请手机注册,验证码为:{1},{2}分钟内有效!”,这里的{1}{2}是你要在代码里传入的变量,变量的编码必须是从{1}开始,传入变量时也要按照顺序传入

3、获取安全凭证

在使用云API之前,用户首先需要在腾讯云控制台上申请安全凭证(API密钥),安全凭证包括 SecretID 和 SecretKey。打开腾讯云访问密钥的API密钥管理,点击新建密钥,就可以创建密钥了,创建之后,就可以看到 SecretIDSecretKey,这两个之后会用到。

>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过来的,我们只需要改里面相应的参数即可,比如

  • req.SmsSdkAppid为创建应用环节里的SDKAppID

  • req.Sign为创建签名里的签名内容

  • req.TemplateID为创建正文模板环节里的模板ID

  • req.TemplateParamSet为模板内容里的变量,值为数组,有多少个变量就往数组里填多少个字符串

  • req.PhoneNumberSet为用户的手机号码,测试时可以填你自己的

修改完以上内容之后,就可以触发该云函数给相应的手机号发送短信了:

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());
  });
}