短信验证

需选择一家可靠的短信服务提供商,服务提供商通常提供API来集成短信功能到您的应用程序中,不同的提供商提供不同SDK或库。

后端实现

  1. 安装相应的短信SDK或库,以便与短信服务提供商的API进行通信。

  2. 创建一个后端API,接收来自前端的手机号码和其他必要的注册信息。

  3. 在后端API中,生成一个随机验证码并将其保存到数据库或缓存中,同时将手机号码和验证码发送到短信服务提供商的API。

  4. 验证短信服务提供商的响应,确认短信已成功发送。

协商接口

  1. 请求需校验信息(图形/数据库已有信息),响应成功后才可进行下一步
  2. 信息正确,请求提交手机号,后端生成发送短信的随机验证码,存储于缓存/数据库,调用短信提供商发送短信API携带手机号&验证码,提供商响应服务器成功与否,再响应客户端短信是否发送
  3. 客户端收到短信,填入所需信息,提交请求携带验证码&所需信息,后端对比验证码成功,才可完成注册/信息插入,响应结果

前后端交互

  1. 在注册页面或组件中,添加一个用于输入用户收到的验证码的字段。
  2. 通过AJAX或AXIOS方式,将用户输入的手机号码和验证码包含在请求中,向后端API发送注册请求。
  3. 用户提交表单后,后端API将提交的验证码与后端存储的验证码进行比较。
  4. 如果验证码匹配,则调用提供商API;否则,显示相应的错误消息。
  5. 后端调用API,API中先接收到服务商的响应,后发送给前端短信是否已发送响应,根据成功或失败的情况向用户显示适当的消息。

注意事项

  • 确保您的短信服务提供商具有适当的安全措施,以防止滥用和恶意行为。
  • 对于敏感操作(如密码重置等),应采用额外的安全措施,如双因素身份验证。

腾讯

参考:

GitHub-TencentCloud:tencentcloud-sdk-python

腾讯云-文档中心:短信

腾讯云-云API:API Explorer

开通步骤详见:国内短信快速入门

依赖

1
2
3
# 猜测此依赖是用来做安全、认证相关
pip install --upgrade tencentcloud-sdk-python
pip install tencentcloud-sdk-python-sms

发送短信

进入腾讯云-云API:API Explorer短信,根据表单提示填入短信套餐信息、模板等信息,可自动生成各种代码的实现、params内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.sms.v20210111 import sms_client, models
try:
# 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
# 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
# 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential("SecretId", "SecretKey")
httpProfile = HttpProfile()
# 腾讯短信接口域名
httpProfile.endpoint = "sms.tencentcloudapi.com"
# 相当于一个客户端
clientProfile = ClientProfile()
# 将接口配置放入客户端
clientProfile.httpProfile = httpProfile
# 认证信息、短信服务器位置、客户端放入短信发送的实例
client = sms_client.SmsClient(cred, "ap-beijing", clientProfile)

# 实例化请求对象
req = models.SendSmsRequest()
params = {
"PhoneNumberSet": [mobile],
"SmsSdkAppId": "1400111111",
"SignName": "***科技有限公司",
"TemplateId": "1811111",
"TemplateParamSet": [code, time],
"SessionContext": "UserID"
}
# 请求参数转化Json后放入请求对象
req.from_json_string(json.dumps(params))

# 请求对象放入短信发送实例
resp = client.SendSms(req)
# 输出json格式的响应
print(resp.to_json_string())

except TencentCloudSDKException as err:
print(err)

参考代码

创建一个发送短信的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pythonCopy codedef send_sms(mobile, code):
app_id = 'YOUR_APP_ID' # 替换为您的腾讯云AppID
app_key = 'YOUR_APP_KEY' # 替换为您的腾讯云AppKey
template_id = 123456 # 替换为您在腾讯云短信模板中创建的模板ID

sender = SmsSingleSender(app_id, app_key)
params = [code, '5'] # 替换为您的短信模板参数,这里示例为验证码和有效时间

try:
result = sender.send_with_param(86, mobile, template_id, params)
if result.result == 0:
return True # 短信发送成功
else:
return False # 短信发送失败
except Exception as e:
print(str(e))
return False # 发送异常,短信发送失败

创建一个API端点,用于接收手机号码并发送短信:

1
2
3
4
5
6
7
8
9
10
11
12
13
pythonCopy codefrom django.http import JsonResponse

def send_sms_code(request):
mobile = request.GET.get('mobile') # 通过GET参数获取手机号码
code = generate_random_code() # 生成随机验证码

# 调用发送短信函数
if send_sms(mobile, code):
# 短信发送成功,将验证码保存到数据库或缓存中,用于后续验证
save_code_to_database(mobile, code)
return JsonResponse({'success': True, 'message': '短信发送成功'})
else:
return JsonResponse({'success': False, 'message': '短信发送失败'})