短信发送
编辑教程短信发送
结合一些第三方提供的短信API,使用云开发的云函数也能发送短信验证码、系统和活动通知等,下面以腾讯云的短信服务为例。
腾讯云有针对Node环境的tencentcloud-sdk-nodejs模块,集成了腾讯云多项服务,除了短信之外,腾讯云服务的几乎所有能力都会集成在这个开发者工具套件(SDK)里。
开通腾讯云短信服务
开通短信服务
登录短信控制台,这里的账号不限于小程序的账号,其他账号也可以;也不限于是个人账号还是企业账号,不过账号需要进行实名认证,个人认证用户只能发送短信验证码、短信通知等,不能用于营销短信;企业认证用户可以发送短信验证码、短信通知、营销短信等。如果账号已经认证,直接申请短信服务就可以开通了。
创建应用
创建应用可用于个性化管理短信发送任务,例如设置不同的发送频率和发送超量提醒等。打开左侧菜单里的应用管理-应用列表,点击创建应用,应用名称可以为你的小程序名称+云开发,便于区分管理。创建后,会有一个SDKAppID,这个之后会用到。
建签名和正文模板
国内短信由签名+正文组成,签名符号为【】,发送短信内容时必须带签名。所以要发送短信,需要申请短信签名和正文模板,两者都通过审核后,就可以开始发送短信了。
(1)创建签名
打开左侧菜单里的国内短信-签名管理,点击创建签名,创建完签名后,这个签名内容之后会用到。
签名用途:选择【自用(签名为本账号实名认证的公司、网站、产品名等)】。 | |
---|---|
签名类型:选择【小程序】。 | |
签名内容:输入公司名或小程序名或产品名称 | |
证明类型:选择小程序设置页面截图,然后上传小程序设置页面截图,可以参考案例; |
(2)创建正文模板
打开左侧菜单里的国内短信-正文模板管理,点击创建正文模板,创建完模板后,会有一个模板ID,这个之后会用到,也要记住你模板的变量位置。
模板名称,建议带有明确目的的名称,比如“注册通知”、“购买成功反馈”等; | |
---|---|
短信类型:选择【普通短信】 | |
短信内容:比如“您正在申请手机注册,验证码为:{1},{2}分钟内有效!”,这里的{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过来的,我们只需要改里面相应的参数即可,比如
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());
});
}
选择支付方式:
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间