准備工作
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": "密碼", } } }



