django項目gitee倉庫位址:https://gitee.com/YANGYUE0205/meiduo_project.git
一, 總體邏輯分析。
要點:
1.為了避免使用者使用圖形驗證碼惡意測試,我們提取了圖形驗證碼後,立即删除Redis中的圖形驗證碼。
2.儲存短信驗證碼是為注冊做準備的。
3.Django不具備發送短信的功能,是以我們借助第三方的容聯雲通訊短信平台來幫助我們發送短信驗證碼。
二,容聯雲平台的注冊登入和使用。
容聯雲官網:官網 https://www.yuntongxun.com/
- 注冊
- 登入
- 重要資訊(三個,等會有用)。
- 建立應用。 5.申請上線。
6.進行認證。
(需要公司資訊)
7.認證成功。 8.添加測試号碼。 9.設定短信模闆10,容聯雲通訊短信SDK測試
10.1,模闆短信SDK下載下傳
https://www.yuntongxun.com/doc/ready/demo/1_4_1_2.html
10.2,模闆短信SDK使用說明
http://doc.yuntongxun.com/p/5a533e0c3b8496dd00dce08c
10.3,內建模闆短信SDK
CCPRestSDK.py:由容聯雲通訊開發者編寫的官方SDK檔案,包括發送模闆短信的方法
ccp_sms.py:調用發送模闆短信的方法
10.4,模闆短信SDK測試
ccp_sms.py檔案中
# -*- coding:utf-8 -*-
from libs.yuntongxun.CCPRestSDK import REST
# 說明:主賬号,登陸雲通訊網站後,可在"控制台-應用"中看到開發者主賬号ACCOUNT SID
_accountSid = '8aaf070862181ad5016236f3bcc811d5'
# 說明:主賬号Token,登陸雲通訊網站後,可在控制台-應用中看到開發者主賬号AUTH TOKEN
_accountToken = '4e831592bd464663b0de944df13f16ef'
# 請使用管理控制台首頁的APPID或自己建立應用的APPID
_appId = '8aaf070868747811016883f12ef3062c'
# 說明:請求位址,生産環境配置成app.cloopen.com
_serverIP = 'sandboxapp.cloopen.com'
# 說明:請求端口 ,生産環境為8883
_serverPort = "8883"
# 說明:REST API版本号保持不變
_softVersion = '2013-12-26'
# 雲通訊官方提供的發送短信代碼執行個體
# 發送模闆短信
# @param to 手機号碼
# @param datas 内容資料 格式為數組 例如:{'12','34'},如不需替換請填 ''
# @param $tempId 模闆Id
def sendTemplateSMS(to, datas, tempId):
# 初始化REST SDK
rest = REST(_serverIP, _serverPort, _softVersion)
rest.setAccount(_accountSid, _accountToken)
rest.setAppId(_appId)
result = rest.sendTemplateSMS(to, datas, tempId)
print(result)
for k, v in result.items():
if k == 'templateSMS':
for k, s in v.items():
print('%s:%s' % (k, s))
else:
print('%s:%s' % (k, v))
if __name__ == '__main__':
# 注意: 測試的短信模闆編号為1
sendTemplateSMS('18310820688', ['123456', 5], 1)
10.5, 模闆短信SDK傳回結果說明
{
'statusCode': '000000', // 狀态碼。'000000'表示成功,反之,失敗
'templateSMS':
{
'smsMessageSid': 'b5768b09e5bc4a369ed35c444c13a1eb', // 短信唯一辨別符
'dateCreated': '20190125185207' // 短信發送時間
}
}
11, 封裝發送短信單例類
11.1 ,封裝發送短信單例類
class CCP(object):
"""發送短信的單例類"""
def __new__(cls, *args, **kwargs):
# 判斷是否存在類屬性_instance,_instance是類CCP的唯一對象,即單例
if not hasattr(CCP, "_instance"):
cls._instance = super(CCP, cls).__new__(cls, *args, **kwargs)
cls._instance.rest = REST(_serverIP, _serverPort, _softVersion)
cls._instance.rest.setAccount(_accountSid, _accountToken)
cls._instance.rest.setAppId(_appId)
return cls._instance
11.2, 封裝發送短信單例方法
def send_template_sms(self, to, datas, temp_id):
"""
發送模闆短信單例方法
:param to: 注冊手機号
:param datas: 模闆短信内容資料,格式為清單,例如:['123456', 5],如不需替換請填 ''
:param temp_id: 模闆編号,預設免費提供id為1的模闆
:return: 發短信結果
"""
result = self.rest.sendTemplateSMS(to, datas, temp_id)
if result.get("statusCode") == "000000":
# 傳回0,表示發送短信成功
return 0
else:
# 傳回-1,表示發送失敗
return -1
11.3, 測試單例類發送模闆短信結果
if __name__ == '__main__':
# 注意: 測試的短信模闆編号為1
CCP().send_template_sms('18310820688', ['123456', 5], 1)
三,短信驗證碼後端接口設計。
-
短信驗證碼後端接口設計
請求方式
2.請求參數 4.短信驗證碼後端接口定義。
class SMSCodeView(View):
"""短信驗證碼"""
def get(self, reqeust, mobile):
"""
:param reqeust: 請求對象
:param mobile: 手機号
:return: JSON
"""
pass
5.短信驗證碼後端邏輯實作
from libs.yuntongxun.sms import CCP
from django import http
import random
import logging
logger = logging.getLogger('django')
class SMSCodeView(View):
"""短信驗證碼"""
def get(self, reqeust, mobile):
"""
:param reqeust: 請求對象
:param mobile: 手機号
:return: JSON
"""
# 接收參數
image_code_client = reqeust.GET.get('image_code')
uuid = reqeust.GET.get('image_code_id')
# 校驗參數
if not all([image_code_client, uuid]):
return http.JsonResponse({'code': 400, 'errmsg': '缺少必傳參數'})
# 建立連接配接到redis的對象
redis_conn = get_redis_connection('code')
# 提取圖形驗證碼
image_code_server = redis_conn.get('img_%s' % uuid)
if image_code_server is None:
# 圖形驗證碼過期或者不存在
return http.JsonResponse({'code': 400, 'errmsg': '圖形驗證碼失效'})
# 删除圖形驗證碼,避免惡意測試圖形驗證碼
try:
redis_conn.delete('img_%s' % uuid)
except Exception as e:
logger.error(e)
# 對比圖形驗證碼
image_code_server = image_code_server.decode() # bytes轉字元串
if image_code_client.lower() != image_code_server.lower(): # 轉小寫後比較
return http.JsonResponse({'code': 400, 'errmsg': '輸入圖形驗證碼有誤'})
# 生成短信驗證碼:生成6位數驗證碼
sms_code = '%06d' % random.randint(0, 999999)
logger.info(sms_code)
# 儲存短信驗證碼
redis_conn.setex('sms_%s' % mobile, 300, sms_code)
# 發送短信驗證碼
CCP().send_template_sms(mobile,[sms_code, 5], 1)
# 響應結果
return http.JsonResponse({'code': 0, 'errmsg': '發送短信成功'})