准备工作
1.注册腾讯云,开通腾讯云短信服务(1>租一个域名 2>买/租一个服务器 3>服务器上放你的代码 4>你的域名跟服务器公网的地址进行解析 5>访问域名进入程序里面)
https://cloud.tencent.com/product/sms
2.创建应用
SDK AppID = 1400449667
3.申请签名
需要注意的是,申请签名,用公众号(我是用的个人订阅号,换一个邮箱注册就行)
ID = 325617 内容:喜欢土豆的马铃薯
4.申请模板
ID = 776071 名称:登录验证
5.申请腾讯云API https://console.cloud.tencent.com/cam/capi
保存记录 SecretId 和 SecretKey
-----------------------------------------------------------------------------------------------------------------------------------------
上述步骤完成后,调用相关接口,完成短信发送(SDK,腾讯帮你写好的工具)
安装SDK python: pip3 install tencentcloud-sdk-python
相关代码 https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/sms/v20190711/SendSms.py
class MessageView(APIView): def get(self,request,*args,**kwargs): # 1.获取微信小程序,发过来的手机号 phone = request.query_params print(phone) # 2.第二次手机格式校验(防止网页传输过来的数据,不经过微信小程序的校验 http://127.0.0.1:8000/api/message/?phone=123) # # 第一种校验:正则匹配 # import re # if not re.match(r"^(1[3|4|5|6|7|8|9])\d{9}$",phone): # # 当手机格式不匹配,返回错误信息,后续操作不再进行 # return Response("手机号格式错误...") # # 第二种校验:序列化器serializers ser = MessageSerializer(data=phone) # 当前获取到的手机号传到序列化器 if not ser.is_valid(): # 序列化器内部会进行校验,当不符合规则时 print("手机号验证未通过,格式错误...") return Response({"status":False,"message":"手机号格式错误"}) # 验证通过,保存手机号 phone = ser.validated_data.get("phone") print("手机号验证通过:",phone) # 3.生成随机验证码 import random random_code = random.randint(1000,9999) # 4.验证码发送到手机上,购买服务器进行发送短信:腾讯云 # tencent.send_message(phone,random_code) """ 准备工作 4.1 注册腾讯云,开通腾讯云短信服务(1>租一个域名 2>买/租一个服务器 3>服务器上放你的代码 4>你的域名跟服务器公网的地址进行解析 5>访问域名进入程序里面) 4.2 创建应用 SDK AppID = 1400449667 4.3 申请签名 个人:公众号 ID = 325617 内容:喜欢土豆的马铃薯 4.4 申请模板 ID = 776071 名称:登录验证 4.5 申请腾讯云API https://console.cloud.tencent.com/cam/capi SecretId = AKIDzlk9qGmSAblmoa8Olsra9SUG8aqqLGhM SecretKey = Z4K8gybz7zggRt6244nFRjlX7SWKsSnJ """ # 上述步骤完成后,调用相关接口,完成短信发送(SDK,腾讯帮你写好的工具) # 安装SDK python: pip3 install tencentcloud-sdk-python # 相关代码 https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/sms/v20190711/SendSms.py from tencentcloud.common import credential from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.sms.v20190711 import sms_client, models from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile try: # 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 # 这里我没有传我自己的,需要自己输入 cred = credential.Credential("secretId", "secretKey") # 实例化要请求产品(以sms为例)的client对象 client = sms_client.SmsClient(cred, "ap-guangzhou") # 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 req = models.SendSmsRequest() # 短信应用ID: 短信SdkAppid在 [短信控制台] 添加应用后生成的实际SdkAppid req.SmsSdkAppid = "1400449667" # 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 req.Sign = "喜欢土豆的马铃薯" # 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号] # 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 req.PhoneNumberSet = ["+8615798017910"] # 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 req.TemplateID = "776071" # 模板参数: 若无模板参数,则设置为空 req.TemplateParamSet = [str(random_code)] # 通过client对象调用DescribeInstances方法发起请求。注意请求方法名与请求对象是对应的。返回的resp是一个DescribeInstancesResponse类的实例,与请求对象对应。 resp = client.SendSms(req) # 输出json格式的字符串回包 print(resp.to_json_string(indent=2)) except TencentCloudSDKException as err: print(err) except Exception as e: print(e) # 5.把验证码和手机号保留(30秒过期) # # # 5.1 搭建redis服务器(腾讯云Redis)这里选择自己搭建 # import redis # # redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。 # # 默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。 # pool = redis.ConnectionPool(host=\'127.0.0.1\', port=8000) # conn = redis.Redis(connection_pool=pool) # conn.set(phone, random_code,ex=30) # conn.get(\'foo\') # # 5.2 django中方便使用redis的模块 django-redis(cmd pip3 install django-redis) from django_redis import get_redis_connection conn = get_redis_connection() conn.set(phone,random_code,ex=30) print("正在发送验证码...") return Response({"status":True,"message":"验证码发送成功"})
需要注意:
搭建redis服务器(腾讯云Redis)这里选择自己搭建
# 配置,Redis缓存(依赖:pip3 install django-redis) CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:8000", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }
请发表评论