社区/学习指南/微信云开发高级教程

短信发送

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

11.9.1 开通腾讯云短信服务

1、开通短信服务

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

2、创建应用

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

3、创建签名和正文模板

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

1、创建签名

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

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

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

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

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

2、创建正文模板

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

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

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

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

3、获取安全凭证

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

API 密钥是构建腾讯云 API 请求的重要凭证,使用腾讯云 API 可以操作你这个账号名下的所有腾讯云资源,一定要妥善保管和定期更新,不要分享给别人或者上传到网络上。

11.9.2 使用云函数发送短信

使用开发者工具新建一个云函数,比如 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());
  });
};

本文出自 李东bbsky