App、网站中常有手机验证码等需求,例如手机号注册,手机号登录,密码找回等。
手机注册短信验证码流程大致如下
1. 用户填写手机号,点击获取验证码,发送手机号给服务端
2. 服务端生成随机验证码,调用腾讯云短信接口向用户手机发送短信。
3. 腾讯云短信向用户发送短信,短信包含验证码。
4. 用户收到带有验证码的短信,在注册界面输入验证码并提交注册。
5. 服务端收到用户提交的验证码,核对无误,则允许注册。
现在尝试用腾讯云短信做下测试。
一 注册登录
先进行账号注册,腾讯提供了免费100条短信,足够用于测试了。
腾讯云:https://console.cloud.tencent.com/smsv2
如果大量短信需求,则需要购买。价格如下:
二 创建签名
注册完成后,点击快速入门,这里会一步步引导你完成整个流程。首先创建短信签名。
因为我没有个人的app和小程序,只有网站,所以选择签名类型"网站",并填写对应的其它信息。
三 创建正文模板
腾讯提供了标准模板可供选择,也可以自定义模块。我这里选择了一个标准模板 "您正在申请手机注册..."
四 等待审核
等待审核,一般很快,几分钟我就过了。如果等了很久没过,可以点击列表右边的"催审"。
签名审核通过:
正文审核通过:
五 创建NodeJS服务器
需要下载腾讯云短信的nodejs版本SDK才能发送短信。具体参看:https://cloud.tencent.com/document/product/382/43197
我在本地搭建nodejs服务端,入口文件index.js,复制腾讯的发送短信代码到本地服务端index.js中,代码可以在 https://cloud.tencent.com/document/product/382/43197 找到。
index.js:
const tencentcloud = require("tencentcloud-sdk-nodejs") // 导入对应产品模块的client models。 const smsClient = tencentcloud.sms.v20210111.Client /* 实例化要请求产品(以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: 短信SmsSdkAppId在 [短信控制台] 添加应用后生成的实际SmsSdkAppId,示例如1400006666 */ SmsSdkAppId: "1400787878", /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */ SignName: "xxx", /* 短信码号扩展号: 默认未开通,如需开通请联系 [sms helper] */ ExtendCode: "", /* 国际/港澳台短信 senderid: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */ SenderId: "", /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ SessionContext: "", /* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号] * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/ PhoneNumberSet: ["+8613711112222"], /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */ TemplateId: "449739", /* 模板参数: 若无模板参数,则设置为空*/ TemplateParamSet: ["666"], } // 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数 client.SendSms(params, function (err, response) { // 请求异常返回,打印异常信息 if (err) { console.log(err) return } // 请求正常返回,打印response对象 console.log(response) })
上面所需添加的信息均可以在管理台找到
1 secretId和secretKey
API密钥在 https://console.cloud.tencent.com/cam/capi ,需要新建一个。
2 SmsSdkAppId
应用ID在应用列表中
3 短信签名和模板
可在签名管理和正文模板管理中找到短信签名和模板的ID等。
4 模板参数
我选择模板有两个变量{1}和{2}
填写模板变量如下,短信内容将会显示 "验证码为:12345,5分钟内有效"
TemplateParamSet: ["12345","5"],
六 运行发送短信
在控制台运行index.js文件,输入 "node index.js"。
可以看到打印的response显示OK
手机上收到了腾讯发送的短信,到此测试成功。